Java语言中字符串的存储(java字符串的使用)

createh55个月前 (02-01)技术教程28

字符串是程序中使用频率最高的一种数据类型,Java为了加强程序的运行速度,因此设计了两种不同的方法来生成字符串对象。一种是调用String类的构造函数,另一种是使用“”。这两种方法产生的字符串对象在内存中存放的机制不同:

(1)在使用String构造函数定义字符串对象时,Java环境会和创建其他类型的对象一样,每次调用,都会创建一个新的对象。

(2)Java为String类型提供了缓冲池机制,当使用双引号定义对象时,Java环境首先去缓冲池寻找相同内容的字符串,如果存在就直接拿出来使用,如果不存在则创建一个新的字符串放入缓冲池中。

上面的两种机制分别对应字符串的存储形式为堆存储和常量池存储。可以看下面的例子:

另外,堆存储可以转换为常量池存储,是通过String类的intern()方法实现的。Intern方法的了解可以看JDK的描述,讲解的非常透彻:

A pool of strings, initially empty, is maintained privately by the class String.

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

It follows that for any two strings s and t, s.intern()==t.intern() is true if and only if s.equals(t) is true.

All literal strings and string-valued constant expressions are interned.

我对上面的英文进行了翻译,译文如下:

字符串常量池,初始值为空,它由类String类独自维护。

当调用intern 方法时,如果池中已经包含一个等于此String 对象的字符串(是否相等由 equals(Object)方法确定),则返回池中的字符串引用。否则,将此 String 对象添加到池中,并且返回此String 对象的引用。例如:对于任何两个字符串s和t,当且仅当s.equals(t)为true时,s.intern()==t.intern()才为true。

所有字面值字符串和字符串赋值常量表达式都是intern实现的。

最后列出下面的例子说明了堆存储和常亮池存储的区别:


写技术文章不容易,写一篇通俗易懂,雅俗共赏的技术文章更难,希望一时的热度变成长久的坚持,希望获得大家的认可。欢迎大家关注【Java人生】。关注Java,关注人生。关注Java的魅力,关注人生的多彩!

相关文章

java字符串(java字符串截取方法有哪些)

String简介String类在java.lang包下,所以使用的时候不需要导包String类代表字符串,java中所有字符串文字例如"abc",都被实现为此类的实例,也就是说,java程序中所有双引...

「Java必修课」判断String是否包含子串的四种方法及性能对比

1 简介判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇、判断日志是否有ERROR信息等。本文将介绍四种方法并进行性能测试。2 四种方法2.1 JDK原生方法Strin...

为什么Java中的String是不可变的(Immutable)

在Java中,String类型是用于表示字符串的类,而字符串则是字符序列,是Java编程中最常用的数据类型之一。String类是不可变的,这意味着一旦创建,字符串的值就不能改变,下面我们就来介绍一下为...

Java中字符串StringBuffer和StringBuilder的使用

Java中表示字符串的有三个类:String、StringBuffer和StringBuilder。其中,String的长度是不可变的,而StringBuffer和StringBuilder是长度可变...