使用 == 和 equals比较:
1.== 一般比较的是基本数据类型,equals比较的是引用类型 2.==比较的是对象内容,equals比较的是对象的地址. 如果equals重写了,例如String,那么此时equals比较的就是具体对象内容 3.如果使用 == 比较引用类型,他们比较的是地址. 那是否相等,就看是new 还是 非new 的方式了. 使用new的时候,铁定不一样.因为new会在堆中重新分配内存 不使用new方法的时候,会从常量池[缓存]去获取,比较地址是否一样.同一个string常量,那么==为true,不相等,则为false Integer只有值在[-128.127]区间时 才会在常量池中缓存. equals方法不能用于比较基本数据类型的变量. |
public class test {
public static void main(String[] args) {
/**Integer: 在不使用 new 新建对象时,统一从常量池中获取, 有缓存。
* 数值在[-128-127]中的,两个值会相等
*
* 2:使用new创建对象,new 的对象和数组会存放在堆中,那么就会开辟新的地址,此时你的 Integer变量值/引用值 存放的是指向堆的地址
*/
Integer a = 100;
Integer b = 110;
System.out.println("a == b->"+ (a ==b)); // a == b ->false
Integer b2 = 100;
System.out.println("a == b2->"+ (a ==b2)); //a == b2 ->true
Integer a2 = 1000;
Integer b2 = 1000;
System.out.println("a2 == b2->"+ (a2 ==b2)); // a2 == b2 ->false, 超过了-128,127的范围, 那么它比较的是存放在堆中的地址。
Integer Newa = new Integer(100);
Integer Newb = new Integer(100);
System.out.println("Newa == bNew ->"+ (Newa == Newb)); // Newa == Newb ->false
System.out.println("Newa.equals( Newb)->"+ (Newa.equals( Newb))); // Newa.equals( Newb)->true
/**
* String类型: 重写了equals()方法,此时equals比较内容
* == 对于基本数据类型来讲,就是比较内容, == 对于引用类型比较时就是 比较地址,指向对象在堆中的地址.
* 对于非new 产生的对象,那么就会从常量池中获取
*/
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2->"+(s1==s2)); //s1 == s2->true。会从常量池中获取,所以非 new生成的引用类型对象,==是在比较地址,但地址一样
System.out.println("s1.equals(s2)->"+(s1.equals(s2))); // s1.equals(s2)->true, 会从常量池中获取
String t1 = new String("abc");
String t2 = new String("abc");
System.out.println("t1 == t2->"+(t1==t2)); //t1 == t2->false, ==比较引用类型的地址值,比较基本数据类型的内容
System.out.println("t1.equals(t2)->"+(t1.equals(t2))); // t1.equals(t2)->true, 重写equals,比较对象内容
int num1 = 2;
int num2 = 2;
System.out.println("num1 == num2->"+(num1==num2));
//System.out.println("num1.equals(num2)->"+(num1.equals(num2))); // int 类型没有equals()方法
}
}