String类如何工作?我经历了很多帖子,但我没有找到答案。
String str="ABC";
上面的语句是否会调用构造函数?
public String(char[] paramArrayOfChar)
如果是,它怎么称呼它?我们正在使用赋值运算符。它如何调用String类构造函数。
答案 0 :(得分:1)
这比那复杂一点。字符串存储在Java中的全局存储中,因此构造函数可能被调用一次,JVM决定将哪些字符串“实习”(放入全局存储),如果再次声明“ABC”,则它可能是同一个实例。
答案 1 :(得分:1)
上面的语句是否会调用构造函数?
不,它没有。如果字符串池不包含String str = new String("ABC")
,则看起来像"ABC"
。当您再次编写"ABC"
时,它将使用内部存储中的旧版本。如果Pool已经包含了这个值 - 没有创建的对象,只需从存储中提取这个值(当我们谈论使用String
这样的"ABC"
文字时就是这样,但是当我们正在使用new
关键字,行为是略 different)。
"ABC"
已定义对象,其内部包含value
char[] {'A','B','C'}
。我可以假定 "ABC"
实例的某个地方被创建为new String(new char[]{'A','B','C'})
(规范中没有说明这一点)。
答案 2 :(得分:1)
编辑当我们想要使用String str1 = "Hello World";
时,我们正在使用String Interning(就像许多编程语言一样使用它 ):
在计算机科学中,字符串实习是一种只存储一个的方法 每个不同字符串值的副本,必须是不可变的。实习 字符串使一些字符串处理任务更多时间或 节省空间的代价是在字符串需要更多时间 创建或实习。不同的值存储在字符串实习生中 池。
JVM 首先检查String constant pool
,如果该字符串不存在,它创建一个新的String对象,怎么做?在intern()
对象上调用String
方法时,如果字符串为<,则池中的此String对象将查找字符串包含 em>找到然后返回池中的字符串。否则,将此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]
答案 3 :(得分:1)
因为字符串是编程中常见且重要的部分,所以Java增加了特殊功能 支持语言语法中的多个字符串操作。这些操作 包括从字符串文字中自动创建新的String实例,连接 使用+运算符将多个String对象以及其他数据类型转换为a 字符串表示。有明确的方法可用于执行所有这些功能, 但Java会自动为程序员提供便利并增加清晰度
字符串文字
前面的示例演示了如何从数组中显式创建String实例 使用new运算符的字符。但是,有一种更简单的方法可以使用a 字符串字面量。对于程序中的每个字符串文字,Java会自动构造一个String 宾语。因此,您可以使用字符串文字初始化String对象。例如,以下内容 代码片段创建两个等效字符串:
char chars[] = { 'a', 'b', 'c' };
String s1 = new String(chars);
String s2 = "abc"; // use string literal
因为为每个字符串文字创建了一个String对象,所以可以使用字符串文字 您可以使用String对象。例如,您可以直接在带引号的字符串上调用方法,就像它是对象引用一样,如下面的语句所示。它调用长度() 字符串“abc”上的方法。正如所料,它打印“3”。 的System.out.println(&#34; ABC&#34;。长度());
答案 4 :(得分:-1)
在字符串文字部分中,Java Language Specification未指定字符串的创建方式。它仅指定使用String.intern()
实习。
因此,无法保证实现如何创建字符串。