首页 > 其他分享 >比较 == 还是 equals

比较 == 还是 equals

时间:2023-01-03 11:35:44浏览次数:37  
标签:还是 System equals println Integer true 比较 out

比较 == ? equals?

结论:

  • 所有的引用数据类型包括包装类型 都用equals
  • 所有基本数据类型 都用==
public class Compare {
    public static void main(String[] args) {

        //基本数据类型, == 比较数值
        int i = 10;
        int j = 10;
        System.out.println(i == j); //true
        double d = 10.0;
        System.out.println(i == d); //true

        //引用数据类型 == 比较变量的内存地址
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        //s1与s2 同一块内存
        // java做了优化,将双引号"..."字符串放入字符串常量池 -- 视作常量
        System.out.println(s1 == s2); //true
        //s3构建新字符串对象 内存地址不在字符串常量池中
        System.out.println(s1 == s3); //false
        //引用对象比较内容 String类使用.equals()方法
        //String类对父类Object中的equals方法进行了重写  使其可以比较字符串内容
        System.out.println(s1.equals(s3)); //true

        User user1 = new User();
        User user2 = new User();

        //new创建的对象 新的内存地址 == 比较地址
        System.out.println(user1 == user2); //false
        //User类的.equals()方法没有重写时  equals方法内还是使用 == 进行比较
        System.out.println(user1.equals(user2)); //重写equals前false  重写equals后true

        //包装类型
        //int => Integer -- JVM实际上调用了 Integer.valueOf(int)
        //Integer 有1B缓存:-128 ~ 127 在缓存范围内调用.valueOf方法不会创建对象而是直接调用缓存
        //因此在-128 ~ 127内 == 判断为true -- 内存地址相同 而范围外 判断为false
        //所以应该尽量避免用 == 比较包装类型的对象
        Integer i1 = 100;
        Integer i2 = Integer.valueOf(100);
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1 == i2); //true
        System.out.println(i3 == i4); //false
        // 包装类或者说所有的引用数据类型 都用equals 所有基本数据类型 都用==
        System.out.println(i1.equals(i2)); //true
        System.out.println(i3.equals(i4)); //true
    }
}

class User{

    @Override
    public boolean equals(Object obj) {
        return true;
    }

    //一般重写equals 也会重写hashCode
    //根据hashcode的规则,两个对象相等其哈希值一定相等
    //如果只重写equals不重写hashCode 则equals相等时hashCode不相等 产生矛盾
    //以下是关于hashcode的一些规定:
    //    两个对象相等,hashcode一定相等
    //    两个对象不等,hashcode不一定不等
    //    hashcode相等,两个对象不一定相等
    //    hashcode不等,两个对象一定不等
    @Override
    public int hashCode() {
        return 1;
    }
}

标签:还是,System,equals,println,Integer,true,比较,out
From: https://www.cnblogs.com/Ashen-/p/17021560.html

相关文章