Java中关于Integer, String 类型变量 == 与 equa…
2019-09-23 09:09:51来源:博客园 阅读 ()
Java中关于Integer, String 类型变量 == 与 equals 判断的坑
== 与 equals()的联系:
==:
我们都知道Java中 == 对用于基础数据类型(byte, short, int, long, float, double, boolean, char)判断时, 是直接对变量值的比较. 而对于引用类型变量则是对变量地址的比较.
equals():
我们可以通过查阅源码看到Object类中equals()方法依然是直接对地址的比较
当然, 常见的Java类都重写了equals方法, 如封装类, Date等. 这里我们只说下Integer和String重写后的equals().
Integer的equals()是利用自动拆箱为int类型数据, 然后进行int值的比较:
而String则是逐个字符的进行比较:
上面所说的也许都知道, 之所以说一遍, 一是为了有些知道但不是很明白的同学. 二是自己再重新总结一次.
然后真正对于Integer 和 String变量 做比较时, 其实还有两个大坑
不多废话, 先上测试代码
看到运行结果是不是蒙了.
按照上面说的, 引用类型变量进行 == 比较时, 比较的是地址, 这样的话 i1 == i2结果为false我们可以理解. 但是i3 == i4 结果为true似乎解释不通.
实际上,对于-128 - 127之间的值, Integer对象从IntegerCache.cache中产生, 此范围内相同值的变量复用cache中对象, 所以指向的地址是相同的.因此i3 == i4 结果为true.
是不是更加懵逼了.
原理与Integer类似, 每个不同值的String类型变量其实是一个"常量". 单独的存储在一个特殊区域, 称为字符串常量池.
每个值不同的String变量在字符串常量池中都是唯一存在的.
举个栗子说明:
1 String s1 = "1"; 2 String s2 = "1"; 3 String s3 = "12"; 4 System.out.println(s1 == s2);//true 5 System.out.println(s2 == s3);//false
只是如此简单吗? 显然不可能.
来一个测试题: 可以自己思考下再看分析
1 String s1 = "123"; 2 String s2 = "456"; 3 String s3 = "123456"; 4 String s4 = s1 + s2; 5 System.out.println(s3 == s4); 6 System.out.println(s3.equals(s4));
结果顺序是:false, true.
是不是又有疑惑了,刚刚还说String变量值相同时, 指向常量池中同一个地址.怎么就false了呢?
其实对于第4行代码, 其原理是下面这样的
可以看到, 原理是先创建了一个StringBuilder对象,这个对象不是存在于字符串常量池中的哦! 然后分别将s1和s2拼接, 最后s4指向这个对象地址.
这样如果要进行大量的字符串拼接的话, 会创建很多对象, 造成资源浪费, 所以涉及到大量字符串拼接时建议使用StringBuffer(线程安全)或StringBuilder(非线程安全)来操作.
如果已经晕头转向了的话, 不防看下总结.
总结:
1. 对于引用类型变量(尤其是上面说到的两个), 做比较时, 推荐使用equals.
2. 字符串拼接时, 使用StringBuilder或StringBuffer来代替String.
3. 不要忽略基础的重要性, 无论学到什么时候, 基础都很重要.
4. 关注, 收藏.
PS:作者水平有限, 欢迎大佬指点不足.
原文链接:https://www.cnblogs.com/yinyinyin/p/11561196.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash