JAVA 字符串驻留池

简介: 一切从String str = new String("abc")说起...    这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。    我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。

 一切从String str = new String("abc")说起...
    这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。
    我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。下面说明为什么创建了两个String对象。
    首先,来了解一下Java中的字符串驻留池的概念。JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:
    形式一:String str = "abc";
    形式二:"abc"
    其实,形式一和形式二都是字符串的字面常量。所以,可以这样理解,即把字符串的字面常量都放在了字符串驻留池中。对形式一来说,str其实就是引用的字符串驻留池中"abc"这个String对象。
    如果有如下的两行代码:
    String str1 = "abc";
    String str2 = "abc";
    那么,上面的两行代码创建了几个String对象?答案是一个。根据我们刚才所述,那么第一行语句将在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String对象,如果有,就直接引用,没有这在池中新建String对象。这下,就明白了为什么上面的两行语句仅仅创建了一个String对象。
    然后,让我们来看一看String str = new String("abc")。我们先不讨论到底创建了几个String对象。我们在这里,比较一下这种new的方式和上面的直接赋值方式两种创建String对象的不同,直接赋值的方式是在字符串驻留池中创建对象,但new这种方式是在堆中创建对象。即,new创建的String对象是不会放入字符串驻留池中的。如果一定要把某个通过new创建的字符串对象放入驻留池,可以使用intern()方法。如String strt = str.intern(),将把str的值放在驻留池中(当然,是在驻留池原来没有这个值对应的String对象的情况下),并返回驻留池中String对象的引用。
    现在,可以分析String str = new String("abc");创建了几个String对象了:)很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象

目录
打赏
0
0
0
0
13
分享
相关文章
|
4月前
|
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
178 83
|
4月前
|
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
127 60
|
4月前
|
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
83 26
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
122 8
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
78 6
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
119 15
|
5月前
|
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
89 4
|
6月前
|
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
69 3
|
6月前
|
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
38 2
java核心之字符串与编码
java核心之字符串与编码
38 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等