1.Object类
1.1toString();
String
toString()
返回对象的字符串表示形式
public String toString()返回对象的字符串表示形式。 一般来说,
toString
方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。该
toString
类方法Object
返回一个由其中的对象是一个实例,该符号字符的类的名称的字符串
@` ”和对象的哈希码(内存地址)的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())
1.2equals方法
boolean
equals(Object obj)
指示一些其他对象是否等于此。
boolean eaqual(Object obj);
public boolean equals(Object obj) { return (this == obj); }Object 类下面的方法比较是两个对象的地址。不看内容的
为啥String类下面的equals方法比较的是内容呢?String类继承了Object
equals方法重写了Object类下面的。为啥重写?
当父类的需求,满足不了子类的需求的时候要重写父类的方法
1.3hashCode方法
哈希码值:在Object类下面,将内存地址(十六进制的值)转为十进制的值,此时这个十进制的值就叫hash码。
返回对象的哈希码值。 支持这种方法是为了散列表,如HashMap提供的那样 。
hashCode
的注意事项是:
-
只要在执行Java应用程序时多次在同一个对象上调用该方法,
hashCode
方法必须始终返回相同的整数,前提是修改了对象中equals
比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。 -
如果根据
equals(Object)
方法两个对象相等,则在两个对象中的每个对象上调用hashCode
方法必须产生相同的整数结果。 -
不要求如果两个对象根据equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用
hashCode
方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。
尽可能多的合理实用,由类别Object
定义的hashCode方法确实为不同对象返回不同的整数。 (hash码的值通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。)
注意:无论何时重写equals方法,通常需要重写hashCode
方法,以便维护hashCode
方法的通用合同,该方法规定相等的对象必须具有相等的哈希码
2.Set集合
也是一个接口,父接口是Collection
存储数据的特征:无序的,不可重复的
HashSet实现类:依靠hash值进行存储的,如果两个元素的hash值一样的话,就不再进行存储重复的那个元素了
TreeSet:底层是二叉树,对存储数据进行自然排序
2.1.HashSet
package com.qfedu.a_test; import java.util.HashSet; import java.util.Set; public class Demo1 { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("a"); set.add("b"); set.add("bc"); set.add("c"); System.out.println(set);//[a, bc, b, c] Set<Integer> set1 = new HashSet<>(); set1.add(16); set1.add(6); set1.add(36); set1.add(23); System.out.println(set1);//[16, 36, 6, 23] } }
HashSet集合存对象
总结:以后set集合中如果想存对象的时候,要求对象的内容如果一样的话,不能存到set集合中,咋办?重写equals方法和hahsCode方法
package com.qfedu.a_test; import java.util.HashSet; import java.util.Objects; import java.util.Set; class Dog{ int age; String name; public Dog(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Dog{" + "age=" + age + ", name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Dog dog = (Dog) o; return age == dog.age && Objects.equals(name, dog.name); } @Override public int hashCode() { return Objects.hash(age, name); } } public class Demo2 { public static void main(String[] args) { Set<Dog> set = new HashSet<>(); Dog dog1 = new Dog(2, "狗蛋"); Dog dog2 = new Dog(2,"狗蛋"); set.add(dog1); set.add(dog2); System.out.println(set); } }
2.2.TreeSet
TreeSet中存对象会出现类转换异常的错误,需要去实现Compareable这个接口,Compareto去对比两个对象的int类型的数值,如果相等,就不再存储那个相等的对象。
package com.qfedu.a_test; import java.util.Set; import java.util.TreeSet; class Student implements Comparable<Student>{ String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Student o) { System.out.println(12); int num = this.age - o.age; return num; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Demo3 { public static void main(String[] args) { Set<Student> set = new TreeSet<>(); Student stu1 = new Student("张三",23); Student stu2 = new Student("李四",32); Student stu3 = new Student("王五",42); Student stu4 = new Student("赵六",12); set.add(stu1); set.add(stu2); set.add(stu3); System.out.println(set); /* 12 12 12 12 [Student{name='张三', age=23}, Student{name='李四', age=32}, Student{name='王五', age=42}] */ } }