== 与 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变量在字符串常量池中都是唯一存在的.

举个栗子说明:

 String s1 = "1";
String s2 = "1";
String s3 = "12";
System.out.println(s1 == s2);//true
System.out.println(s2 == s3);//false

只是如此简单吗? 显然不可能.

来一个测试题: 可以自己思考下再看分析

 String s1 = "123";
String s2 = "456";
String s3 = "123456";
String s4 = s1 + s2;
System.out.println(s3 == s4);
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:作者水平有限, 欢迎大佬指点不足.

Java中关于Integer, String 类型变量 == 与 equals 判断的坑的更多相关文章

  1. 【Java】Java中常用的String方法

    本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...

  2. Java 中要将 String 类型转化为 int 类型

    在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...

  3. Java中如何将String转成Date

    Java中如何将String转成Date 最近在开发Json数据反序列化为Java对象的时候发现spring mvc 和 Jackson 对Date类型对支持不是特别好,虽然在Java对象序列化为Js ...

  4. Java中的Integer和int

    Java中的Integer是引用类型,而int是基本类型.Integer是int的包装器类型. java中的基本类型有布尔类型boolean;字符类型char;整数类型byte,int,long,sh ...

  5. Java中InputStream和String之间的转化

    https://blog.csdn.net/lmy86263/article/details/60479350 在Java中InputStream和String之间的转化十分普遍,本文主要是总结一下转 ...

  6. java中如何将string 转化成long

    1.Java中如何将string 转化成long long l = Long.parseLong([String]); 或 long l = Long.parseLong([String],[int ...

  7. JAVA中简单的for循环竟有这么多坑,你踩过吗

    JAVA中简单的for循环竟有这么多坑,你踩过吗 实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧? 很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式 ...

  8. Java中数据类型转换&基本类型变量和对象型变量

    1.Java的数据类型分为三大类 布尔型,字符型和数值型 其中数值型又分为整型和浮点型 2.Java的变量类型 布尔型 boolean 字符型 char 整型    byte,short,int,lo ...

  9. 转!!java中Object转String

    Object转为String的几种形式 在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString ...

随机推荐

  1. Codeforces Round #580 (Div. 2)

    这次比上次多A了一道,但做得太慢,rating还是降了. Problem A Choose Two Numbers 题意:给出两个集合A,B,从A,B中分别选出元素a,b使得a+b既不属于集合A,又不 ...

  2. codeforces#1150D. Three Religions(dp+序列自动机)

    题目链接: https://codeforces.com/contest/1150/problem/D 题意: 给出长度为$n$的字符串,和$q$次询问 每次询问是,给$x$宗教增加一个字符$key$ ...

  3. Java 显示锁 之 重入锁 ReentrantLock(七)

    ReentrantLock 重入锁简介 重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁.另外,该锁还支持获取锁时的公平与非公平性的选择. 重入锁 ReentrantL ...

  4. Redis 延迟指标监控

    Redis 延迟监控框架 Redis 2.8.13 引入了Latency Monitoring的一个新功能,可以帮助我们检查和排查引起延迟的原因. Latecny Monitoring 由如下组成: ...

  5. CountDownLatch和CylicBarrier以及Semaphare你使用过吗

    CountDownLatch 是什么 CountDownLatch的字面意思:倒计时 门栓 它的功能是:让一些线程阻塞直到另一些线程完成一系列操作后才唤醒. 它通过调用await方法让线程进入阻塞状态 ...

  6. 使用Xshell链接阿里云服务

    1.下载Xshell,进入xshell官网 https://xshell.en.softonic.com/,选择免费版本进行下载,在该页面https://www.netsarang.com/zh/fr ...

  7. Qt 插件学习(一)

    插件是什么 注意:这儿暂时不考虑静态插件(潜意识中总觉得它根本就不算插件). 插件是一个动态库(共享库).动态库是一个独立的文件中的独立模块,可被多个程序访问. 先看动态库的两种用法 1. 程序链接时 ...

  8. pytorch-googleNet

    googleNet网络结构 输入网络: 由4个分支网络构成 第一分支: 由1x1的卷积构成 第二分支: 由1x1的卷积,3x3的卷积构成 第三分支: 由1x1的卷积, 5x5的卷积构成 第四分支: 由 ...

  9. JDK与CGlib动态代理的实现

    应用的原型为 执行者:房屋中介Agency(分为JDKAgency.CGlibAgency) 被代理对象:程序员Programmer 被代理对象的实现接口:租户Tenement(CGlibAgency ...

  10. Mysql查询某字段重复值并删除重复值

    1.查询重复值: select code,count(*) as count from hospital group by code having count>1; 该语句查询code重复值大于 ...