String类如何在Java内部工作?

时间:2016-06-12 10:01:26

标签: java string constructor

String类如何工作?我经历了很多帖子,但我没有找到答案。

String str="ABC";

上面的语句是否会调用构造函数?

public String(char[] paramArrayOfChar)

如果是,它怎么称呼它?我们正在使用赋值运算符。它如何调用String类构造函数。

5 个答案:

答案 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()实习。

因此,无法保证实现如何创建字符串。