==和equals的区别---java基础巩固

1、==

对于基本类型,比较值是否相同

对于引用类型,比较引用是否相同

eggs:

String x = "string";

String y = "string";

String z = new String("string");

System.out.println(x==y); //输出true

System.out.println(x==z); //输出 false

代码解读:因为z 重新开辟了一块内存出来,所以与x比较时引用位置不同,故为false;

此处有人可能会问,为何 x 和 y创建之后引用会想同,明显x和y不是一个对象,这里会涉及到一个知识点,String:字符串常量池

字符串常量池

JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化

  • 为字符串开辟一个字符串常量池,类似于缓存区

  • 创建字符串常量时,首先坚持字符串常量池是否存在该字符串

  • 存在该字符串,返回引用实例,不存在,实例化该字符串并放入池

故此处当创建了一个x时发现常连池没有,则此时在常量池创建“string”并返回给x一个引用,再创建y时发现字符串常量池已经存在“string”,故此时创建y时会返回一个“string”的引用,此时用==比较x、y时会返回一个true,因为他俩引用了同一个东西

equals 解读

equals 的本质就是 ==,因为 String 和 Integer 重写了 equals,把他变成了直接对值进行比较,我们看一下equals对于对象的比较

public class Student {

    private String name;

    public Student(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}
Student s1 = new Student ("张三");
Student s2 = new Student ("张三");
System.out.println(s1 .equals(s2)); // 输出false

为何输出false?我们看下equals与源码

public boolean equals(Object obj) {    return (this == obj);}

这就明白了,一般情况下equals就相当于==

String s1 = new String("李四");
String s2 = new String("李四");
System.out.println(s1.equals(s2)); // 输出true

这是为何,我们看下String的equals的源码

public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String anotherString = (String)anObject;        int n = value.length;        if (n == anotherString.value.length) {            char v1[] = value;            char v2[] = anotherString.value;            int i = 0;            while (n-- != 0) {                if (v1[i] != v2[i])                    return false;                i++;            }            return true;        }    }    return false;}

String重写了equals方法,改为了直接对值的比较,故上述相等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值