您现在的位置是:首页 > 文章详情

Java String那点事

日期:2018-08-09点击:440

String是我们平时接触最多的一种数据类型之一,不同语言有自己内部的实现,今日一起看下Java中String的内部实现。

常问问题

面试中常被提及的String问题

  1. String为什么是Final的?参考为什么字符串类是Final的
  2. new String("abc")创建了几个对象?
  3. String.intern()有什么用途?

顺着字符串可能往下问到JVM相关的东西,一般Java开发最后都会问到JVM相关的。

剖析

new String("123")与"123"的区别

当你再Idea中new String的时候,Idea会提示你,很少这样构建对象,经常这样做会导致性能的问题。这种构建方法通过拷贝一个村庄的字符串来实例化新的字符串。


img_934c9281566f5665909a804d2e3b4cb0.png
image.png

从自己码编译层面看:
String s = new String("123");
String s = "123";
编译后的字节码:


img_edf0ce12fd4966b7d1f4ee3c97e4837b.png
image.png

可以看出来new String("123")在字节码层面上多了好几条指令,多几条指令当然更费时间。
new 代表新建对象

img_036f6cef82fe712cfc9b5cbe4c9889ac.png
image.png

dup 在栈上复制栈顶的元素


img_95212fb312415969079192ad6942c8e6.png
image.png

ldc 把单个常量放到栈上


img_70e015878eb1ec901a4bf4e6778a9614.png
image.png

String.intern

大家都知道使用intern方法的时候,如果字符串常量池中不存在这个字符串,就把这个字符串放入常量池中,如果存在则直接取常量池中的对象。

实际上开发中很少使用这个方法,在动态拼接字符串的时候可能会有很多字符串不存在字符串常量池中,这个情况相对较少,有相应的场景可以使用。

最后

很多Java语言层面上的东西,在编译成字节码之后就清晰了许多,学会看java的字节码文件吧。

原文链接:https://yq.aliyun.com/articles/666949
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章