Java集合(二)

**********************集合的预备知识---Object类的四个方法********************

一.toString()


通过重写Object类的toString()方法实现

对象的自我描述、自我介绍

 

public String toString(){

return 实例变量;
}


需求: Student类,新建两个对象 打印对象的所有属性

Student s1 = new Student(1, "aaa", 21);

System.out.println("学号:" + s1.getSno() + ",姓名:" + s1.getName() + ",年龄:" + s1.getAge());

Student s2 = new Student(2, "bbb", 22);

System.out.println("学号:" + s2.getSno() + ",姓名:" + s2.getName() + ",年龄:"+ s2.getAge());

以前是使用System.out.println() + getters()方法 来输出对象的所有属性,比较麻烦!

 

能不能简化?

可以.重写Object类的toString()方法

public class Student {

private int sno;
private String name;
private int age;

//构造函数和默认的构造函数

//setters()和getters()方法

@Override
public String toString(){
return "学号:" + this.sno + ",姓名:" + this.name + ",年龄:" + this.age;
}

}


测试代码


public class Test {

public static void main(String[] args) {

Student s1 = new Student(1, "aaa", 21);

System.out.println(s1);//直接打印s1 相当于 s1.toString()

}
}



如果没有重写Object类的toString(),默认的toString()方法 打印格式如下:


com.chapter12.Student@15db9742

类全名@对象的hashCode

 

****************************== 和 equals 的区别(面试题回顾)***********************************

(一)==

实质比较的是二进制位

(1) 基本类型

比较的是数值 数值相等 true 不相等 false

(2) 引用类型

比较的是地址 两个引用 引用的是同一个对象 返回true

引用的不是同一个对象 返回false


(二)equals

(1) String类的equals

比较的是字面值

(2)Object 类的 equals

相当于 == 判断两个引用 是否引用的是同一个对象


Student s1 = new Student();

Student s2 = new Student();

System.out.println(s1==s2);//判断s1和s2是否引用的是同一个对象 false

System.out.println(s1.equals(s2));//判断s1和s2是否引用的是同一个对象 false

 


**********************************二. Object类的equals()方法******************************


boolean equals(Object obj){


}


作用: 我们可以通过重写Object类的equals()方法 实现两个对象 意义上 相等 (意义上是同一个对象)


需求: 重写Object类的equals()方法 实现两张DVD意义上相等(意义上是同一张DVD)


我们认为 只要名称相同 和 价格相同 ,就是同一盘DVD


演示代码


public class DVD{


//重写equals 实现两张DVD意义上是同一张DVD
@Override
public boolean equals(Object obj){

//1.类型相同

//1. 使用instanceof 来判断 obj instanceof DVD
//2.使用反射来判断类型
if(obj.getClass()==DVD.class){ //类型相同
//2.自定义自己的相等规则
DVD otherDVD = (DVD)obj;

if(this.name.equals(otherDVD.getName())&&this.price == otherDVD.getPrice()){//名称相同&&价格相同
return true;
}else{
return false;
}
}else{
return false;
}
}

public static void main(String[] args) {
DVD dvd1 = new DVD(1,"神偷奶爸3",50);
DVD dvd2 = new DVD(2,"神偷奶爸3",50);
System.out.println(dvd1==dvd2);//false
System.out.println(dvd1.equals(dvd2));//true
}
}

 

使用instanceof 来判断对象的类型 有一点问题, 当我们传入的obj对象 碰巧是DVD的子类(例如BDDVD),而且BDVD对象的名称和价格又和

DVD的名称和价格相等,这样返回的也是true(意义上是同一张DVD),但是实际情况蓝光DVD和普通的DVD显然意义上不是同一款DVD..

如何解决??

使用反射

 

注意: 重写equals() 一定要重写hashCode()

 

三. 重写Object类的第三个方法 hashCode()


public int hashCode(){

return hashCode;
}


为什么要重写hashCode()?


加速查询


生活中查找音乐,可以把音乐放到不同的文件夹中 用于提高查询速度;编程中 hashCode()类似于文件夹,可以使用hashCode()

提高查询速度


生活中是把音乐存到文件夹中, 编程中 是把对象 存到集合中..


集合:也叫做容器.. 装对象的(装对象的引用)


生活中的容器, 杯子、碗...

 

重写hashCode的两个原则:


1. 两个对象 equals()比较结果是true, 它俩的hashCode值也要相同


因为equals()是两个对象 意义上是同一个对象, 内存中的<<我好想你>>,查询目标<<我好想你>>,意义上是同一个对象


这样在存的时候 <<我好想你>>的hashCode是苏打绿 ,如果对查询目标<<我好想你>>求hashCode 的出来的hashCode值

是周杰伦的话 永远也找不到这个对象了,所以两个对象equals是true,hashCode必须相同.

 

2. 重写equals时使用的条件, 重写hashCode时也要用

 

好的hash算法 要保证 一个桶中最好只有一个对象....

 

public class DVD{


@Override
public int hashCode(){
//dvd1对象 5 10 15
//dvd2对象 10 5 15
return this.name.hashCode() * 13 + new Integer(this.price).hashCode() * 17;
}
}

 


重写equals一定要重写hashCode(),如果不重写hashCode(),hashCode()默认是根据对象的地址算出来的


DVD dvd1 = new DVD(1,"神偷奶爸",50);
DVD dvd2 = new DVD(2,"神偷奶爸",50);

equals 比较结果是 true


键 hashCode


地址(0X0001) 0001


地址(OX0002) 0002

 

转载于:https://www.cnblogs.com/MrTanJunCai/p/9906811.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值