文章插图
文章插图
作者 | 平头哥的技术博文
责编 | 屠敏
出品 | CSDN 博客
文章插图
String 对象的实现
String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对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 对象的创建方式
1、通过字符串常量的方式
String str= "pingtouge"的形式,使用这种形式创建字符串时,JVM 会在字符串常量池中先检查是否存在该对象,如果存在,返回该对象的引用地址,如果不存在,则在字符串常量池中创建该字符串对象并且返回引用 。使用这种方式创建的好处是:避免了相同值的字符串重复创建,节约了内存 。
2、String构造函数的方式
String str = new String("pingtouge")的形式,使用这种方式创建字符串对象过程就比较复杂,分成两个阶段,首先在编译时,字符串pingtouge会被加入到常量结构中,类加载时候就会在常量池中创建该字符串 。然后就是在调用new时,JVM 将会调用String的构百思特网造函数,同时引用常量池中的pingtouge字符串,在堆内存中创建一个String对象并且返回堆中的引用地址 。
了解了String对象两种创建方式,我们来分析一下下面这段代码,加深我们对这两种方式的理解,下面这段代码片中,str是否等于str1呢?
String str = "pingtouge";String str1 = new String("pingtouge");system.out.println(str==str1)
我们逐一来分析这几行代码,首先从String str = "pingtouge"开始,这里使用了字符串常量的方式创建字符串对象,在创建pingtouge字符串对象时,JVM会去常量池中查找是否存在该字符串,这里的答案肯定是没有的,所以JVM将会在常量池中创建该字符串对象并且返回对象的地址引用,所以str指向的是pingtouge字符串对象在常量池中的地址引用 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 《猎罪图鉴》贺虹的真实身份是什么
- 《猎罪图鉴》沈翊的师妹到底是好是坏
- 惊讶和惊奇是近义词吗 惊奇的近义词是什么
- 电脑辐射脸发红是真的吗?
- 防火涂料和防火漆的区别
- 十大最简单的自学乐器 自学笛子难学吗
- 公认质量最好的移动空调 可移动空调什么牌子好
- 新人做电话销售的技巧 业务员怎么开发客户
- 越南跟团最实惠的费用明细 越南旅游跟团多少钱
- 国内外有哪些代表性企业? oem和odm的区别