Java翻译byte数据,java学习|图说String(二):基于byte数组的String方法调用

bd8d00480aac192602eda7ce8ab0bbbb.png

基于byte数组的String方法调用

757c96a59b017688d709aa1f65b028cb.png

上文说到,String的方法调用都是基于byte数组,其实说更详细点:都是基于String中value字段的调用:

注,本文中所有的源码均基于jdk11

8b2ae6d243c0216a6dea332918f77395.png

64c92c83b60b8eccf3589027e8c1ee3c.png

通过上图我们可以看到,value 被声明成了final , 也就是赋过一次值之后,就不可再改变。因此就有了大家常说的,每一次对String的操作都会返回一个新的String 对象。下面我们看看是不是像大家所说的那样。

常用的length()方法:

该方法用于获取字符串的长度

1a06de6da068c739059bfb326cfb7253.png

c7d50fe6d4b4e095f1a6aea6ef7e21bb.png

既然说到所有的方法都是基于byte数据调用,借前文一张图:

646022eb48cfef5c8e5a41094a1c3d69.png

从图中可以看到,byte的总长度是18, 加上我们上文讲过,UTF16是以两个字节代表一个字型,那么很明显应该就是用byt数组的长度除以2。 18/2=9 。源码采用了一种更高级的方式。移位!

public int length() {

return value.length >> coder();

}

coder()方式返回UTF16=1 , LATIN1=0;

结果如下:

558e6ec3e46f77808f34c02dec364699.png

92f1d4d5d8e459df13c68a79a355b0b6.png

下面我们看看另一个常用方法,substring:

从原字符串中按指定位置截取子字符串。

按上面length示例所展示,长度,位置都是按byte[]的长度算的,那么位置匹配应该也是以byte[]数组的位置来做为计算。既然要按byte[]的长度做截取,那就要考虑到 LATIN1和UTF16两种情况了:如下图1846行所示,如果是Latin1,调用latin1的newString , 如果不是则调用UTF16的newString

17932f2036c84047eefb15b09ce6a103.png

我们点进去后代码如下图所示,1025行,对起始位置和结束位置都做了左移操作。既:本来是截取"java技术大本营" (1,3)。 改为了截取byte[]数组(2,6)之间的数据。

9e4d30dd57d10e096b6989e0a19637a7.png

我们点进去copyOfRange可以看到如下图所示代码,在4030行,可以看到新建了一个byte[]数组,然后把原数据对应位置的数据截取下来,放到新的byte数据里面返回。

1a717af8bc6bde55973344d7c70fd22f.png

bf1b1d42ab6e0375b2c7c59b64a74df0.png

总结:因为String是final类型的,对其的任何修改都会返回一个新的String对象。对String的任何操作,都是变相对其中的byte[]数组进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值