在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

JavaString对象是什么

134次阅读
没有评论

共计 2149 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 JavaString 对象是什么,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Java String 对象,你真的了解了吗? 

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

在 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 str= pingtouge 的形式,使用这种形式创建字符串时,JVM
会在字符串常量池中先检查是否存在该对象,如果存在,返回该对象的引用地址,如果不存在,则在字符串常量池中创建该字符串对象并且返回引用。使用这种方式创建的好处是:避免了相同值的字符串重复创建,节约了内存。2、String() 构造函数的方式 String
str = new
String(pingtouge) 的形式,使用这种方式创建字符串对象过程就比较复杂,分成两个阶段,首先在编译时,字符串 pingtouge 会被加入到常量结构中,类加载时候就会在常量池中创建该字符串。然后就是在调用 new() 时,JVM
将会调用 String 的构造函数,同时引用常量池中的 pingtouge 字符串,在堆内存中创建一个 String 对象并且返回堆中的引用地址。了解了 String 对象两种创建方式,我们来分析一下下面这段代码,加深我们对这两种方式的理解,下面这段代码片中,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 对象是不可变的。那它不可变是怎么做到的呢?Java
这么做能带来哪些好处? 我们一起来简单的探讨一下,先来看看 String 对象的一段源码:

从这段源码中可以看出,String 类用了 final 修饰符,我们知道当一个类被 final
修饰时,表明这个类不能被继承,所以 String 类不能被继承。这是 String 不可变的第一点

再往下看,用来存储字符串的 char value[] 数组被 private
和 final 修饰,我们知道对于一个被 final 的基本数据类型的变量,则其数值一旦在初始化之后便不能更改。这是 String 不可变的第二点。Java
公司为什么要将 String 设置成不可变的,主要从以下三方面考虑:1、保证 String 对象的安全性。假设 String 对象是可变的,那么 String
对象将可能被恶意修改。2、保证 hash 属性值不会频繁变更,确保了唯一性,使得类似 HashMap 容器才能实现相应的 key-value
缓存功能。3、可以实现字符串常量池

关于 JavaString 对象是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计2149字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 精品av熟女一区二区偷窥海滩 | 无码欧精品亚洲日韩一区 | 扒开双腿猛进入喷水高潮叫声 | 国产成人精品无码一区二区三区 | 亚洲国产成人精品动漫 | 男女高潮又爽又黄又无遮挡 | 思思久久96热在精品国产 | 精品一二 | 国产70老熟女重口小伙子 | 妺妺窝人体色www聚色窝仙踪 | 丰满的少妇xxxxx青青青 | 免费一级视频在线播放 | 伊人久久大香线蕉久久婷婷 | 欧美日韩视频一区二区 | 欧美日本高清一本二本三本 | 国产免费av片在线观看播放 | 国产婷婷一区二区三区 | 久草电影在线播放 | 中文字幕亚洲区 | 国产精品嘿咻嘿咻在线播放 | 二区三区视频 | 日韩中文字幕在线亚洲一区 | 嫩草影院久久国产精品 | 毛色毛片免费看 | 粗壮挺进人妻水蜜桃成熟漫画 | 人妻无码人妻有码中文字幕 | 欧美爱爱帝国综合社区 | 大地资源网高清在线观看免费 | 国产肝交视频在线观看 | 免费一级特黄欧美大片久久网 | 性大片免费视频观看 | 一级毛片免费不卡 | 97精品国产一区二区三区 | 亚洲av无码国产精品久久 | 日本精品一区二区三区在线视频 | 国产网红福利视频网站 | 国产精品视频一区二区三区无码 | 亚洲毛片 | 亚洲色图综合 | 韩国美女主播19vip | 成人国产在线视频在线观看 |