String字符串建立与存储机制

Java内存能够粗略的区分为堆内存(Heap)和栈内存(Stack),堆中存放的是对象实例,而栈中存放的则是方法调用过程当中的局部变量或引用等。微信

在Java语言中,字符串的生命与初始化有以下两种方式:spa

 1. 初始化 code

String str1 = "helloJava";对象

String str2 = "helloJava"; blog

在JVM中存在存在一个字符串常量池,用于存放特定的字符串对象,能够被共享使用。str1和str2引用的是同一个字符串常量池里的对象。当建立一个字符串常量时,如"helloJava",首先会在常量池中查找是否已经存在相同的字符串(经过string.equals()方法判断,若是返回true,则认为是相同的字符串),若是存在,则直接获取其引用,不须要从新建立对象;若不存在,则会首先建立这个对象,而后把它加入到字符串常量池中,再将它的引用返回。内存

因为String类是不可变类,一旦建立好后就不能修改,所以String对象能够被共享并且不会致使程序混乱。字符串

 2. 建立对象 string

String str3 = new String("helloJava"); 
String str4 = new String("helloJava"); 编译

str3和str4是经过new关键字建立的两个不一样的对象,在内存中的地址是不一样的。 class

String str3 = new String("helloJava")这条语句能够分解为两个过程:

1)建立对象

即new String("helloJava"),调用String类的构造方法,传入一个字符串常量,等价于两个操做:"helloJava"和new String()。若是字符串常量池中不存在"helloJava",则会建立常量"helloJava",并添加到常量池中;若存在则不建立,new String()会在堆中建立一个新的对象,所以str3和str4分贝指向堆中不一样的对象。
2)赋值

即String str3 = ,将一个String类型的引用赋值给str3变量,这个过程不会建立新的对象。

 

 举例说明 :

String s1 = "helloJava";//把"helloJava"放入常量池中,编译时产生
String s2 = "hello"+"Java";//把"hello"和"Java"转换成"helloJava"放入常量池中
String s3 = "helloJava";//引用常量池中的对象,不会从新建立对象
String s4 = new String("helloJava");//运行时把"helloJava"放入堆里面,在堆中建立一个对象
String s5 = new String("helloJava");//在堆中又建立一个新的对象

 

 存储图例 :

 

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

  ▼微信扫一扫下图↓↓↓二维码关注

 

相关文章
相关标签/搜索