首先介绍一下字符串池(String Pool):
在Java编程语言中,字符串池是一个特殊的内存区域,属于Java堆(Heap)的一部分。它是Java虚拟机(JVM)为了优化字符串操作而提供的一个特性。即保存所有java字符串内容,每个字符串仅出现一次。
记住字符串池是堆的一部分。
在Java中,String s = "12";
和 String s = new String("12");
的区别主要体现在内存分配和字符串池(String Pool)的使用上。
-
String s = "12";
:- 这条语句会在字符串池中查找是否已经有一个值为"12"的字符串对象。
- 如果字符串池中已经存在值为"12"的字符串对象,则直接将这个对象的引用赋给变量
s
。不再在堆中创建新的对象。 - 如果字符串池中没有值为"12"的字符串对象,则会在字符串池中创建一个新的字符串对象,并将它的引用赋给变量
s
。不再在堆中创建新的对象。
-
String s = new String("12");
:- 这条语句首先会在字符串池中查找是否已经有一个值为"12"的字符串对象。
- 无论是否找到,它都会在堆(Heap)内存中创建一个新的字符串对象,并把这个新对象的引用赋给变量
s
。 - 如果字符串池中已经存在值为"12"的字符串对象,那么这个新创建的对象与池中的对象内容相同,但是它们是两个不同的对象。
- 如果字符串池中不存在值为"12"的字符串对象,那么就在字符串池中也创建一个对象保存。内容相同,但是它们是不同的对象。