特殊的String
2016-04-12 21:03
260 查看
首先, String 不是基本数据类型,基本类型就8种,它应属于特殊的引用类型
下面我们看一段代码:
String s1=”china”;
String s2=s1;
s2=”France”;
System.out.println(s1);//china
System.out.println(s2);//France,二者不相互影响,所以是特殊的引用类型
java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。
String str1=”abc”;
String str2=”abc”;
String str3=new String(“abc”);
System.out.println(str1==str2);
System.out.println(str3==str2);
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
输出:true
false
true
true
equal与==的区别:equal比较的是两个对象的实际内容,而==比较的是对象的引用,基本数据类型的比较只能使用==,而没有equal方法
equal的默认行为时比较引用,大多数Java类库都实现了equal方法,以便用来比较对象的内容,而非对象的引用,所以如果自己定义了一个类,想要比较对象内容,则需覆盖equal方法,否则使用equal 和==是相同的效果
String str=”hello”+”java”+”world”;该语句只创建了一个字符串对象,因为str的值在编译时就能确定,JVm在编译时计算出str的值为 hello java world,然后将该字符串直接量放入字符串池中,并让str指向它
对于java程序中的字符直接量,JVM会使用一个字符串池来保存它们,当第一次使用时,JVM会将它放入字符串池进行缓存,一般情况下,他们不会被垃圾回收,当程序需要再次使用该字符串时,无需重新创建一个新的字符串,而是直接让引用变量指向字符串池中已有的字符串。如果一个字符串链接表达式的值可以在编译时确定下来,那么JVM会在编译时计算该字符串变量的值,并让它指向字符串池中对应到字符串。 final变量的值在编译时就能确定。但如果程序中使用了变量,或者调用了方法,也即是在编译时无法确定某一个字符串变量的值,则无法利用JVM的字符串池。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
String ss3 = new String(“china”);通过new产生一个字符串时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。
String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。
下面我们看一段代码:
String s1=”china”;
String s2=s1;
s2=”France”;
System.out.println(s1);//china
System.out.println(s2);//France,二者不相互影响,所以是特殊的引用类型
java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。
String str1=”abc”;
String str2=”abc”;
String str3=new String(“abc”);
System.out.println(str1==str2);
System.out.println(str3==str2);
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
输出:true
false
true
true
equal与==的区别:equal比较的是两个对象的实际内容,而==比较的是对象的引用,基本数据类型的比较只能使用==,而没有equal方法
equal的默认行为时比较引用,大多数Java类库都实现了equal方法,以便用来比较对象的内容,而非对象的引用,所以如果自己定义了一个类,想要比较对象内容,则需覆盖equal方法,否则使用equal 和==是相同的效果
String str=”hello”+”java”+”world”;该语句只创建了一个字符串对象,因为str的值在编译时就能确定,JVm在编译时计算出str的值为 hello java world,然后将该字符串直接量放入字符串池中,并让str指向它
对于java程序中的字符直接量,JVM会使用一个字符串池来保存它们,当第一次使用时,JVM会将它放入字符串池进行缓存,一般情况下,他们不会被垃圾回收,当程序需要再次使用该字符串时,无需重新创建一个新的字符串,而是直接让引用变量指向字符串池中已有的字符串。如果一个字符串链接表达式的值可以在编译时确定下来,那么JVM会在编译时计算该字符串变量的值,并让它指向字符串池中对应到字符串。 final变量的值在编译时就能确定。但如果程序中使用了变量,或者调用了方法,也即是在编译时无法确定某一个字符串变量的值,则无法利用JVM的字符串池。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
String ss3 = new String(“china”);通过new产生一个字符串时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。
String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- JavaScript中字符串(string)转json的2种方法
- C#中string用法实例详解
- C#中的DataSet、string、DataTable、对象转换成Json的实现代码
- Javascript实现Array和String互转换的方法