不一样。
1、对象类型不同
经过编译后可以看到
String str1 = “hello” 是一个String对象
String str2 = new String(“hello”) 是一个 String类 对象
2、存储位置不同
String str1 = “hello” 存放 Java 虚拟机中常量池中。
String str2 = new String(“hello”) 则存放于堆内存中。
3、调用方式不同
String str1 = "hello";
String str2 = "hello";
从上图可以看出,当 str1 被创建后,会在常量池中创建一个对象。
若 str2 的值和 str1 相同时,会引用 str1 在常量池中创建的对象。
若 str2 的值和 str1 不同时,会在常量池中创建新的对象。
String str1 = new String("hello");
String str2 = new String("hello");
从上图可以看出,当 str1 被创建后,会在堆里面创建一个对象,并且也会在常量池中常见对象。
若 str2 的值和 str1 相同时,也会在堆中创建一个对象,然后引用 str1 在常量池中创建的对象。
若 str2 的值和 str1 不同时,会在堆中创建一个对象,然后再常量池中创建对应的对象。
4、扩展知识
String a = "abc";
String b = "ab";
String c = "ab" + "c";
String d = b + "c";
System.out.println("a==c:" + (a == c)); // a==c:true
System.out.println("a==d:" + (a == d)); // a==d:false
因为 a 已经再变量池中创建 abc 对象,然后 c 为 “ab” + “c” 即 “abc" ,所以会引用 a 创建的变量池中的变量,
所以 a == b 为 true。而 b = “ab” 执行后会再变量池中产生信变量,然后 d 即为 b 对象加上 “c”,从本质上属
于引用类型,而 == 不能比较引用类型。