Java中String是一类个特殊的包装类,对于创建数据有两种形式: 第一种:
String s = "abc"; 先在栈中创建一个对String类的对象引用变量s, 然后去查找"abc"是否被保存在字符串常量池中, 如果没有则在栈中创建三个char型的值'a'、'b'、'c', 然后在堆中创建一个String对象object, 它的值是刚才在栈中创建的三个char型值组成的数组{'a'、'b'、'c'}, 接着这个String对象object被存放进字符串常量池, 最后将s指向这个对象的地址, 如果"abc"已经被保存在字符串常量池中, 则在字符串常量池中找到值为"abc"的对象object, 然后将s指向这个对象的地址。第一种的JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象
第二种:
String s = new String("abc"); 可以分解成两步1、String object = "abc"; 2、String s = new String(object); //第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中, //因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。第二种会全部在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象