Java String那点事
String是我们平时接触最多的一种数据类型之一,不同语言有自己内部的实现,今日一起看下Java中String的内部实现。
常问问题
面试中常被提及的String问题
- String为什么是Final的?参考为什么字符串类是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的字节码文件吧。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
数据集操作
代码运行报错: ----------> Parent Classloader: java.net.URLClassLoader@1c53fd30 : java.lang.ClassNotFoundException: org.springframework.dao.TransientDataAccessResourceException 八月 10, 2018 5:45:28 下午 com.caucho.hessian.io.SerializerFactory getDeserializer 警告: Hessian/Burlap: 'org.springframework.dao.TransientDataAccessResourceException' is an unknown class in ParallelWebappClassLoader context: cc-web delegate: false ----------> Parent Classloader: java.net.URLClassLoader@1c53fd30 : java.lang.Clas...
- 下一篇
python-包及日志模块使用
一、包 1.包就是一个保护有__init__.py文件的文件夹,包的本质就是一种模块,即包是用来导入使用的,包内部包含的文件也都是用来被导入使用的.包是为了更好组织好模块,就是一个文件夹. 注:在python2中,包下必须有一个__init__.py文件,而python3中即便没有也不会报错 首次导入包,会发生三件事 1.以包下的__init__.py文件为基准来产生一个名称空间 2.执行包下的__init__.py文件的代码,将执行过程中产生的名字都丢到名称空间中 3.在当前执行文件中拿到一个名字p1,该p1就是指向__init__.py名称空间的 总结包的使用需要注意的地方: 1.但凡是在导入语句中带点的,点的左边都必须是一个包 2.导入包就是在导入包下的__init__.py文件 3.如果使用绝对导入,绝对导入的起始位置都是以包的顶级目录为起始点 4.但是包内部模块的导入通常应该使用相对导入,用"."代表当前所在的文件(而非执行文件),两个点代表上一级 强调: 1.相对导入只能包内部的模块之间互相导入使用 2. ".."上一级不能超出顶级包 二、日志模块的使用 logging模块...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19