您当前的位置:首页 > 生活热点

string是什么意思(string函数的用法)

时间:2022-03-11 18:02:44

作者|平头哥的技术博文

编辑|屠敏

出品| CSDN博客

字符串对象的实现

字符串对象是Java中使用频率最高的对象之一,因此Java公司也在不断优化字符串对象的实现,以提高字符串对象的性能。看下图了解一下String对象的优化过程。

1.在Java6和早期版本中

String对象是封装char数组的对象。它主要有四个成员变量:char数组、offset偏移量、字符数和hash值hash。

String对象是通过offset和count属性定位char数组获得字符串。这样可以高效快速的共享数组对象,同时节省内存空,但是这种方法很可能会导致内存泄漏。

2.从Java7版本到Java8版本

从Java版本7开始,Java对String类做了一些修改。String类中不再有offset和count变量。这种方法的好处是String对象占用的内存略少,同时String.substring方法不再共享char,解决了使用这种方法可能带来的内存泄漏问题。

3.从Java9版本开始

将字符数组改为字节数组。为什么需要这么做?我们知道char是两个字节。如果用来存储一个字节的字符有点浪费,为了节省空,Java公司把它改成了一个字节来存储字符串。这样,当存储一个字节的字符时,避免了浪费。

在Java9中,维护了一个新的属性编码器,它是编码格式的标识。在计算字符串长度或调用indexOf函数时,需要根据该字段判断如何计算字符串长度。默认情况下,Coder属性有0和1两个值,0表示Latin-1(单字节编码),1表示UTF-16编码。如果字符串判断字符串只包含Latin-1,则coder属性的值为0,否则为1。

如何创建一个字符串对象

1.通过字符串常量

String str= "pingtouge "形式。使用这种形式创建字符串时,JVM会先检查对象是否存在于字符串常量池中,如果存在,则返回对象的引用地址;如果不存在,在字符串常量池中创建字符串对象并返回引用。这种方法的优点是:避免重复创建相同值的字符串,节省内存。

2.字符串构造方法:红豆博客

String = new string(“ping touge”),这种方式创建string对象的过程比较复杂,分为两个阶段。首先,字符串pingtouge将在编译时被添加到constant结构中,它将在加载类时在constant池中创建。然后在调用new时,JVM会调用String的构造函数,引用常量池中的pingtouge字符串,在堆内存中创建一个String对象并返回堆中的引用地址。

理解了创建字符串对象两种方式,让我们分析下面的代码来加深对这两种方式的理解。以下代码中str等于str1吗?

String str = "pingtouge";String str1 = new String("pingtouge");system.out.println(str==str1)

让我们从String str = "pingtouge "开始,逐一分析这几行代码。这里,我们使用字符串常量来创建字符串对象。在创建pingtouge字符串对象时,JVM会去常量池查找字符串是否存在。这里的答案肯定是否定的,所以JVM会在常量池中创建string对象,并返回对象的地址引用,所以str指的是常量池中pingtouge string对象的地址引用。

然后是String str1 = new String("pingtoug红豆博客e "),使用构造函数创建一个String对象。按照我们对构造函数创建string对象的理解,str1应该会得到pingtouge string在堆中的引用地址。由于str指的是pingto红豆博客的uge字符串对象在常量池中的地址引用,str1指的是pingtouge字符串在堆中的引用地址,所以str肯定不等于str1。

字符串对象的不变性

从我们知道字符串对象的那一刻起,我想每个人都知道字符串对象是不可变的。那怎么是不可改变的呢?Java能带来什么好处?下面我们一起来简单讨论一下。让我们先来看看String对象的源代码:

public final class Stringimplements java.io.Serializable, Comparable

字符串 对象 常量 创建 引用

最新文章