您的位置:首页 > 其它

特殊的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