String str1 = "a";
String str2 = "bc";
String str3 = "a"+"bc";
String str4 = str1+str2;
System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);输出的结果将会是:
false
trueintern()方法的作用是检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。而我不明白的是:为什么str3与str4引用的不是同一个对象?
String str2 = "bc";
String str3 = "a"+"bc";
String str4 = str1+str2;
System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);输出的结果将会是:
false
trueintern()方法的作用是检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。而我不明白的是:为什么str3与str4引用的不是同一个对象?
String str4 = str1+str2;执行之后,会创建一个新的String变量(堆里的一个内存块),然后让str4指向这个新的变量。所以,一开始的str4和str3引用的不是同一个对象
String str2 = "bc";
String str3 = "a"+"bc";
String str4 = str1+str2;
System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);
str3指向常量池中的abc。str1+str2指向堆中的abc ,intern()后返回常量池中的abc的引用,也就是str3,str4都指向常量池中的abc,所以指向的是同一个对象
String str1 = "a";
String str2 = "bc";
String str3 = "a" + "bc";
String str4 = str1 + str2; System.out.println(str3 == str4);
System.out.println(str3.equals(str4)); str4 = (str1 + str2).intern(); System.out.println(str3 == str4);
第二个输出true是因为两个字符串引用的是同一个string对象。
String str2 = "bc";
String str3 = "a"+"bc";
String str4 = str1+str2;
System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);
我也不明白 str1+str2不就是abc么 abc已经在池中了 为什么str4还会和str3指向的不是同一个对象 ? 还有大家说的 String str4 = str1+str2;是在堆中创建str4. 什么情况下会在堆中创建?
String str1 = "a";
String str2 = "bc";
就是在这个时候进行的初始化(当然之前还有一些其它的,比如STATIC)str3指向一个字符串池ABC,而str4仍然指向堆中;但是在进行(str1+str2).intern();操作后,也是指向池中的ABCintern()可以查询文档
字符串字面池指的是常量池.
字符串对象的创建方式有两种如下:String s1 = new String(""); //第一种String s2 = ""; //第二种第一种始终不会入池的.第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)例:String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.String s4 = s1 + "b"; //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.例:String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.