String str = new String("abc")创建过程

(1) 先定义一个名为str的对String类的对象引用变量放入栈中。

(2) 然后在堆中(不是常量池)创建一个指定的对象,并让str引用指向该对象。

(3) 在常量池中查找是否存在内容为"abc"字符串对象。
(4) 如果不存在,则在常量池中创建内容为"abc"的字符串对象,并将堆中的对象与之联系起来。
(5) 如果存在,则将new出来的字符串对象与字符串常量池中的对象联系起来(即让那个特殊的成员变量value的指针指向它)

对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

结论:

(1) 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,我们创建了String类的对象str。担心陷阱!对象可能并没有被创建!唯一可以肯定的是,指向 String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑,除非你通过new()方法来显要地创建一个新的对象。

因此,更为准确的说法是,我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。

(2) 使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据常量池中数据的实际情况来决定是否有必要创建新对象。

而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。这个思想应该是享元模式的思想,但JDK的内部在这里实现是否应用了这个模式,不得而知。

(3) 当比较包装类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==。

(4) 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

这也就是有道面试题:String s = new String(“abc”);产生几个对象?答:一个或两个,如果常量池中原来没有”abc”,就是两个。

7. 基本数据类型包装类的值不可修改。不仅仅是String类的值不可修改,所有的基本数据数据类型包装类都不能更改其内部的值。

8.String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;

 

最新文章

  1. 机器学习之sklearn——聚类
  2. OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译
  3. 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法
  4. 简单设置,解决使用webpack前后端跨域发送cookie的问题
  5. WD硬盘型号信息
  6. CodeForces#275--DIV 2--A
  7. Codeforces Round #244 (Div. 2) B. Prison Transfer
  8. Git 升级与基础适用
  9. (OAF)jdeveloper集成log4j并将日志输出到指定文件并写入数据库
  10. oracle常用查询三
  11. android 填满手机磁盘空间方法
  12. cadence PCB板级设计
  13. 设计模式系列之过滤器模式(Chriteria Pattern)
  14. (转)医疗IT运维系统
  15. Usage of git
  16. MySQL安装教程(mysql5.6_bundle)
  17. hello1 web项目中web.xml作用分析
  18. 简单方法解决bootstrap3 modal异步加载只一次的问题
  19. 20155218 2016-2017-2 《Java程序设计》第6周学习总结
  20. LINUX系统下APACHE中的CGI应用

热门文章

  1. 向net core 3.0进击——项目发布与部署
  2. 【redis】redis的过期策略
  3. R语言之脸谱图
  4. Ubuntu 16 server 安装 tensorflow-GPU
  5. mysql全局变量和局部变量
  6. 前端上传图片 base64转二进制上传
  7. vsftpd超实用技巧详解
  8. 安装实时查看日志工具 log.io
  9. Pyinstaller打包scrapy
  10. NOIP模拟测试8反思