继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java String那点事

艾贺521
关注TA
已关注
手记 292
粉丝 1.1万
获赞 1544

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会提示你,很少这样构建对象,经常这样做会导致性能的问题。这种构建方法通过拷贝一个村庄的字符串来实例化新的字符串。
image.png

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

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

image.png

dup 在栈上复制栈顶的元素
image.png

ldc 把单个常量放到栈上
image.png

String.intern

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

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

最后

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

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP