java 相等问题分析

1,基本数据类型

 1.1类型提升

           对于基本数据类型,做四则运算时,默认遵循类型提升规则。其规律是 byte->(short,char)->int->long->float->double,其中的short和char不能相互默认转化,其中short,char,byte一旦参与运算就转换为int(除赋值外)。boolean从设计的角度,是希望用来描述逻辑运算的结果,或者作为条件变量,所以不希望boolean参与运算。

//验证转化规则
public static void main(String[] args) {
        short a=12;
        char b=12;
        a=b;//错误
        b=a;//错误
        
        b= (char) a;//正确
        a= (short) b;//正确
    }

//验证byte,short,char参与运算转化int
public static void test01() {
        short a=12;
        short c=12;
         a=a+c;
    }

1.2基本数据类型==分析

         定义两个相同基本数据类型的数x和y,  x==y 除了浮点类型外,我们都可以确定是x==y表达式的值是true。过去受c语言影响,对于浮点类型数据判断相等总是用|x-y|<0.001之类的方式来判断。

public static void main(String[] args) {
        int x=12;
        float y=12.0f;
        double z=12.0;
        float  k=12.000000001f;
        float  m=12.000000001f;
        System.out.println(k==m);//true  直接相等,c语言中|x-y|<0.0001的思路不合适java
        System.out.println(x==y);//true  类型提升,比较float
        System.out.println(y==z);//true   类型提升,比较doule
       

    }

1.3包装类型

   从设计的角度,是希望遵循规范,“==比较的是引用的值,equals比较的是对象的内容"。jdk11中已经禁用new Integer方式,避免常量池问题,破坏设计理念。

注:对于包装类,是希望和使用基本数据类型时一样,同时又有对象的特征

2,引用类型

   2.1String类型

            严格遵循“==比较的是引用的值,equals比较的是对象的内容"。同时由于它的不可变性,只要右边表达式中含有变量,就算equals相等,==返回的也是false。

     

 public static void main(String[] args) {
        String a = "123";
        String b = "12" + 3;
        int c = 3;
        String d="12"+c;
        String m=new String("123");
        System.out.println(a == b);//true
        System.out.println(d==a);//false
        System.out.println(a==m);//false
        System.out.println(a.equals(m));//true
    }

2.2其他类

         对于其他类,总是通过联合使用equals,hashcode方法来判断相等。从设计角度,是希望通过识别hashcode来区分不同的对象,但是由于散列算法有hash冲突,所以对于冲突的对象还需要用equals来判断。

package com.csm.ObjectDemo;
/**
测试hash值相同
*/
public class Student {
    private String id;
    private String name;

    Student() {
    }



    Student(String id, String name) {
        this.name = name;
        this.id = id;
    }

    @Override
    public int hashCode() {
        return 123;//哈希值相等
    }

    @Override
    public boolean equals(Object obj) {
        Student stu = null;
        if (obj instanceof Student)
            stu = (Student) obj;
        else
            return false;
        return this.id == stu.id;
    }

    public static void main(String[] args) {
        Student s1=new Student("CSM","1");
        Student s2=new Student("lisi","2");
        System.out.println(s1==s2);//false
    }
}

 

上一篇:java语言基础--byte、short、char的混合运算


下一篇:短训练序列---Verilog代码