java中==与equals()方法的一个小细节的疑惑

这阵子在学java,看到==和equals()这一块就有点疑惑了,然后在CSDN也弄懂了大部分,了解了一些基本的,堆、栈之类的,也看到过一些更深入的装箱拆箱之类的,但是有一个细节没有看到过。
比如:(只写了主要的部分)

Scanner stdIn = new Scanner(System.in);
String str;
str = stdIn.nextLine();
System.out.print(str==''a'');

假如我输入的确实是a,那么结果false过程是怎么来的呢。

你想问的是 这个把?

System.out.print(str==''a'');
// str 是字符串变量,同样会在堆中创建创建一个对象,注意 与 ”a“ 创建的不是同一个。
// ”a“ 是字符串常量,它会在堆中创建一个对象,然后对应的引用存储在字符串常量池的StringTable中
// == 比较的是地址,两个对象实例不一样,自然地址也不一样

使用 == 运算符比较两个字符串是否相等通常是不正确的,因为它只比较两个字符串对象的引用地址是否相同,而不是比较它们所包含的字符是否相同。因此,在比较字符串是否相等时,应该使用 equals() 方法。

System.out.print(str.equals("a"));

==比较的是两个对象的引用,而不是值。虽然你输入的是字符a,但是它被当做一个String对象来处理,所以在内存中它有一个对应的引用。而"a"这个表达式也会被当做一个String对象来处理,因此它们不相等。

因为从控制台输入的字符串实际上是一个新的String对象,不会从堆中的字符串常亮去找有没有值为a的String对象,如果改成String string = "a", 这时候string == "a"就是true了,因为第二个字符串a会从堆中获取,获取到了就不会再new一个String对象了