标签:string类 hash算法 实例变量 instance 面试 解决 *** 生活 最好
**********************集合的预备知识---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
标签:string类 hash算法 实例变量 instance 面试 解决 *** 生活 最好
原文地址:https://www.cnblogs.com/MrTanJunCai/p/9906811.html