Java String 内部类中 private final char value[];value[] 的由来

在创建String对象时,有这种方法String s = new String("abc");

在String的源码中对应的是如下构造器:

public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

于是我查看这个value是个什么鬼:

```private final char value[];

!!怎么到这就没有了,没听说过有字符串直接调字符数组的这种写法啊,在网上搜了很多相关的文章,但是基本都忽略了这个构造器,难道这个value牵扯到底层吗?希望有知道的大佬给小白解答!

可变字符串和不可变字符串,这就是String是不可变字符串的因素所在了,当你在对String字符进行操作时,也就是对原来的字符串增加比如:a=a+b,这个a已不是以前的a了,不信你可以查下它们的内存地址

按照我的理解,首先在java 中,String 是一个类,包含char数组和hash值两个对象。
你这里用的new String是String的一个构造函数,只不过这里的new的结果产生一个新的引用,并没有新增一个常量。
无论是直接="abc",还是new String("abc")都是从常量池中获取该字符串,实际上指向的都是一个对象。比如下面的代码

public class Test {
    public static void main(String[] args) {
        String test = "abc";
        System.out.println(test);
        String s2 = new String("abc");
        System.out.println(s2);
    }
}

调用javap -c 后可以看到
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String abc
2: astore_1
3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: new #5 // class java/lang/String
13: dup
14: ldc #2 // String abc
16: invokespecial #6 // Method java/lang/String."":(Ljava/lang/String;)V
19: astore_2
20: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_2
24: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
27: return
其中第0和第14 中的ldc 指的是从常量池中加载String abc送至栈顶。