概述
基于byte数组的String方法调用
上文说到,String的方法调用都是基于byte数组,其实说更详细点:都是基于String中value字段的调用:
注,本文中所有的源码均基于jdk11
通过上图我们可以看到,value 被声明成了final , 也就是赋过一次值之后,就不可再改变。因此就有了大家常说的,每一次对String的操作都会返回一个新的String 对象。下面我们看看是不是像大家所说的那样。
常用的length()方法:
该方法用于获取字符串的长度
既然说到所有的方法都是基于byte数据调用,借前文一张图:
从图中可以看到,byte的总长度是18, 加上我们上文讲过,UTF16是以两个字节代表一个字型,那么很明显应该就是用byt数组的长度除以2。 18/2=9 。源码采用了一种更高级的方式。移位!
public int length() {
return value.length >> coder();
}
coder()方式返回UTF16=1 , LATIN1=0;
结果如下:
下面我们看看另一个常用方法,substring:
从原字符串中按指定位置截取子字符串。
按上面length示例所展示,长度,位置都是按byte[]的长度算的,那么位置匹配应该也是以byte[]数组的位置来做为计算。既然要按byte[]的长度做截取,那就要考虑到 LATIN1和UTF16两种情况了:如下图1846行所示,如果是Latin1,调用latin1的newString , 如果不是则调用UTF16的newString
我们点进去后代码如下图所示,1025行,对起始位置和结束位置都做了左移操作。既:本来是截取"java技术大本营" (1,3)。 改为了截取byte[]数组(2,6)之间的数据。
我们点进去copyOfRange可以看到如下图所示代码,在4030行,可以看到新建了一个byte[]数组,然后把原数据对应位置的数据截取下来,放到新的byte数据里面返回。
总结:因为String是final类型的,对其的任何修改都会返回一个新的String对象。对String的任何操作,都是变相对其中的byte[]数组进行操作。
—END—
前期回顾:
Java学习|图说String(一):String的存储方式
环境变量|你还不知道怎么设置环境变量吗!?超详细步骤分解!
开始Java编程之路
QQ群:661749608
微信群请点击公众号菜单进微信群
支持我们哦~
文字: 微笑的小小刀
排版:花音
最后
以上就是甜蜜羽毛为你收集整理的java学习|图说String(二):基于byte数组的String方法调用的全部内容,希望文章能够帮你解决java学习|图说String(二):基于byte数组的String方法调用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复