java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符。

做了几个小实验比较结果。

实验一:

String str1="ab";
String str2="ab";
System.out.println(s1==s2);//trueSystem.out.println(str1.equals(str2));//true

这里的str1与str2都指向了常量池中的同一对象,所以System.out.println(s1==s2);返回为true,当然,str1与str2二者字符串的值也是相同的。

实验二:

1 String str1="ab";
2 String str2="abc";
3 System.out.println(str1==str2);//false
4 System.out.println(str1.equals(str2));//false

这里的str1指向了字符串ab,初始时在常量池中并没有找到字符串abc,则开辟地址存储字符串abc,并将str2指向了abc字符串,所以str1与str2与并不是一个对象,他们的字符串值也不相同。

实验三:

1 String str1="ab";
2 String str2="ab";
3 String str6=str2;
4 System.out.println(str1==str6);//true
5 System.out.println(str2==str6);//true
6 System.out.println(str1.equals(str6));//true
7 System.out.println(str2.equals(str6));//true

这里将str2的值赋值给str6,因为常量池中已经存在了ab这个字符串,所以str1、str2与str6共享了同样的对象,==与equals同样返回true

实验四:

1 String str1= new String("abc");
2 String str2= "abc";
3 System.out.println(str1==str2);//false

创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。
以上代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。

实验五:

1 String str1="ab";
2 String str3=new String("ab");
3 String str4=new String("ab");
4 System.out.println(str3==str4);//false
5 System.out.println(str1.equals(str3));//true
6 System.out.println(str3.equals(str4));//true

因为str3与str4的字符串的值是相同的,所以str3.equals(str4)为true,但是由于str3与str4指向的不是同一个对象,所以str3==str4返回是false。同样因为str1与str3字符串的值是相同的,尽管str1与str3指向的不是同一个对象,str1.equals(str3)同样返回的是true

实验六:

 1 String str1="ab";
 2 String str3=new String("ab");
 3 String str4=new String("ab");   String str5=str3;
 4 System.out.println(str1.equals(str3));//true
 5 System.out.println(str3.equals(str4));//true
 6 System.out.println(str3.equals(str5));//true
 7 System.out.println(str4.equals(str5));//true
 8 System.out.println(str3==str5);//true
 9 System.out.println(str4==str5);//false
10 System.out.println(str1==str5);//false
11 System.out.println(str1.equals(str5));//true

这里将str3赋值给str5,所以str3与str5指向了同一对象,这样str3==str5返回为true值,str3.equals(str5)同样返回true值。由于str4与str5指向的不是同一对象,所以str4==str5返回false。但是也是因为字符串的值是相同的,所以str4.euqals(str5)返回为true值。

下面是以上实验所有的代码:

 1 public class Test
 2 {
 3     public static void main(String[] args)
 4     {
 5         String str1="ab";
 6         String str2="abc";
 7         String str6=str2;
 8         String str3=new String("ab");
 9         String str4=new String("ab");
10                 String str5=str3;
11         System.out.println(str1==str6);//true
12         System.out.println(str2==str6);//true
13         System.out.println(str1.equals(str6));//true
14         System.out.println(str2.equals(str6));//true
15         System.out.println(str1==str2);//true
16         System.out.println(str1.equals(str2));//true
17         System.out.println(str3==str4);//false
18         System.out.println(str1.equals(str3));//true
19         System.out.println(str3.equals(str4));//true
20         System.out.println(str3.equals(str5));//true
21         System.out.println(str4.equals(str5));//true
22         System.out.println(str3==str5);//true
23         System.out.println(str4==str5);//false
24         System.out.println(str1==str5);//false
25             System.out.println(str1.equals(str5));//true
26     }
27 }

将String类换成Integer包装类,测试代码及结果如下:

 1 class TestNumber
 2 {
 3     public static void main(String[] args)
 4     {
 5         Integer str1=23;
 6         Integer str2=23;
 7         Integer str6=str2;
 8         Integer str3=new Integer(23);
 9         Integer str4=new Integer(23);
10         Integer str5=str3;
11         System.out.println(str1==str6);//true
12         System.out.println(str2==str6);//true
13         System.out.println(str1.equals(str6));//true
14         System.out.println(str2.equals(str6));//true
15         System.out.println(str1==str2);//true
16         System.out.println(str1.equals(str2));//true
17         System.out.println(str3==str4);//false
18         System.out.println(str1.equals(str3));//true
19         System.out.println(str3.equals(str4));//true
20         System.out.println(str3.equals(str5));//true
21         System.out.println(str4.equals(str5));//true
22         System.out.println(str3==str5);//true
23         System.out.println(str4==str5);//false
24     }
25 }

补充说明:

Integer类的equals源码

1  public boolean equals(Object obj) {
2     if (obj instanceof Integer) {
3         return value == ((Integer)obj).intValue();
4     }
5     return false;
6     }  

可见,Integer中的equals中的是直接取得数值进行比较

而String中的equals源码如下:

 1 public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
 6             String anotherString = (String) anObject;
 7             int n = value.length;
 8             if (n == anotherString.value.length) {
 9                 char v1[] = value;
10                 char v2[] = anotherString.value;
11                 int i = 0;
12                 while (n-- != 0) {
13                     if (v1[i] != v2[i])
14                             return false;
15                     i++;
16                 }
17                 return true;
18             }
19         }
20         return false;
21     }

可见,String类中的源码与Integer中的有所不同,不同之处在于先采用了==方式进行比较,如果不是同一个对象再比较值,可见这个equals函数适用于存储在常量池中的字符串,例如

1 String str1="ab";
2 String str2="ab";
3 System.out.println(str1.equals(str2));

str1与str2的比较equals方法中的

1 if (this == anObject) {
2            return true;
3       }

进行比较得出的true

而下面的例子:

1 String str3=new String("ab");
2 String str4=new String("ab");
3 System.out.println(str3.equals(str4));

str3与str4由于不是同一对象,所以if(this==anObject)不符合条件,所以进行下面字符串值的比较,最后返回true

下面的例子同理

String str5="abc";
String str6=new String("abc");
System.out.println(str5.equals(str6));

但这里还有一个陷阱,就是Integer类,可以参考这个类的源码,知道了Integer类缓存了-128到127,官方的解释是小的数字使用的频率比较高,超过这个范围的时候就会执行new Integer,可见如下代码

Integer a=1000;
Integer b=1000;
System.out.println(a==b);//false;

是正确的

但是一旦两个变量a与b被赋值为100,结果就是true

如下代码:

Integer a=new Integer(1000);
int b=1000;
Integer c=new Integer(1000);
Integer d=new Integer(1000);
System.out.println(a==b);//true
System.out.println(c==d);//false 

由于c与d是new Integer得到的结果,并没有使用缓存,所以c与d并不是同一个对象,输出的结果是false

但是a与b为什么是true呢?

因为Integer与int进行==比较的时候,java会把Integer自动拆箱,转为int类型,这样就a与b就指向了同一对象,所以会输出true

转载于:https://www.cnblogs.com/yangxiaoguai132/p/5035316.html

关于java中equals与==的区别的小实验相关推荐

  1. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  2. 捉虫记 C++转java Java中equals和==的区别

    java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号( ...

  3. java 中equals和==的区别

    java9举例代码: 1 String str1 = "abc"; 2 String str2 = "abc"; 3 String str3 = new Str ...

  4. java中equals和 == 的区别

    摘自:https://blog.csdn.net/weixin_37690143/article/details/79767761 1.功能不同 "=="是判断两个变量或实例是不是 ...

  5. Java中 equals和==的区别?

    针对两种数据类型而言: 对于基本数据类型:==比较它们的值是否相等,而equals不能比较基本数据类型! 对与引用数据类型:equals和==都是比较引用变量是否引用到堆上的同一对象. 注意:以上是针 ...

  6. Java中 equals() 和 == 的区别

    1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 "值"是否相等: 如果作用于引用类型的变量,则比较的是所指向的对象的地址 2)对于equals方法,注意:equal ...

  7. c语言equals用法,C# 中 equals( ) 和 == 的区别和用法

    Equals: 下面的语句中,x.y 和 z 表示不为 null 的对象引用. * 除涉及浮点型的情况外,x.Equals(x) 都返回 true. * x.Equals(y) 返回与 y.Equal ...

  8. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  9. Java中equals()和“==”区别

    Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...

最新文章

  1. 非关系型数据库-NoSQL(Redis)
  2. 智能车竞赛华南赛区湖北文理学院赛点
  3. oracle 越南字符,ORACLE 12.2RAC之问题 ora.chad OFFLINE
  4. Register-SPWorkflowService 远程服务器返回错误: (404) 未找到
  5. 上海交通大学计算机专业有调剂吗,上海交通大学2019计算机系考研调剂信息
  6. C#委托和事件(3)
  7. 2020级C语言大作业 - 鸭王争霸赛
  8. spring ioc控制反转
  9. [TACL18]隐式句法树模型真的能学到句子中有意义的结构吗?
  10. 【转】平时看到的比较好的一篇文章,送给通信专业的学生
  11. Douyu0.6.1 源码分析 之 MVC篇
  12. SQL语句----CASE WHEN 的用法简介
  13. 西瓜视频运营策略分析:借助平台优势实现内容升级
  14. Maven的下载与配置 和在IDEA中创建Maven的项目
  15. 交换游戏 (记忆化搜索 状压)
  16. windows查看并获取文件的md5值
  17. app闪退之-- GL error: Out of memory!
  18. Qt: QWidget::paintEngine: Should no longer be called
  19. 基于JavaScript的简易计算器(可处理连续加减乘除运算)
  20. Qt for Automation 介绍

热门文章

  1. vue对象深拷贝_JS 对象的深拷贝和浅拷贝
  2. Shell脚本编程之(二)简单的Shell脚本练习
  3. Ray︱高性能的分布式执行引擎 起个头~
  4. R语言︱文本挖掘——词云wordcloud2包
  5. [postgresql]postgresql的聚合函数sql实例
  6. TypeScript 再次发布一个奇怪的版本:3.3.4000
  7. 办公用品管理系统VB——模块
  8. Win10右键添加获取管理员权限
  9. 图片加载完后执行事件
  10. CentOS的ssh sftp配置及权限设置整理