作者 | 平头哥的技术博文
![string是什么意思 string函数的用法](http://img.zhejianglong.com/230302/00104H236-0.jpg)
文章插图
责编 | 屠敏
出品 | CSDN 博客
String 对象的实现
String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对String对象的实现进行优化,以便提升String对象的性能,看下面这张图,一起了解一下String对象的优化过程 。
1. 在 Java6 以及之前的版本中
【string是什么意思 string函数的用法】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 对象的创建方式
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对象是不可变的 。那它不可变是怎么做到的呢?Java 这么做能带来哪些好处?我们一起来简单的探讨一下,先来看看String 对象的一段源码:
public final class Stringimplements java.io.Serializable, Comparable
推荐阅读
- 梦见月食
- sd卡是什么卡,他的功能是什么 sd卡是什么
- 梦见禾米 稻麦
- 梦见敲门
- 火命克金命什么意思 火命与金命不能相配吗
- 培根是什么食物 培根到底是什么??
- 梦见富裕
- 女人犯烂桃花是什么意思 要如何化解
- 八字伏吟是什么意思,八字里的伏吟代表什么?
- 梦见买凉鞋