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

常问问题

面试中常被提及的String问题

String为什么是Final的?

new String("abc")创建了几个对象?

String.intern()有什么用途?

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

剖析

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

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

从自己码编译层面看:

String s = new String("123");

String s = "123";

编译后的字节码:

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

new 代表新建对象

dup 在栈上复制栈顶的元素

ldc 把单个常量放到栈上

String.intern

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

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

最后

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

写在最后:欢迎留言讨论,!加关注,持续更新!!!

最新文章

  1. iOS开发之微信聊天工具栏的封装
  2. json转换
  3. Linux rsync实现断点续传
  4. 【原创】Kakfa log包源代码分析(一)
  5. “假学习“&”真学习“?(摘)
  6. 请把不听话的【return】关进【class】这个笼子
  7. ios 消息推送流程 转载
  8. ZendStudio导入一个已有的网站
  9. DelegatingFilterProxy
  10. IE 9渲染overflow的bug及解决
  11. 2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
  12. linux(readhat) yum源安装
  13. Java并发编程:线程池的使用(转)
  14. GAN 转
  15. Polya计数
  16. 微信小程序之:wepy(二)
  17. MachineLN博客目录
  18. xpath语法大全
  19. VUE组件 之 Toast (Vue.extend 方式)
  20. shell while内获取外部变量内容

热门文章

  1. SpringCloud学习成长之路三 服务消费者(Feign)
  2. 新手pyhoner的指定内容读取和写入的思路
  3. Yarn使用笔记
  4. OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)
  5. gd库的相关内容
  6. Hyper-V VM Generation 2 - Can not boot from .ISO (Hyper-V Gen2不能從DVD啓動 ISO)
  7. 最新 梦网科技java校招面经 (含整理过的面试题大全)
  8. 使用Homebrew来安装Node等工具
  9. python2.7 升级到 python3.6
  10. 基于SymmetricDS的多主一从数据库同步方案