s1和s2都不是通过new关键字创建的字符串,所以这两个引用指向的字符串都不是堆中的,而是在常量池中的“aaa”,编译器优化后,它们是指向同一个在常量池中的“aaa”.
s3是通过控制台读取的输入,next()方法返回一个String,这个String应该是在堆中根据输入的字符串创建的。因此s1和s2的引用是相同的,s3的引用指向的是堆根据输入新创建的字符串,和s1,s2指向的常量池中的肯定不同。String类重写了equals()方法,比较的是字符串中每个字符是否相同,s1和s3每个字符都相同,因此返回true.

解决方案 »

  1.   

    s1和s2不是new出来的,而且它们指向的内容一致,所以就指向了相同的内存地址,都指向"abc"。
    s3是通过键盘输入的,相当于是new出来的,这个时候是直接分配一个新的内存地址,虽然还是指向"abc",但是这个"abc"和上面那个"abc"不在同一个地址。
    至于equals方法,只判断指向的内容是否相同,不判断地址是否相同。
      

  2.   

    s1和s2都不是通过new关键字创建的字符串,所以这两个引用指向的字符串都不是堆中的,而是在常量池中的“aaa”,编译器优化后,它们是指向同一个在常量池中的“aaa”.
    s3是通过控制台读取的输入,next()方法返回一个String,这个String应该是在堆中根据输入的字符串创建的。因此s1和s2的引用是相同的,s3的引用指向的是堆根据输入新创建的字符串,和s1,s2指向的常量池中的肯定不同。String类重写了equals()方法,比较的是字符串中每个字符是否相同,s1和s3每个字符都相同,因此返回true.
      

  3.   

    你从控制台输入一个字符串相当于new String()所以s3的地址时不同的。
      

  4.   

    创建s2的时候.  Java机制肯定是先去查找内存中是否有这个字符串的内存地址,如果有则指向,没有才创建。后两个就不用说了