首先要明白一个概念,java中new出来的对象存放在堆里。专门针对字符串有一个“String pool”。s1 = new String("we are students")这一句,首先会在“String pool”里查找有没有we are students这个字符串,结果没找到,就创建一个。然后通过这个字符串构建一个String对象存放这这个字符串的引用,放在堆里。s2=new String("we are students")这里又会去“String pool”里查找有没有we are students这个字符串,结果找到了,那么在“String pool”里不会继续创建这个字符串,但是应为使用了new所以会在堆里又创建一个String对象的引用,指向这个字符串。String里的equals方法比较的是字面量,所以返回true。“==”比较的是内存地址所以的false。后面的两个赋值则是同样的概念,都是指向“String pool”里的“how are you”这个字符串。所以都是true