Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你知道伴随着JDK版本的更新:String都有哪些变化么?

你知道伴随着JDK版本的更新:String都有哪些变化么?

作者头像
AI码师
发布于 2024-05-27 09:05:57
发布于 2024-05-27 09:05:57
2650
举报

Java 中的 String 类是编程中使用最频繁的类之一,它用于表示字符序列。随着 Java Development Kit (JDK) 的不断迭代,String 类的底层设计和优化也在不断发展,以提高性能和内存使用效率。

JDK 6 及之前的版本

在 JDK 6 中,String 类的常量池位于永久代(方法区)中。此时,常量池存储的是对象本身。这意味着,所有的字符串字面量都会在常量池中创建一个实例,如果使用 new 关键字创建字符串,也会在堆内存中创建一个新的 String 对象,并且常量池中也会有一个对应的实例。

JDK 7

JDK 7 引入了一项重要的变化,将常量池从永久代移到了堆内存中。此时,常量池存储的是对象的引用。这意味着,字符串字面量和通过 new 创建的 String 对象都会在堆内存中,而常量池中存储的是它们的引用。这一变化使得字符串的存储和管理更加灵活。

JDK 8

JDK 8 进一步优化了 String 类,引入了元空间(Metaspace)来取代永久代。元空间使用的是本地内存,而不是虚拟机内存,这有助于减少内存溢出的风险。此外,JDK 8 还对字符串的创建和 intern() 方法的行为进行了优化。例如,在 JDK 8 中,通过 new String("text").intern() 创建的字符串和直接使用字面量 "text" 创建的字符串,可能会指向同一个对象,这在 JDK 7 中是不可能的。

JDK 9 及之后的版本

JDK 9 对 String 类进行了重大的底层优化。在 JDK 9 中,String 类不再使用 char 数组来存储字符串数据,而是改用 byte 数组。这一改变基于一个观察:大多数字符串只包含 Latin-1 字符集的字符,这些字符可以用一个字节来表示。通过使用一个字节的编码格式,JDK 9 减少了 String 对象的内存占用。如果字符串包含非 Latin-1 字符,JDK 会使用 UTF-16 编码,这与之前的版本相同。

此外,JDK 9 还引入了一个 coder 字段,用于标识字符串的编码格式,以及一个 COMPACT_STRINGS 属性,用于控制是否开启字符串的紧凑存储功能。默认情况下,这个功能是开启的,可以通过 -XX:-CompactStrings 参数来关闭。

总结

随着 JDK 版本的迭代,String 类的底层设计和优化不断改进,以适应不同的使用场景和提高性能。从 JDK 6 的永久代常量池,到 JDK 7 的堆内存常量池,再到 JDK 8 的元空间和 intern() 方法的优化,以及 JDK 9 的内存占用优化,Java 的 String 类一直在进化。这些改进不仅提高了性能,还减少了内存占用,使得 Java 程序更加高效和稳定。

参与讨论

  • 关于string,在面试中被问的最多的问题是什么?
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM揭秘之旅:打破性能瓶的终极指南(1)
「为什么Java程序员必须啃透JVM?」 JVM是Java生态的“灵魂引擎”,但多数开发者仅停留在API调用层面。当面临频发GC卡顿、诡异OOM崩溃或线程死锁顽疾时,是否曾因底层原理的模糊而束手无策?本专栏将带您穿透技术迷雾,系统攻克JVM核心领域:
半旧518
2025/07/03
850
一文带你读懂String类源码
String 是日常开发非常频繁的类,此外我们常用的操作还有字符串连接操作符等等。String对象是不可变的,查看JDK文档,我们不难发现String类的每个修改值的方法,其实都是创建了一个新的String对象,以包含修改后的字符串内容。
后台技术汇
2022/05/28
3520
一文带你读懂String类源码
从字符串到常量池,一文看懂String类
这道题就算你没做过也肯定看到,总所周知,它创建了两个对象,一个位于堆上,一个位于常量池中。
cxuan
2020/06/28
1K0
从字符串到常量池,一文看懂String类
Java面试- JVM 内存模型讲解
经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发。确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些。
健程之道
2019/11/02
8390
字符串性能优化不容小觑
String对象是我们日常工作中使用最频繁的对象,它的性能问题也是我们最容易忽略的。String对象作为Java语言中最重要的数据类型,是内存中占据空间最大的对象,高效地使用字符串,可以提升系统的整体性能。
故里
2020/11/25
5790
字符串性能优化不容小觑
这次让我们从字节码文件来重新认识String,文末有两个小小面试题,一起来试一试
String 实现了Serializable和Comparable接口:即字符串是支持序列化和比较大小的。
宁在春
2022/10/31
3490
这次让我们从字节码文件来重新认识String,文末有两个小小面试题,一起来试一试
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
String是Java中的一个内置类,Immutable不可变,即一旦创建String对象,它的值就不能被更改。对String对象的replace、subString、toLowerCase等操作都会返回一个新String对象,故每次操作String时 性能较低、浪费内存空间
寻求出路的程序媛
2024/04/21
3520
String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变
jvm之StringTable解读
The current implementation of the String class stores characters in a char array, using two bytes (sixteen bits) for each character. Data gathered from many different applications indicates that strings are a major component of heap usage and, moreover, that most String objects contain only Latin-1 characters. Such characters require only one byte of storage, hence half of the space in the internal char arrays of such String objects is going unused.
一个风轻云淡
2023/10/15
2910
jvm之StringTable解读
Java String 对象,你真的了解了吗?
String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对String对象的实现进行优化,以便提升String对象的性能,看下面这张图,一起了解一下String对象的优化过程。
平头哥的技术博文
2019/09/24
8580
面试必考java字符串String
众所周知在java里面除了8种基本数据类型的话,还有一种特殊的类型String,这个类型是我们每天搬砖都基本上要使用它。
java金融
2020/11/29
5160
面试必考java字符串String
JVM - 深入剖析字符串常量池
看 1.8 , 疯狂的intern, 抛出了 heap oom ,由此可以推断出 1.8中的字符串常量池 是在堆中。
小小工匠
2021/08/17
6460
彻底弄懂java中的常量池
class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,我们编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘中,其中就包括class文件常量池。 class文件中存在常量池(非运行时常量池),其在编译阶段就已经确定,jvm规范对class文件结构有着严格的规范,必须符合此规范的class文件才能被jvm任何和装载。为了方便说明,我们写个简单的类
秃头哥编程
2019/06/24
22.8K13
彻底弄懂java中的常量池
Android经典面试题笔记之JVM内存管理剖析
class文件通过类加载器加载到运行时数据区,运行时数据区又分为线程私有和线程共享的内存;
AntDream
2024/10/08
1360
Android经典面试题笔记之JVM内存管理剖析
彻底弄懂java中的常量池
JVM常量池主要分为Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池。
用户8062311
2021/01/10
1K0
JVM运行时数据区(<=JDK7 and JDK8+)
是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。
斯武丶风晴
2020/04/24
7750
JVM运行时数据区(<=JDK7  and  JDK8+)
Java String Krains 2020-08-05
String源码中是这样定义的,String底层在jdk8及以前是用char数组存储的,而jdk9之后改用byte数组存储,由于都加了final关键字,String是不可变的。
Krains
2020/08/10
3950
Java String  Krains 2020-08-05
Java String 演进全解析
String 是我们使用最频繁的对象,使用不当会对内存、程序的性能造成影响,本篇文章全面介绍一下 Java 的 String 是如何演进的,以及使用 String 的注意事项。
Yano_nankai
2020/11/29
3790
Java String 演进全解析
再议String-字符串常量池与String.intern()
来源:blog.csdn.net/gcoder_/article/details/106644312
Java小咖秀
2021/08/05
3740
再议String-字符串常量池与String.intern()
阿里一面:如何将重复性比较高的 String 类型的地址信息从 20GB 降到几百兆?
这次应该是互联网及软件行业的第三次寒潮,大家在寒潮中一定要继续保持学习,寒潮挺过去以后还是会迎来新的发展机遇。
码哥字节
2024/04/13
1520
阿里一面:如何将重复性比较高的 String 类型的地址信息从 20GB 降到几百兆?
JVM 学习笔记(1):Java内存区域
程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 ,也就是记录下 Java 程序当前指令的地址偏移量,可在线程切换时记录下当前线程执行的位置,给 CPU 提供指令地址,以便下一次切换回来找到继续执行的位置。
玛卡bug卡
2022/09/20
4970
JVM 学习笔记(1):Java内存区域
相关推荐
JVM揭秘之旅:打破性能瓶的终极指南(1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档