我们再来看一段代码:

运行一下:

没错,一个true,一个是false,(答错的小朋友去面壁去),大家可能在想编译器肯定又调皮了,编译的时候是不是又偷偷加了些什么,迫不及待的打开class文件看一下:

除了删掉了空行以外和我的java源文件一致呀,这回可冤枉编译器了,那为什么会导致不同的结果呢?我们都知道,Java代码是运行在JVM里的,那是不是JVM在执行这段代码时给我们做了什么?
在JVM中,当代码执行到String s1 = "100" 时,会先看常量池里有没有字符串刚好是“100”这个对象,如果没有,在常量池里创建初始化该对象,并把引用指向它,如下图,绿色部分为常量池,存在于堆内存中

当执行到String s2 = "100" 时,发现常量池已经有了100这个值,于是不再在常量池中创建这个对象,而是把引用直接指向了该对象,如下图:

这时候我们打印System.out.println(s1 == s2)时,由于==是判断两个对象是否指向同一个引用,所以这儿打印出来的就应该是true。

继续执行到Strings3 = new String("100") 这时候我们加了一个new关键字,这个关键字呢就是告诉JVM,你直接在堆内存里给我开辟一块新的内存,如下图所示:

继续执行String s4 = new String("100")

这时候再打印System.out.println(s3 == s4) 那一定便是false了,因为s3和s4不是指向对一个引用(对象)。

注:图中只是画出了main方法栈和相关对象在内存中的大致模拟,实际中JVM中内存管理比较复杂,大家有条件的话可以去找《Java虚拟机规范》这本书去深入研究。

结论:我们在比较两个String对象内容时,无论是怎么声明的,都一定要使用equals去比较,不能用==,在Java中没有重载操作符这一说,特别是从其它语言转到Java的童鞋们要注意。equals我会在后续专栏里已经做了详细解说。

上一篇:让人疑惑的Java代码 - Java那些事儿

下一篇:说说Java里的equals(上) - Java那些事儿

如果喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也可以在评论区留言想了解的内容,有机会本专栏会做讲解,最后别忘了关注一下我。

转载无限欢迎,但请注明「作者」和「原文地址」。转载请在文中保留此段,感谢您对作者版权的尊重。如需商业转载或刊登,请联系作者获得授权。

Java字符串那些事儿相关推荐

  1. Java编程那些事儿102——网络编程技术1

    Java编程那些事儿102--网络编程技术1 陈跃峰 出自:http://blog.csdn.net/mailbomb 13.2 网络编程技术 前面介绍了网络编程的相关基础知识,初步建立了网络编程的概 ...

  2. Java编程那些事儿103——网络编程技术2

    Java编程那些事儿103--网络编程技术2 陈跃峰 出自:http://blog.csdn.net/mailbomb 13.2.3 TCP编程 按照前面的介绍,网络通讯的方式有TCP和UDP两种,其 ...

  3. Java编程那些事儿104——网络编程技术3

    Java编程那些事儿104--网络编程技术3 陈跃峰 出自:http://blog.csdn.net/mailbomb 为了一步一步的掌握网络编程,下面再研究网络编程中的两个基本问题,通过解决这两个问 ...

  4. Java编程那些事儿——文件操作之写文件

    Java编程那些事儿--文件操作之写文件 Java, Java培训, Java基础, Java学习, Java教程 11.3.1.4 写文件 如前所述,将程序内部的数据输出到程序外部的数据源,应该使用 ...

  5. java字符串的知识总结

    java字符串的基本概念 字符串是java特殊的类,使用方法像一般的基本数据类型. 声明字符串的方法: 字符串类型  字符串名字 = 字符串内容 例如 String str="hello&q ...

  6. Java字符串就该这样设计

    一翻开Java面试题,基本上都会有考察字符串的不可变性,new String()和""的区别,字符串+内部实现等相关问题,您可能也知道常量池,看了一些堆栈图,了解了上述答案,可是过 ...

  7. java 字符串大小比较

    //java 字符串大小比较 String a="b123"; String b="b124";String d="b122"; Strin ...

  8. 【转】Java字符串与字符集的基本概念

    原文地址:http://blog.csdn.net/darxin/article/details/5079242 Java String是Java API中最常用的类,本文和大家谈谈String类的内 ...

  9. Java字符串用“。”(点)分隔。

    本文翻译自:Java string split with "." (dot) [duplicate] This question already has an answer her ...

最新文章

  1. HDU5853 Jong Hyok and String(二分 + 后缀数组)
  2. 研讨会 | 知识图谱大咖云集阿里,他们都说了啥
  3. Java Long类shortValue()方法与示例
  4. c语言程序设计的几种循环,C语言程序设计教案 第六章 循环程序设计.doc
  5. Java中HashMap和TreeMap的区别深入理解,java开发面试笔试题
  6. linux sap协议ip,记录USER 登陆SAP 的IP Address
  7. 德国黑客使用租用的计算机资源攻击散列算法
  8. 关于VM安装Linux系统成功后无法连接WIFI
  9. python3速查参考- python基础 5 - 常用的文件操作
  10. 《Python硬件编程实战》——1.3 Python的特点
  11. 百度人脸识别技术应用004---利用百度云离线SDK例子程序百度在线人脸库人脸识别接口_实现在线人脸识别
  12. #MAXScript学习# 1批量导出fbx
  13. 如何免费批量将caj转换成PDF
  14. val什么意思vb中的属性值_VB语言中的val()函数是什么意思?如何使用?
  15. android 呼吸灯权限_Android 呼吸灯流程分析
  16. 13_大数据之数据可视化_note
  17. 数据泄露事件频发,深扒企业数据库安全隐患(内附高效防护手段)
  18. 高职计算机应用与信息检索,信息检索论文,关于高职院校图书馆对学生信息检索的教育相关参考文献资料-免费论文范文...
  19. Python-Django毕业设计老薛男生服装网(程序+LW)
  20. 中兴和华为的面试经历

热门文章

  1. 综合技术 --myBatis理解
  2. 挑选管理软件应注意的几个问题
  3. 用jquery验证用户名是否有效或重复
  4. Java Socket实战之一:单线程通信
  5. linux下面安装jdk
  6. 产生BFC环境的几种方式
  7. mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
  8. jQuery 核心 - noConflict() 方法,jQuery 文档操作 - detach() 方法
  9. 成就解锁:BCH修复了所有常见的第三方交易延展性矢量
  10. 比特币官网管理者Cobra认可BCH支付属性