每天一道面试题

1.==和equals的区别

在java中有两种数据类型,一种是内置数据类型,也可称为基础数据类型byte、int、short、double、long、char、float、boolean。第二种是引用数据类型,也就是我们new出来的对象。

  • 基础数据类型比较应用==,比较的是他们的值。
  • 引用数据类型当他们用==进行比较的时候,是比较他们的地址。所以除非是同一个new的对象,他们的比较结果是true,否则都为false。JAVA当中所有的类都继承Object这个基类,在Object基类中定义了equals方法,这个方法的初始行为是比较对象的地址。但是在一些类库中这个方法被覆盖了,比如String、Data这些类中有自身实现的equles方法,而不在是比较对象在堆内存中的地址。
  • 对于引用数据类型之间,在没有重写equles方法的情况下,他们之间的比较还是比较他们在堆内存中的地址,因为Object中的equles方法的实现也是用的==比较,所以比较后的结果跟==号相等。

Object类的equles原码

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

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;
    }

2.String变量两种定义方式的区别

public static void main(String[] args) {
        // 第一种定义方式-字面量
        String str1 = "abc";
        String str2 = "abc";
        // 第二种定义方式-对象定义
        String str3 = new String("abc");
        String str4 = new String("abc");
        System.out.println(str1 == str2); // true
        System.out.println(str2 == str3); // false
        System.out.println(str4 == str3); // false
    }

使用字面量,第一次定义的时候会放在字符串常量池里,第二次定义的时候会先去常量池里面找,如果有返回地址,如果没有在字符串开辟一个新的空间返回地址。

使用对象定义,直接在堆中开辟一个空间存放,每new一个对象就开辟一个新的空间存放。

所以str1和str2指向的是同一个地址。str3和str4分别在不用的地址。

总结:字面量定义总是在字符串常量池中,对象定义总是在堆中,所以我们在工作中对比两个字符串最好是用equlse,而不是用==,因为你不确定他是怎么定义的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值