Java字符串常量存放在堆内存还是JAVA⽅法区?
JDK1.7 及之后版本的 JVM 已经将运⾏时常量池从⽅法区中移了出来,在 Java 堆(Heap)中开辟了⼀块区域存放运⾏时常量池。
JDK1.8开始,取消了Java⽅法区,取⽽代之的是位于直接内存的元空间(metaSpace)。
已知:
String A="abc";
String B="abc";
String C=new String("abc");
String D=new String("abc");
⽐较A==B是否相等?
⽐较C==D是否相等?
分析:我们知道基本数据类型(int,)这些是可以⽤==⽐较的,因为他们没有地址,只有值。
但String是类,所以⽤==⽐较的时候,判断的是地址是否相同,所以这⾥C和D是不等,他们是new出来的两个完全不同的对象,仅仅是值相等,就像是两个⼈仅仅是名字相同。
那么A==B吗?
A、B并不是通过new的⽅式创建的,所以他们的地址取决于后⾯所赋的值。Java中,普通字符串存储在常量池中,常量池⽬前位于堆内存中,所以,从赋值⽅⾯来看,此时的A==B是成⽴的,⽐较的是常量池⾥的值。
字符常量池是什么意思总结:⼀般对于对象,⽐较值是否相等的时候,都是通过覆写equals⽅法和hash⽅法来⽐较的,string⽤的频繁所以这⾥是特例,针对性的优化。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论