s1和s2都不是通过new关键字创建的字符串,所以这两个引用指向的字符串都不是堆中的,而是在常量池中的“aaa”,编译器优化后,它们是指向同一个在常量池中的“aaa”.
s3是通过控制台读取的输入,next()方法返回一个String,这个String应该是在堆中根据输入的字符串创建的。因此s1和s2的引用是相同的,s3的引用指向的是堆根据输入新创建的字符串,和s1,s2指向的常量池中的肯定不同。String类重写了equals()方法,比较的是字符串中每个字符是否相同,s1和s3每个字符都相同,因此返回true.
s3是通过控制台读取的输入,next()方法返回一个String,这个String应该是在堆中根据输入的字符串创建的。因此s1和s2的引用是相同的,s3的引用指向的是堆根据输入新创建的字符串,和s1,s2指向的常量池中的肯定不同。String类重写了equals()方法,比较的是字符串中每个字符是否相同,s1和s3每个字符都相同,因此返回true.
s3是通过键盘输入的,相当于是new出来的,这个时候是直接分配一个新的内存地址,虽然还是指向"abc",但是这个"abc"和上面那个"abc"不在同一个地址。
至于equals方法,只判断指向的内容是否相同,不判断地址是否相同。
s3是通过控制台读取的输入,next()方法返回一个String,这个String应该是在堆中根据输入的字符串创建的。因此s1和s2的引用是相同的,s3的引用指向的是堆根据输入新创建的字符串,和s1,s2指向的常量池中的肯定不同。String类重写了equals()方法,比较的是字符串中每个字符是否相同,s1和s3每个字符都相同,因此返回true.