原因:
因为 “==” 比较的是jvm中的内存地址是否相同,s1,s2是直接从方法区中的常量池中找到了“abc”内存地址1,将s1,s2引用变量都指向内存地址1,所以为true。而s3,s4是创建了对象的,向堆内存中申请了相应的地址3和地址4,因此为false。
i1,i2不相等与i3,i4相等的原因如上String比较的原因一致。而i5,i6不相等是因为,在方法区的常量池中,不存在128。因此i5,i6无法指向同一内存地址。翻看Integer的源码可知:
因为 “==” 比较的是jvm中的内存地址是否相同,s1,s2是直接从方法区中的常量池中找到了“abc”内存地址1,将s1,s2引用变量都指向内存地址1,所以为true。而s3,s4是创建了对象的,向堆内存中申请了相应的地址3和地址4,因此为false。
i1,i2不相等与i3,i4相等的原因如上String比较的原因一致。而i5,i6不相等是因为,在方法区的常量池中,不存在128。因此i5,i6无法指向同一内存地址。翻看Integer的源码可知: