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