Java中equals和==的区别

本文探讨Java中基本数据类型,重点讲解equals和==的区别。==用于比较基本类型值或对象的内存地址,而equals默认比较引用对象的地址,但Integer等类重写了equals比较内容。在String对象的创建中,直接赋值会在常量池中查找或创建,使用new关键字则会在堆中创建新对象。举例说明`String a="123"`和`String b=new String("123")`的内存分配差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中基本数据类型

数值型: 整数类型(byte、int、long、short)、浮点类型(double、float)
字符型 :char
布尔型:boolean

equals和==的区别

==

  • 比较基本数据类型时,比较的是表面值内容
  • 比较两个对象时,比较的是两个对象的内存地址值

equals

  • 不能作用于基本类型变量的比较
  • 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;Integer、String等类对equals方法进行了重写,比较的是所指向的对象的内容
boolean flag1=true;
boolean flag2=true;
System.out.println(flag1==flag2);
System.out.println("=============");
Integer a=5;
Integer b=5;
System.out.println(a.equals(b));//true
System.out.println(a==b);//true
System.out.println("=============");
Integer c=new Integer(6);
Integer d=new Integer(6);
System.out.println(c==d);  //false
System.out.println(c.equals(d)); //true
System.out.println("=============");
String str1="123";
String str2="123";
System.out.println("=============");
System.out.println(str1.equals(str2)); //true
System.out.println(str1==str2); //true
System.out.println("=============");
String str3=new String("456");
String str4=new String("456");
String str5=str3;
System.out.println(str3==str4);  //false
System.out.println(str3==str5);  //true
System.out.println(str5.equals(str3)); //true

下面这段代码返回true的原因

Integer a=5;
Integer b=5;
System.out.println(a==b);//true

因为定义一个Integer变量时,会默认进行Integer.valueOf(a)操作

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

high的值为127,low的值为-128。
当进行这个方法时如果值在-128-127之间,返回的值也就是地址是相同的,即a和b的地址相同

a=b=128时输出为false

String和new String的区别

String a="123";String b=new String("123"); 的区别

String a="123";
String b="123";
System.out.println(a==b); //a和b的地址一样,输出为true
String c=new String("123");
String d=new String("123");
System.out.println(c==d);  //c和d的地址不一样,输出为false
System.out.println(System.identityHashCode(a)); //245257410
System.out.println(System.identityHashCode(b)); //245257410
System.out.println(System.identityHashCode(c)); //1705736037
System.out.println(System.identityHashCode(d)); //455659002
  • 如果a==b,那么System.identityHashCode()一定相等
  • 如果System.identityHashCode()相等,不能保证a==b

对象和变量的概念

  • a和b都为变量
  • 对象通过new在堆中创建,关键字new绝对会在堆空间创建内存区域。

所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在常量池中,常量池的一个好处就是可以把相同的字符串合并,占用一个空间。

String a="123";
String b="123";
System.out.println(a==b); //所以a和b的地址一样,输出为true

string a="123";

直接给变量a赋值123,存储在常量池中。

如果常量池中存在“123”,a直接引用,此时不创建String对象;如果常量池中不存在"123",先在常量池先创建“123”内存空间,再引用。

string a="123";最多创建一个String对象,最少不创建String对象。

String b=new String("123");

通过构造器构造

String b=new String("123")中的123本身就是常量池中的一个变量,在运行 new String()时,把常量池中的字符串123复制到堆中,并把这个对象的应用交给b,所以创建了两个String对象,一个在常量池中,一个在堆中。

String b=new String("123"); 最多创建两个String对象,最少创建一个String对象。

String a="123"和String b=new String(“123”)结合的例子

String a="123";
String b=new String("321");
System.out.println(a==b);  //false
System.out.println("================");
b="123";
System.out.println(a==b);  //true

String a="123"String b=new String("123")的区别内存的分配方式不一样,前者是在常量池中,后者是在堆内存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值