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

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

作者 | 平头哥的技术博文

责编 | 屠敏

出品 | CSDN 博客

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

String 对象的实现

String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对String对象的实现进行优化,以便提升String对象的性能,看下面这张图,一起了解一下String对象的优化过程。

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

1. 在 Java6 以及之前的版本中

String对象是对 char 数组进行了封装实现的对象,主要有四个成员变量:char 数组、偏移量 offset、字符数量 count、哈希值 hash。

String对象是通过 offset 和 count 两个属性来定位 char 数组,获取字符串。这么做可以高效、快速地共享数组对象,同时节省内存空间,但这种方式很有可能会导致内存泄漏。

2. 从 Java7 版本开始到 Java8 版本

从 Java7 版本开始,Java 对String类做了一些改变。String类中不再有 offset 和 count 两个变量了。这样的好处是String对象占用的内存稍微少了些,同时 String.substring 方法也不再共享 char,从而解决了使用该方法可能导致的内存泄漏问题。

3. 从 Java9 版本开始

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

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

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

String 对象的创建方式

1、通过字符串常量的方式

String str= “pingtouge”的形式,使用这种形式创建字符串时, JVM 会在字符串常量池中先检查是否存在该对象,如果存在,返回该对象的引用地址,如果不存在,则在字符串常量池中创建该字符串对象并且返回引用。使用这种方式创建的好处是:避免了相同值的字符串重复创建,节约了内存。

2、String构造函数的方式

String str = new String(“pingtouge”)的形式,使用这种方式创建字符串对象过程就比较复杂,分成两个阶段,首先在编译时,字符串pingtouge会被加入到常量结构中,类加载时候就会在常量池中创建该字符串。然后就是在调用new时,JVM 将会调用String的构造函数,同时引用常量池中的pingtouge字符串,在堆内存中创建一个String对象并且返回堆中的引用地址。

了创载网解了String对象两种创建方创载网式,我们来分析一下下面这段代码,加深我们对这两种方式的理解,下面这段代码片中,str是否等于str1呢?

 String str = "p创载网ingtouge";String str1 = new String("pingtouge");system.out.println(str==str1)

我们逐一来分析这几行代码,首先从String str = “pingtouge”开始,这里使用了字符串常量的方式创建字符串对象,在创建pingtouge字符串对象时,JVM会去常量池中查找是否存在该字符串,这里的答案肯定是没有的,所以JVM将会在常量池中创建该字符串对象并且返回对象的地址引用,所以str指向的是pingtouge字符串对象在常量池中的地址引用。

然后是String str1 = new String(“pingtouge”)这行代码,这里使用的是构造函数的方式创建字符串对象,根据我们上面对构造函数方式创建字符串对象的理解,str1得到的应该是堆中pingtouge字符串的引用地址。由于str指向的是pingtouge字符串对象在常量池中的地址引用而str1指向的是堆中pingtouge字符串的引用地址,所以str肯定不等于str1。

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

String 对象的不可变性

从我们知道String对象的那一刻起,我想大家都知道了String对象是不可变的。那它不可变是怎么做到的呢?Java 这么做能带来哪些好处?我们一起来简单的探讨一下,先来看看String 对象的一段源码:

public final class Stringimplements java.io.Serializable, Comparable
  
    
  
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

相关推荐