创建字符串对象有两种方式
一种是通过初始化的方式创建
String str="Hello";
另一种是使用new关键字创建
String str = new String("Hello");
Java为了避免产生大量的字符串对象,设计了一个字符串池(String Pool),通过初始化方式创建的字符串对象都会存在于字符串池中,且字符串池中的字符串不会重复,以便可以被共享使用,提高存储效率。
其工作原理是:
当使用初始化的方式创建对象时,JVM会首先检查字符串池中是否存在值相等的字符串,如果存在,则不进行创建,而是直接返回字符串池中该字符串的引用地址。如果不存在,则创建该对象,并放入字符串池中,返回新创建的字符串的引用地址。
当使用new关键字创建对象时,JVM仍然首先检查字符串池中是否存在要创建的字符串,如果不存在,则在字符串池中创建一个字符串对象,然后在堆内存中继续创建一个字符串对象,返回堆对象的引用地址。如果存在,则只在堆内存中创建一个字符串对象,返回堆对象的引用地址。
字符串常量池存于堆内存中(1.8之前是方法区)。
example:
String str1 ="abc";
String str2 ="abc";
String str3 ="abc";
String str4 =new String("abc");
String str5 =new String("abc");
String str6 =new String("abc");
String str7 = new String("abc");
上面代码创建多少对象:(两个对象一个引用或者一个对象一个引用)
1、常量池中有“abc”,直接返回实例。否则,创建一个对象“abc”;
2、在堆内存创建对象new String (“abc”);
3、将对象地址赋给str7,创建一个引用。
String str8 = new String ("a"+"b");
String str9 = new String ("a")+"b";
上面代码创建多少对象:
str8:
常量池:a b ab 三个
new String(“ab”) 一个
赋给str8 引用一个
str9:
常量池 b 一个
new String("a")一个
引用一个
其他类似图解: