String类是如何工作的?我看了很多帖子,但没有找到答案。
上述语句是否调用构造函数?
String str="ABC";
上述语句是否调用构造函数?
public String(char[] paramArrayOfChar)
如果是的话,它该如何称呼?我们使用赋值运算符。它如何调用String类的构造函数。
String str="ABC";
public String(char[] paramArrayOfChar)
如果是的话,它该如何称呼?我们使用赋值运算符。它如何调用String类的构造函数。
String str = new String("ABC")
。当您再次写入"ABC"
时,它将使用内部存储中的旧版本。如果池已经包含此值-没有创建对象,只是从存储中提取此值(当我们谈论使用String
字面量如"ABC"
时,这是正确的,但当我们使用new
关键字时,行为略有different)。
"ABC"
是已定义的对象,其中内部包含value
作为char[] {'A','B','C'}
。我可以假设某个地方创建了"ABC"
实例作为new String(new char[]{'A','B','C'})
(规范对此没有任何说明)。"ABC"
的值从字符串池中返回。 - Andrew Tobilkochar chars[] = { 'a', 'b', 'c' };
String s1 = new String(chars);
String s2 = "abc"; // use string literal
编辑 当我们想像这样使用它 String str1 = "Hello World";
时,我们正在使用String Interning(顺便说一下,它被许多编程语言使用):
在计算机科学中,字符串驻留是一种方法,只存储每个不同字符串值的一个副本,该值必须是不可变的。将字符串驻留使得某些字符串处理任务更加时间或空间有效,但代价是创建或驻留字符串时需要更多时间。不同的值存储在字符串内部池中。
JVM 首先检查 String constant pool
,如果字符串不存在,则会创建一个新的 String 对象,如何呢?当在 String
对象上调用 intern()
方法时,它查找此 String 对象中包含的字符串,在 池 中找到该字符串,则返回池中的字符串。否则,将该 String 对象添加到池中,并返回对该 String 对象的引用。
// s1 == s2 is false
String s1 = new String("sometext");
// s1 == s2 is true
//String s1 = new String("sometext").intern();
String s2 = s1.intern();
String s3 = "sometext";
System.out.println(s2 == s3);
abbas
的值并更改它) String str = "abbas";
Field value = str.getClass().getDeclaredField("value");
value.setAccessible(true);
char[] Value = (char[]) value.get(str);
System.out.println("Value = " + Arrays.toString(Value));
char[] newVal = new char[]{'f','t','b','h','p'};
value.set(str,newVal);
Value = (char[]) value.get(str);
System.out.println("Value = " + Arrays.toString(Value));
//Value = [a, b, b, a, s]
//Value = [f, t, b, h, p]
String str = "ABC"
只是分配了一个 引用。 - Klitos Kyriacouconst char[]
数组。 - Andrew Tobilko