1.String s = new String("11ab"); 首先,肯定会在堆中创建一个新的对象,在常量池中查找是否有值为"11ab"的字符串对象,如果有,则将此对象的value属性赋给新创建的字符串对象,如果没有,先新建一个字符串对象放入常量池,再将它的value属性赋给s。内存中必然会存在s和常量池中的对象,他两的value值都为"11ab",但不是同一个对象。 2.String s = new String("11") + new String("ab"); 参照1,常量池会有value属性值为"11"和"ab"的两个对象,相加,在堆中创建s,将"11"和"ab"这两个常量池对象的value copy给s的value,但此时没有在常量池中加入"11ab",只是会存在"11"和"ab"。 3.intern:和楼上的解释一样 看看你的代码: 1. String str2 = new String("str")+new String("01"); //常量池:"str"和"01" str2.intern(); //常量池:"str","01"和"str01"(这个对象就是str2指向的对象) String str1 = "str01"; //判断常量池发现有"str01",直接将其赋给str1,即将str2指向的对象赋给了str1 System.out.println(str2==str1); 2. String str2 = new String("str01"); //常量池:"str01"(但是str2指向的不是这个对象) str2.intern(); //常量池:"str01" String str1 = "str01"; //判断常量池有,将常量池的"str01"赋给str1 System.out.println(str2==str1);
intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。。否则,在常量池中加入该对象,然后 返回引用。 str2.intern()调用后常量池中就存在“str01”了,你再声明一个String str1 = "str01",此时str1的地址就指向常量池中的那个。。 此时str2 == str1 值为true 但是第一行用new的话,会在堆中产生对象,再返回引用。。此时声明str1才会在常量池产生"str01",两个地址不同,此时此时str2 == str1 值为false
50,528
社区成员
85,607
社区内容
加载中
试试用AI创作助手写篇文章吧