转自:https://blog.csdn.net/wxz980927155/article/details/81712342

起因

再一次js的json对象的比较中,发现相同内容的json对象使用==比较并不相等。 
例如:

var obj = {};
var obj2 = {};
console.log(obj == obj2); // 结果为false

json在js中代表一个对象==比较的是对象栈中存放引用堆的地址。上面的obj和obj2创建的是两个对象地址肯定不同结果为false。

但最令我不解的是为什么js的字符串比较可以用==来比较字符串的内容是否相等,而java却要使用equals去比较字符串的内容是否相等。但当我发现下面代码的时候又刷新了我这个菜鸟的认知。

String str1 = "test";
String str2 = "test";
System.out.println(str1 == str2); // 结果为true 

结果难道不该为false吗?字符串的比较难道不是用equals来比较内容是否相等吗?两个不同的对象创建的内存地址应该是不一样的啊!!后来经过网上查阅资料发现jvm还存在一个字符串常量池。


字符串常量池

让我们先分析一下上述的代码:

在我的理解中常量池应该是为了减少开发者对字符串过度的创建,导致内存使用率的提升,毕竟String类是一个final类,操作字符串永远不会改变当前字符串的值,只会新增一个字符串对象。

String str1 = "test";
/* jvm在编译的时候会先查看str1字面量test是否存放在字符串常量池中有则直
接引用字符串常量池里面的地址,没有则在字符串常量池新创建一个*/
String str2 = "test"; /* str2发现字符串常量池里面已经有了test则直接把字符串常量池里面的地址拿 了过来*/ System.out.println(str1 == str2); // 最终str1和str2的地址都是相同的结果肯定为true啦

既然都到这里在拓展拓展在走呗

String str1 = new String("test");
String str2 = new String("test"); System.out.println(str1 == str2); // 结果为false // 这个为什么不为true了呢?

new String()会在代码运行的时候在堆中开辟一个空间存放引用字符串常量池里面的地址但是栈里面引用的堆的地址是不一样的,所以即使引用的字符串常量池里面的地址是一样也永远不可能为true!! 


intern方法

强制String对象使用字符串常量池

String str1 = new String("test");
String str2 = new String("test"); str1 = str1.intern(); str2 = str2.intern(); System.out.println(str1 == str2); // 结果为true 

经典面试题

String str1 = new String("test");
// 此代码执行会创建几个对象? // A:1个或2个,堆中会创建一个,字符串常量池中有test则常量池中不会创建,没有则创建

总结

  1. 字符串字面量会在编译的就开始判断是否在字符串常量池里面创建,而new String()会在代码运行的时候才去判断。

  2. 字符串常量池里面没有此字符串则会创建,有则会去引用字符串常量池里面的字符串。字面量里字符串常量池的地址存放在栈中,new String()则存放在堆中。

转载于:https://www.cnblogs.com/maohuidong/p/10074674.html

java字符串常量池——字符串==比较的一个误区相关推荐

  1. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

  2. Java字符串常量池

    前言 本文主要用于记录和分享一下博主在解决如题问题时,从各种途径所查询到的个人认为比较可信的相关资料,以及他人或个人得出的一些结论.如果参考资料或者所得结论存在错误,欢迎批评指正. 注意:本文中提及到 ...

  3. java基础之什么是字符串常量池,class常量池和运行常量池?

    一.字符串常量池 字符串大家一定都不陌生,他是我们非常常用的一个类. String作为一个Java类,可以通过以下两种方式创建一个字符串: String str = "Hollis" ...

  4. JVM---StringTable(字符串常量池)

    StringTable(字符串常量池) 字符串常量池 StringTable(字符串常量池) String的基本特性 String 的底层结构 String 的内存分配 String 的基本操作 字符 ...

  5. 一文彻底搞懂字符串、字符串常量池原理

    文章目录 1. 常量池概述 1.1 静态常量池.运行时常量池与字符串常量池的区别 2. 字符串常量池的设计初衷 3. 字符串的几种创建方式及原理 ①:直接赋值 ②:new String() ③:int ...

  6. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)

    以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...

  7. [JVM]了断局:常量池 VS 运行时常量池 VS 字符串常量池

    一.前言 最近在看JVM, 常量池, 运行时常量池,字符串常量池 这个看的有点懵. 整理一下. class常量池 是在编译的时候每个class都有的. 在编译阶段,存放的是常量的 符号引用 .    ...

  8. 详解JVM常量池、Class常量池、运行时常量池、字符串常量池(心血总结)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  9. String类的学习笔记(中):介绍字符串的不可变性和字符串常量池

    本文介绍了String类字符串的不可变性和字符串常量池,主要包括 如何保证字符串不可变, 如何对字符串的修改. 为什么字符串要设置不可变, 字符串常量池的创建和了解,简单的字符串常量池图, 以及如何将 ...

最新文章

  1. php读取access编码格式,php+access如何设置编码格式
  2. python 计算机程序设计基础-零基础,没有编程和计算机基础,究竟该怎么自学python?...
  3. 计算机存储的大小端模式解析
  4. [linux] 如果修改用户的密码
  5. OMP算法实现人脸识别_matlab完整代码
  6. android 复制字符串,Cocos2dx 复制文本到剪切板(Android 和 ios)
  7. wsimport命令讲解
  8. mysql5.7.20官方文档,MySql 5.7.20安装及data和my.ini文件的配置
  9. jmeter 聚合报告说明_Jmeter 测试结果分析之聚合报告简介
  10. VC中CListCtrl设置滚动条在最下边的方法(MSDN中的例子)
  11. Linux:文件权限数字形式
  12. Improving Opencv9 Eroding and Dilating 和对opencv窗体上有控制按钮的理解
  13. Lazada新手卖家必看!只需掌握这三点,教你快速切入Lazada平台
  14. 大学论文的研究框架是什么?
  15. IIS7.0 Url Rewrite
  16. 居民身份证号码的含义
  17. 新手入门|计算机科普
  18. cad图形不见了怎么办_CAD软件常见问题解答,CAD中的工具栏不见了怎么办?如何清理图形...
  19. Postgresql 学习记录,模式,分区表,触发器,事务,窗口函数,视图,建表,约束等
  20. 谈谈EOS的出块时间,不可逆时间,BFT

热门文章

  1. 华为手机怎么看图片属性_华为手机怎么才能息屏显示时间?操作方法很简单,看完涨知识了...
  2. 第一台鸿蒙手机是,第一台预装鸿蒙OS的手机终于登场。
  3. 七七计算机论文网,qepipnu
  4. c语言中buf内容怎么给指针,C语言 指针的使用
  5. mysql sql组合_详解mysql 组合查询
  6. IDEA连接mysql报Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' 的错误
  7. 指针强制类型转换触发内存自动对齐
  8. airpods删除别人的配对_怎么不让别人连我的airpods
  9. java请假审批怎么实现_java实现请假时间判断
  10. axure实现复选框全选_jq简单的全选、反选和全不选效果