String str1 = new String("hello");//(1)
String str2 = new String("hello");//(2)
System.out.println(str1 == str2);//输出false
String str3 = "hello";(3)
String str4 = "hello";(4)
System.out.println(str3 == str4);//输出true

1.第(1)、(2)声明了两个String对象,所以(str1 == str2)时输出false。

2.第(3)、(4)声明方式与上面的不一样,当(3)执行完后,系统会创建一个内容为“hello“的String的实例,并将这个实例缓存起来,当(4)执行时,系统会先检查缓存中是否有一个String实例的内容与这个"hello“直接量相同,如果相同系统会直接让这个引用指向这个String实例,所以(str3 == str4)输出true,其实(3)和(4)执行后指向的是同一个String对象。