https://www.cnblogs.com/aspirant/p/9193112.html
在做面试题的时候这是一个常考的基础知识点。看了上面这篇文章之后,恍然大悟。转载过来,同时加上自己的一些总结:
1. jvm虚拟机中大体分为如下几个部分:线程私有的(虚拟机栈、Native栈、PC),线程共享的(方法区、堆等),方法区中包含一个常量池。
2. 通过 string str = “abc” 创建字符串,“abc"是常量,去常量池中寻找是否存在,如果存在,则将地址存放到栈中的str,如果不存在,在常量池中开辟一块空间保存"abc”,并把地址存放到栈中的str。
3. 通过 string str = new String(“abc”) 创建字符串,先在堆中创建一块区域并把地址交给str,“abc"是常量,去常量池中寻找是否存在,如果存在,则将地址存放到堆空间中new的区域,如果不存在,在常量池中开辟一块空间保存"abc”,并把地址存放到堆空间中new的区域。
4. 通过2,3可知单纯的比较"=="结果肯定是false。