Stinga=ABC和Stringa=newString(ABC)的区别
String str1 = "ABC"
String str2 = new String("ABC");
String str1 = "ABC"; 可能创建⼀个对象或者不创建对象。
如果"ABC" 这个字符串z在java String池中不存在,会在java String池中创建⼀个String str1= "ABC"的对象。然后把str1指向这个内存地址。之后⽤这种⽅式创建多少个值为"ABC"的字符串对象。始终只有⼀个内存地址被分配,之后都是String的copy。这种被称为‘字符串驻留’,所有的字符串都会在编译之后⾃动驻留。
String str2 = new String("ABC"); ⾄少会创建⼀个对象,也可能2个。
因为⽤到了new的关键字,肯定会在heap中创建⼀个str2的对象。它的value值是"ABC",同时如果这个字符串在string池中不存在,会在string词中创建这个string对象"ABC"。
String str1 = new String("ABC");字符串常量池存的是实例还是引用?
String str2 = new String("ABC");
System.out.println(str1.equals(str2)); // true ⽐较的值
System.out.println(str1 == str2); // false ⽐较的是内存地址。
String str3 = "ABC"
String str4 = "ABC"
String str5 = "AB"+"C";
System.out.println(str3 == str4); //true 在string池中都是⼀个内存地址被分配给str3,str4,str5
System.out.println(str3 == str5); //true
String str6 = "AB";
String str7 = str6 + "C";
System.out.println(str3 == str7); //false
str6在编译的时候已经确认为string池的对象。
str7在编译的时候不能确认,故str7是⼀个引⽤变量。
str6+"C"的过程是创建了⼀个StringBuffer对象,然后⽤StringBuffer对象执⾏append⽅法追加,最后再转成String类型,也就是str7是放在heap⾥⾯的对象,str6是放在String常量池⾥的。两个的内存地址不⼀样。故结果为false。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。