目录
1.基本数据类型
byte,char,short,int,float,double,long,boolean
基本数据类型通过等号"=="进行数值间的比较.
例如:
public static void main(String[] args) {
int a=12;
int b=3;
System.out.println(a==b);//false
}
2.引用类型
1.基本数据类型包装类
byte-->Byte char-->Character short-->Short int-->Integer float-->Float double-->Double long-->Long boolean-->Boolean
- 在缓存范围内可以通过==进行比较
在java中为了节省对象的时间开销,在缓存范围内数字相同可视为同一个对象 .Byte,Short,Integer,Long的缓存范围为-127-128.Character为0-127.
同缓存范围内的数是通过自动装箱来创建对象的,数字相同,用==比较结果相同,但是,如果用关键字new创建对象的话,即使同数值并且在缓存范围内,比较结果也是false.
public static void main(String[] args) {
Integer a=127;
Integer b=127;
Integer a1=new Integer(127);
Integer b1=new Integer(127);
Integer a2=128;
Integer b2=128;
System.out.println(a==b);//true---在缓存范围内
System.out.println(a1==b1);//false---new的对象
System.out.println(a2==b2);//false--不在缓存范围内
}
- 调用包装类中的equals方法
public static void main(String[] args) {
Integer a=new Integer(127);
Integer b=new Integer(127);
Long a1=new Long(12);
Long b1=new Long(12);
System.out.println(a.equals(b));//true
System.out.println(a1.equals(b1));//true
}
源码:
2.引用类型
首先,我们自定义一个Student类,属性有id,name.
public class Student {
public int id;
public String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
引用类型有三种比较方法:
- equals方法,默认为Object类中的equals方法---判断对象是否相等.
如果要比较别的,则可以重写equals方法!!!
举例,我们创建两个对象,学号一样,名字也一样:
public static void main(String[] args) {
Student st1=new Student(85,"陈宇");
Student st2=new Student(85,"陈宇");
//equals
System.out.println(st1.equals(st2));//false---这里默认为Object中的equals
}
源码:
此时,我们只想要比较数值是否相等,则对equals方法进行重写
public class Student {
public int id;
public String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
再次进行比较,结果为true.
equals方法只能判断相不相等,不能比较大小.由此,我们引入第二种方法.
- 重写Comparable中的CompareTo方法
public class Student implements Comparable<Student>{
public int id;
public String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo(Student o) {
if(o==null){
return 1;
}
return this.id-o.id;
}
/*
* return >0 this 比 o大
* return==0 this 跟o相等
* return<0 this 比 o小
*/
public static void main(String[] args) {
Student st1=new Student(85,"陈宇");
Student st2=new Student(105,"顾魏");
System.out.println(st1.compareTo(st2));//<0
}
陈宇的学号小于顾魏,所以s1<s2.
可是,这里遇到一个问题,一旦重写CompareTo方法就意味着代码被写死,一直会按照id的大小进行比较,由此我们引入第三种方法.
- 自定义比较器类,实现Comparator接口
public interface Comparator<T>{
int compare(T o1,T o2);
}
class StudnetComparator implements Comparator<Student>{
@Override
public int compare(Student o1,Student o2) {
return o1.name.compareTo(o2.name);
}
}
此时这里的compareTo方法是String类中的:
进行比较:
public static void main(String[] args) {
Student st1=new Student(85,"陈宇");
Student st2=new Student(105,"顾魏");
StudnetComparator stcmptor=new StudnetComparator();
System.out.println(stcmptor.compare(st1,st2));//<0
}
- 三种方式对比
总结
祝大家健健康康顺顺利利,下次见!!!!!!!