概念:

Java常量池
类在加载完成之后,会在内存中存储类中的一些字面量(本身即是值如10,“abc”),对于字符串常量来说,Java会保证常量池中的字面量不会有多个副本,也就是说在常量池中的字符串不可能有两个字符串是相同的,但是Java代码中可能不同的变量的值是相同的,那么在编译期间,这两个变量值所在地址是相同的。而且Java在编译期间会对字符串进行一定的处理,如果一个字符串采用拼接的方式,并且拼接的内容都是字面量的话,那么会自动将字符串先拼接完再赋值,如果常量池中已经有了拼接完成之后的字面量,那么此变量的值的地址就是常量池中的完整字符串的地址。需要注意的是,String在赋值完成之后修改,是会产生新的变量的。比如:

String str = "reeves";
str = "abc";

那么实际上在常量池中存储了"reeves"和"abc"两个字面值,在字符串变量赋予新的值的时候并不会改变原先存储的值,它会再新建一个字符串,而在栈中变量存储的值的地址是变了的。

再比如:

String str2 = new String("ABC");

上面语句创建了几个字符串对象?上面语句实际上创建了2个字符串对象,一个是“ABC”这个直接量对应的对象,一个是new String()构造器返回的字符串对象。

在JVM里,考虑到垃圾回收(Garbage Collection)的方便,将heap(堆)划分为三部分:young generation(新生代)、tenured generation (old generation)(旧生代)、permanent generation(永生代)。

字符串为了解决字符串重复问题,生命周期长,存于pergmen中。

String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在java String池里不存在,会在JVM的字符串池里创建一个String对象(“ABC”),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝,Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。

String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”。

public class Test2 {public static void main(String[] args) {String s1 = new String("ABC");String s2 = new String("ABC");System.out.println(s1 == s2);//falseSystem.out.println(s1.equals(s2));//true}
}

如果将一个字符串连接表达式赋给字符串变量,如果这个字符串连接表达式的值可以在编译时就确定下来,那么JVM会在编译时确定字符串变量的值,并让它指向字符串池中对应的字符串。

但是如果程序使用了变量或者调用了方法,那就只有在运行时才能确定该字符串表达式的值,因此无法在编译时确定值,无法利用JVM的字符串池。

public class Test2 {public static void main(String[] args) {String s1 = "ABCDEF";String s2 = "ABC" + "DEF";System.out.println(s1 == s2);//true,可以在编译时确定String s3 = "DEF";String s4 = "ABC" + s3;System.out.println(s1 == s4);//false,无法在编译时确定final String S5 = "DEF";String s6 = "ABC" + S5;System.out.println(s1 == s6);//true,使用final关键字,在编译时将对S5进行宏替换}
}

当程序中需要使用字符串、基本数据类型包装实例时,应该尽量使用字符串直接量、基本数据类型的直接量,避免通过new String()、new Integer()等形式来创建字符串、基本数据类型包装类实例,这样能保证较好的性能。

原文链接:

https://www.cnblogs.com/Alpharun/p/8974277.html

https://www.jianshu.com/p/01ad56dd8978

String直接赋值和使用new的区别相关推荐

  1. Java基础之String,StringBuilder,StringBuffer三者的区别

    Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...

  2. Java:中的String,StringBuilder,StringBuffer三者的区别

    Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...

  3. String、StringBuffer、与StringBuilder的区别

    原文:http://www.cnblogs.com/sevenlin/p/sevenlin_StringBuffer_StringBuilder20150806.html String.StringB ...

  4. C风格字符串和C++ string 对象赋值操作的性能比较

    <<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下: 在自己本机执行如下程序,记录程序执行时间: 1 ...

  5. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  6. C++ string assign()赋值常用方法

    C++ string assign()赋值常用方法 函数assign()常用在给string类变量赋值. 常用方法有: 1,直接用另一个字符串赋值. 如str2.assign(str1);即用str1 ...

  7. String与StringBuffer和StringBuilder的根本区别

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  8. 关于String,StringBuffer和StringBuilder之间的区别和联系

    本文来说下关于String,StringBuffer和StringBuilder之间的区别和联系 文章目录 概述 String 和 StringBuffer StringBuilder 本文小结 概述 ...

  9. Python:赋值,copy和deepcopy区别

    参考:Python赋值,copy,deepcopy区别 结论 copy()与deepcopy()之间的主要区别是python对数据的存储方式. python2中,需要import copy模块.pyt ...

最新文章

  1. 燕大计算机专业档次,河北省高校排名:分为四个档次,燕大在第二档,第三档有八所高校...
  2. set集合判断集合中是否有无元素_集合 (Set) | 一山不容二虎的 Python 数据类型
  3. boost::polygon模块实现多边形集数据相关的测试程序
  4. 性能测试 (四) 常用指标
  5. gps天线拆解图片_华为 畅享 Z 拆解:揭秘千元5G手机物料成本是多少
  6. HDU4462-稻草人
  7. python中的深浅拷贝
  8. IDEA引入外部jar包的方法
  9. angular2 图表指令ng2-echarts
  10. SMBGhost 漏洞 CVE-2020-0796 的PoC 已发布,攻击现身
  11. 3. AJAX 请求与响应
  12. 开关电源设计入门到精通系列--序
  13. 7代cpu能装虚拟xp系统吗_【精选】减少DCS系统故障的实例与措施
  14. 黑客防线、黑客X档案专辑 NPM、PYPI、DockerHub 备份
  15. 计算机硬盘通过usb接口,并口硬盘转usb接口的方法介绍【详解】
  16. 计算机论文图表,论文图表字体字号-毕业论文格式中图表的要求规范?
  17. C++ 串口调试工具源码
  18. 怎么查python题答案_超星尔雅Python语言应用查题教程
  19. 利用在线技术更改图片清晰度
  20. Html+Css 3D旋转立方体

热门文章

  1. 九价抢不到?多试试这几个GitHub上的开源项目
  2. 皮一皮:一样的燕子,不一样的窝...
  3. 错把一加当苹果,美国海关侵权大案糗大了:被网友无情嘲讽
  4. Java 实现第三方 QQ 账号登录
  5. 面了一个47的程序员,我很慌...
  6. IntelliJ IDEA 2019.2最新解读:性能更好,体验更优,细节处理更完美!
  7. Spring Cloud Alibaba 发布第一个正式版本,顺利完成孵化!
  8. Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)
  9. 如何使用Spring优雅地处理REST异常?
  10. NMS和roi pooling 实现以及加速