我现在正在学习Java,我读到了这个问题:什么是Java字符串实习堆栈溢出
但我阅读了其他文章,其中提供了一些我不理解的示例:
public static void main(String[] args) {
String str2 = new String("str") + new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2 == str1); //true
String s4 = new String("1");
s4.intern();
String s5 = "1";
System.out.println(s4 == s5); //false
String s = new StringBuilder("aa").append("bb").toString();
String s2 = new StringBuilder("cc").toString();
System.out.println(s.intern() == s); //true
System.out.println(s2.intern() == s2); //false
}
Java 11中的结果(在Java 8中应该相同)是:
js prettyprint-override">true
false
true
false
我不知道为什么结果不同,我想这都是真的。有人能解释一下吗?
让我们看看实习生实际做了什么(我的重点):
调用intern方法时,如果池中已经包含一个与equals(object)方法确定的字符串对象相等的字符串,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。
运行此代码时:
str2.intern();
字符串池仅包含str和01<代码>str2是不在字符串池中的“str01”,因此str2引用的对象也被添加到字符串池中。因此,当到达下一行时,由于池中已经存在str01,str1将引用与str2相同的对象。
请注意,str2==str1的原因并不是因为intern以某种方式更改了str2引用的对象。它对str2没有任何作用。字符串毕竟是不可变的。
现在我们可以理解第一个错误了。在该行中:
String s4 = new String("1");
由于字符串文字“1”
,因此将“1”
添加到字符串池中。请注意,添加到字符串池的对象与s4引用的对象不同。现在调用s4。intern(),它对s4不做任何操作,并返回字符串池中的对象。但您忽略了返回值。这就是为什么s4=s5和s4。intern()=s5。
s2的原因。实习生()!=s2要简单得多,s2所指的对象与字符串池中的“cc”不同<代码>s2。intern()应该返回字符串池中的对象,所以它当然不是同一个对象!
我最近了解了Java字符串池,有几件事我不太明白。 使用赋值操作符时,如果字符串池中不存在新字符串,则将在字符串池中创建新字符串。 当使用String构造函数时,我明白无论String池的状态如何,都将在堆中、String池之外创建一个新字符串。 我在某处读到过,即使在使用构造函数时,也在使用字符串池。它将把字符串插入到字符串池和堆中。 我没有找到任何关于这方面的进一步信息,但我想知道这是不是真的
s1和s3最终调用StringBuilder。toString,方法toString()控制一个新字符串(),然后调用该字符串。intern(),结果不同,这让我很困惑。
问题内容: 以下两段代码是否相同? 问题答案: 它们具有相同的 最终结果 ,但它们并不相同(它们将产生不同的字节码;版本实际上经过了这些步骤,生成了新的字符串对象,然后对其进行中间化)。 来自以下两个相关引号: 调用该方法时,如果池中已经包含与该方法确定的对象相等的字符串,则返回池中的字符串。否则,将此对象添加到池中,并返回对该对象的引用。 所有文字字符串和字符串值常量表达式都将被插入。 因此,
我有一个字符串a如下 我想用拆分这个字符串。所以我使用了以下代码来拆分它 获得: 需要< code>split.length: 我不明白我做错了什么。无论我使用什么正则表达式,我都得到相同的结果。此外,我无法修改字符串。 谁能帮我把作为数组长度。
来自String类的intern方法的javaDocs: 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 考虑以下用例: 有人能解释为什么为真而以下为假吗: <代码>系统。出来println(fifth==第五个.intern()) <代码
本文向大家介绍Python3.2中的字符串函数学习总结,包括了Python3.2中的字符串函数学习总结的使用技巧和注意事项,需要的朋友参考一下 Sequence Types sequence类型有六种:strings, byte sequences (bytes objects), byte arrays(bytearray objects), list, tuple, range objects