作者|平头哥的技术博文
编辑|屠敏
出品| CSDN博客
字符串对象的实现
字符串对象是Java中使用最频繁的对象友资源 *** 之一,所以Java公司为了提高字符串对象的性能,也在不断优化字符串对象的实现。看下图了解String对象的优化过程。
1。在Java6和早期版本中
String是封装char数组的对象,有四个成员变量:char数组、偏移量、字符数和hash值hash。
目标是定位char数组,并通过offset和count属性获取字符串。这样可以高效快速的共享数组对象,同时节省内存空,但是这种方法很可能会导致内存泄漏。
2。从Java版本7到Java版本8
从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,则编码器属性的值为0,否则为1。
如何创建一个字符串对象
1。通过字符串常量
String str= "pingtouge "。当使用这个表单创建一个字符串时,JVM将首先检查该对象是否存在于字符串常量池中。如果存在,它将返回对象的引用地址。如果不存在,它将在字符串常量池中创建字符串对象并返回引用。这样创建的好处是:避免重复创建相同值的字符串,节省内存。
2、字符串构造函数的方式
String =新字符串(“pingtouge”)。以这种方式创建字符串对象的过程很复杂,可以分为两个阶段。首先,在编译时,字符串pingtouge将被添加到constant结构中,并且该字符串将在加载类时在constant池中创建。然后在调用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 string对象时,JVM会去常量池查找字符串是否存在。这里的答案肯定是否定的,所以JVM会在常量池中创建string对象,并返回对象的地址引用,所以str指向常量池中pingtouge string对象的地址引用。
然后是string str 1 = new string(“pingtouge”)代码,这里使用构造函数创建string对象。按照我们通过构造悠游资源网的函数来创建string对象的理解,str1应该是得到了平头哥string在堆中的引用地址。Str肯定不等于str1,因为str指向常量池中pingtouge字符串对象的地址引用,str1指向堆中pingtouge字符串的引用地址。
字符串对象的不变性
从我们知道字符串对象的那一刻起,我想每个人都知道字符串对象是不可变的。那怎么是不可改变的呢?Java这样做有什么好处?我们来简单讨论一下。我们先来看一段String对象的源代码:
public final class Stringimplements java.io.Serializable, Comparable本文地址:百科知识频道 https://www.neebe.cn/zhishi/950084.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!