字符串常量池
new一个对象的时候会优先在常量池去寻找这个对象是否存在,如果存在直接返回常量池的地址。
ps:如果一直new对象会导致常量池OOM
堆
如果常量池里面没有找到该对象,那么会在堆中创建一个新的对象,并且复制一份放到常量池中。这里就创建了"2"个对象
对象创建过程
- String a = “a”; 如果常量池中有"a",则不生成对象,直接返回常量池的引用,没有则常量池中生成
- String a = “a”+“b”+“c”; 编译期间会编译等同于String a = “abc”,产生两个对象
- String a = new String(“a”); =左边是不会产生对象的,=作用是将a的地址指向生成的对象。new指令执行的时候,先去看常量池中是否有该变量a,有就只生成一个对象放在堆中(复制常量池中的a),如果没有就要先生成常量池,在复制放到堆
- String a = new String(“a”+“b”+“c”); 编译期间会编译等同于String a = new String(“abc”)
equals 和 == 问题
首先要明白 == 比较的是地址,基本数据类型比较的是值, equals比较的是值
- ==比较的是地址, String a = “a”, b = "a"的地址是常量池中,String c = new String(“a”)的地址是堆中,所以a == b,返回true, a == c 返回false
- equals 比较的是值,只要是值相同都返回true
喜欢就点个赞吧 w(゚Д゚)w