示例:


class StringDemo
{
public static void main(String[] args){
String s = "hello";
String s1 = new String("hello");

System.out.println(s==s1); // false
System.out.println(s.equals(s1)); // true
}
}

由代码输出结果我们可以看到两种方法创建的字符串对象地址值不同,内容相同。

String s 是直接赋值的字符串对象,由于“hello”是常量,那么hello会出现在方法区的常量池中,如果有就直接赋值给s,如果没有先创建再把地址给栈内存中的 s 。s1 是构造方法new出来的,那么会先在堆内存创建个对象,然后指向常量池中的hello,最后再把堆中的对象地址给栈内存中的s1。其在内存中的关系用下图表示:

java语言基础(53)——String 字面值对象和构造方法创建对象的区别_字符串

所以我们就知道为何其地址值不同,而却内容相同了。