ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java 相等问题分析

2021-03-17 16:33:40  阅读:175  来源: 互联网

标签:分析 相等 java String equals short Student 12 public


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,String,equals,short,Student,12,public
来源: https://blog.csdn.net/qq_40660053/article/details/114931999

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有