字符串内容相同⽽地址值不同,创建字符串内存地址的引⽤1.String类(特殊的类)java.lang.String
表⽰字符串,本质是⼀个char[]数组
//public String(String original) 构造⽅法
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
字符常量池是什么意思private final char value[];
从构造⽅法源码可以看出String类型的对象调⽤的是⼀个char[]数组,
由private final修饰,被final修饰就不能做出更改。这也是字符串不可改变的原因
2.实例化String对象可以直接进⾏赋值操作
⽅式⼀:String s1=new String(“hello”);利⽤String类中的构造⽅法
⽅式⼆: String s2=“hello”;
public static void main(String[] args) {
String s1=new String("hello");
String s2="hello";
System.out.println("s1:"+s1);
System.out.println("s2:"+s2);
System.out.println(s1==s2);//false内容相同但地址值不同
//运⾏结果
s1:hello
s2:hello
false
废话不多说,直接上图。
3.字符串是常量,会保存在常量池。
注意:必须使⽤双引号包裹的字符串才是常量,会保存到常量池。
s1和s2的地址值()是不相同的,因为存储机制是不⼀样的
但我们直接使⽤双引号(" ")写出⼀个字符串时,会先在常量池查这个字符串
如果没有相同的则会在常量池开辟空间并创建字符串,如果有则会直接使⽤常量池中的字符串
4.内存存储的分配:
s1创建的对象为字符串,所以会先在元空间(Metaspace)中的常量池保存字符“hello”,⽽因为new 需要创建对象,所以会在堆内存中开辟空间(堆内存开辟的空间会在堆中有⼀个新的内存地址)并保存元空间中的“hello”内存地址值(引⽤)堆内存中的地址会传给栈中main()⾥的String s1,⽽s2会在常量池创建,
因为“hello”在元空间存在,所以s2仅仅保存的是元空间中常量池的hello内存引⽤,不会指向堆内存。
所以:
s1的内存地址引⽤ :
创建时:常量池 ->堆->s1(栈)
调⽤时:s1(栈)->堆->常量池
s2的内存指向为:
创建时:常量池->s2(栈)
调⽤时:s2(栈)->常量池
5.需要注意的是不同的jdk版本常量池的位置也会不同,本⽂以JDK8为例。
在JDK6以及之前,常量池在⽅法区
在JDK7的时候,常量池在堆内存
在JDK8的时候,常量池在元空间(⽅法区)
如有错误,请指出,我会及时更正。
三⼈⾏必有我师焉,谢谢。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论