String 内存到底是怎么分配的?例如:
String str1 = "string";str1中的内容"string"是存储在栈中呢还是堆中?String str1 = new String("string");这个str1 的对象应该是存储在堆中。String str1 = "java";
String str2 = "ja";
String str3 = "va";
String str4 = str2 + str3;System.out.print(str1 == str4);
输出的为什么是false?
String str1 = "string";str1中的内容"string"是存储在栈中呢还是堆中?String str1 = new String("string");这个str1 的对象应该是存储在堆中。String str1 = "java";
String str2 = "ja";
String str3 = "va";
String str4 = str2 + str3;System.out.print(str1 == str4);
输出的为什么是false?
如果你是想比较它们引用的内容即字符串是否相同应用用,str1.equals(str4)
str4 = str2 + str3;
那么在堆中应该先搜索有没有"string",因为前面已经有了 str1 = "string" 所以堆中应该有string, 并且str4也指向str1存的那个相同的string啊, 那应该是true啊。
我的理解肯定是有误, 但是到底怎么错了?
这里的是字符串常量,是存在于data segment中。String str1 = new String("string");
这里是一个对象,存在于堆中。==比较的是内存地址,显然不同。下面的同理可得。
还有,你说什么现在堆中找找有没有“string”,不知道你是说“string”字符串常量,还是对象,不管怎么样,都是不能这么说的。前者,字符串常量不再堆中,后者,就算两个内容一样的对象,那也是两个对象,除非你直接用 = 把引用复制给另一个。
要想输出true,可以用str1.equals(str2).也可以直接加一条语句str1=str1.intern();将该字条串扣留。
String str2 = "ja";
String str3 = "va";
String str4 = str2+str3;
System.out.println(str1==str4); // 1:false
str4 = str4.intern();
System.out.println(str1==str4); // 2:truejvm载入java类时,有个常量池,这些String常量str[1-3]都存放在常量池中,str4是由str1与str2相加得到一个新的常量,也存放到了常量池中。==对比的引用的是不是一个对象,1的情况下,str1和str4分别指向的是2个String对象
而String.intern()方法,是需要查看常量池是否已经存在这个字符串对象,存在返回这个字符串对象的引用,不存在则把这个新的字符串对象放到常量池中返回这个新放入常量池中字符串的引用,故2返回true将java的执行者jvm看做一个程序,这些对象的空间是由jvm给它们申请的,那么这些对象的空间应该是用jvm new的,这样的话这些对象就应该存放在属于jvm的堆中