Java学习|图说String(一):String的存储方式

每一本java的书或是每一套讲java视频课都不会忘了String . 这个类是承载着我们对计算机的输入, 承载着计算机对我们的输出。毫不夸张的说,String架起了我们和计算机沟通的友谊的桥梁!

如上图所示。 我们在新建了三个String变量:s1 = "java" ,s2="技术大本营",s3="java技术大本营"。

从字面上来看,s3应该是s1和s2直接拼接起来的。但实际上在JVM里面的存储s3并不等于s1+s2。

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。

见下图idea中debug的数据(基于jdk11)

 

s1是 4位长的byte数组(一个字节表示一个字型),s2是10位长的byte数组(两个字节表示一个字型),而s3是18位长的byte数组(两个字节表示一个字型)。

细心的同学可能已经观察到了,在s3中是把s1每位后面补了0凑齐的两字节表示一个字型。

在调试页面,我们用了idea的 class level watch 查看了coder方法的值。相当于调用String.coder();

s1的返回结果是0。 s2和s3的返回结果是1。

我们打开String的源码(基于jdk11)可以看到:

关于COMPACT_STRINGS完整的说明可以查看源码说明,就在这个字段上面,我就搬一句话:

If String compaction is disabled, the bytes in {@code value} are

always encoded in UTF16.

如果禁用了压缩,那bytes始终是用UTF16进行编码的。

在源码中,我们可以看到关于0和1的定义:0是LATIN1方式编码。1是UTF16的方式编码。如下图所示:我们通过class level watch 调用isLatin1()方法,可以看到 s1是通过latin1编码。s2和s3是通过UTF16编码。

总结:String 在计算机中都是以 byte数组的方式进行存储。根据存储的值不一样,会选择LATIN1和UTF16两种不同的方式。 LATIN1一个字节代表一个字型。UTF16两个字节代码一个字型。String的其他方法调用,也都是基于这个byte数组。

前期回顾:

三分钟教你学会用java写客户端程序!!速进!!

环境变量|你还不知道怎么设置环境变量吗!?超详细步骤分解!

开始Java编程之路

QQ群:661749608

微信群请点击公众号菜单进微信群

文字: 微笑的小小刀

排版:花音

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值