0


Java中==和equals区别

文章目录

Java中==和equals区别

  • equals是方法,==是运算符
  • ==: 如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址是否相等
  • equals():用来比较两个对象的内容是否相等注意::equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址

1. Integer中==和equals的问题

1.1 Integer类型且不是通过new创建的比较

Integer类型且值[-128,127]在这个范围,并且不是通过new创建,这时候会调用Integer.valueOf()自动装箱方法,在这个方法中,值[-128,127]在这个范围则会从缓存中去取对象而不是new一个对象;否则重新new对象

publicstaticIntegervalueOf(int i){if(i >=IntegerCache.low && i <=IntegerCache.high)returnIntegerCache.cache[i +(-IntegerCache.low)];returnnewInteger(i);}
/**
 * 值位于[-128,127]之间则会从缓存中去取,而不是重新new一个对象
 */Integer x =100;Integer y =100;System.out.println(x==y);//true/**
 * 都是Integer并且两者的值不是在[-128,127]之间
 * 这时返回的是重新new出来两个对象,因此这两个对象的地址不同,故==比较的值不同
 * 要想返回值相同需要使用equals方法
 */Integer a =128;Integer b =128;System.out.println(a==b);//falseSystem.out.println(a.equals(b));//true

1.2 手动new Integer()创建的比较

手动new Integer()创建对象,不走自动装箱机制,没有调用Integer.valueOf()方法,使用==比较的地址是不同的

/**
  * 自己手动new Integer创建了了两个对象
  * 不走自动装箱机制,没有调用Integer.valueOf()方法,这是两个不同的对象,故==比较的地址是不同的
  * 要比较两个值,需要使用equals方法
  */Integer m =newInteger(120);Integer n =newInteger(120);System.out.println(m==n);//falseSystem.out.println(m.equals(n));//true

1.3 Integer和int比较

Integer和int使用==比较的是值,而不是内存地址

Integer a1 =newInteger(110);int a2 =110;Integer a3 =110;System.out.println("a1==a2 is "+(a1==a2));//a1==a2 is trueSystem.out.println("a2==a3 is "+(a2==a3));//a2==a3 is trueSystem.out.println("a1==a3 is "+(a1==a3));//a1==a3 is falseSystem.out.println("a1.equals(a2) is "+a1.equals(a2));//a1.equals(a2) is trueSystem.out.println("a3.equals(a2) is "+a3.equals(a2));//a3.equals(a2) is trueSystem.out.println("a1.equals(a3) is "+a1.equals(a3));//a1.equals(a3) is true

注意:

  1. a1是new Integer()创建的对象,没有调用Integer.valueOf()自动装箱方法,而a3是会调用Integer.valueOf()自动装箱方法从缓存中取到的对象,a1==a3返回是false。
  2. a1.equals(a2)没有问题,a2.equals(a1)会报错Cannot resolve method ‘equals(java.lang.Integer)’

2. String中==和equals的问题

String str1 ="abc";String str2 =newString("abc");String str3 ="abc";String str4 =newString("abc");/**
 * str2和str2不同引用地址
 */System.out.println("str1==str2 is "+(str1==str2));//str1==str2 is false/**
 * str1和str3都在公共池中,引用相同
 */System.out.println("str1==str3 is "+(str1==str3));//str1==str3 is true/**
 * str2和str4堆中不同引用地址
 */System.out.println("str2==str4 is "+(str2==str4));//str2==str4 is falseSystem.out.println("str1.equals(str2) is "+str1.equals(str2));//str1.equals(str2) is trueSystem.out.println("str1.equals(str3) is "+str1.equals(str3));//str1.equals(str3) is trueSystem.out.println("str2.equals(str4) is "+str2.equals(str4));//str2.equals(str4) is true

3. Demo

publicclassTestEquals{publicstaticvoidmain(String[] args){//testInteger();testString();}privatestaticvoidtestString(){String str1 ="abc";String str2 =newString("abc");String str3 ="abc";String str4 =newString("abc");/**
         * str2和str2不同引用地址
         */System.out.println("str1==str2 is "+(str1==str2));//str1==str2 is false/**
         * str1和str3都在公共池中,引用相同
         */System.out.println("str1==str3 is "+(str1==str3));//str1==str3 is true/**
         * str2和str4堆中不同引用地址
         */System.out.println("str2==str4 is "+(str2==str4));//str2==str4 is falseSystem.out.println("str1.equals(str2) is "+str1.equals(str2));//str1.equals(str2) is trueSystem.out.println("str1.equals(str3) is "+str1.equals(str3));//str1.equals(str3) is trueSystem.out.println("str2.equals(str4) is "+str2.equals(str4));//str2.equals(str4) is true}privatestaticvoidtestInteger(){/**
         * 都是Integer且值都在[-128,127]之间,并且不是通过new创建
         * 值位于[-128,127]之间则会从缓存中去取,而不是重新new一个对象
         */Integer x =100;Integer y =100;System.out.println(x==y);//true/**
         * 都是Integer并且两者的值不是在[-128,127]之间,并且不是通过new创建
         * 这时返回的是重新new出来两个对象,因此这两个对象的地址不同,故==比较的值不同
         * 要比较两个值,需要使用equals方法
         */Integer a =128;Integer b =128;System.out.println(a==b);//falseSystem.out.println(a.equals(b));//true/**
         * 自己手动new Integer创建了了两个对象
         * 因为手动new,所以不走自动装箱机制,没有调用Integer.valueOf()方法,这是两个不同的对象,故==比较的地址是不同的
         * 要比较两个值,需要使用equals方法
         */Integer m =newInteger(120);Integer n =newInteger(120);System.out.println(m==n);//falseSystem.out.println(m.equals(n));//trueInteger a1 =newInteger(110);int a2 =110;Integer a3 =110;System.out.println("a1==a2 is "+(a1==a2));//a1==a2 is trueSystem.out.println("a2==a3 is "+(a2==a3));//a2==a3 is trueSystem.out.println("a1==a3 is "+(a1==a3));//a1==a3 is falseSystem.out.println("a1.equals(a2) is "+a1.equals(a2));//a1.equals(a2) is trueSystem.out.println("a3.equals(a2) is "+a3.equals(a2));//a3.equals(a2) is trueSystem.out.println("a1.equals(a3) is "+a1.equals(a3));//a1.equals(a3) is true}}
标签: java

本文转载自: https://blog.csdn.net/stormkai/article/details/129351847
版权归原作者 stormkai 所有, 如有侵权,请联系我们删除。

“Java中==和equals区别”的评论:

还没有评论