Idea自动生成HashCode和equals视频链接
https://live.csdn.net/v/330419
实体类 对name和age两个属性重写hashCode,equals方法
package TestEqualsHashCode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Objects;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student {private String name;private int age;private String address;private String school;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
测试
@Testpublic void test1(){Student s1 = new Student("张三",11,"河南","太康");Student s2 = new Student("李四",66,"郑州","扶沟");Student s3 = new Student("张三",11,"河北","武汉");Student s4 = new Student("李四",66,"广东","深圳");Set<Student> students = new HashSet<>();students.add(s1);students.add(s2);students.add(s3);students.add(s4);System.out.println(students);}
运行结果
[Student(name=李四, age=66, address=郑州, school=扶沟), Student(name=张三, age=11, address=河南, school=太康)]
**> 使用map联合equals和hashCode来实现去重
HashMap存储自定义类型键值: (扩展方法的快捷键 Ctrl+Alt+M)
Map集合保证key是唯一的,作为key的元素,必须重写hashCode()和equals()方法,以保证key唯一。**
HashMap存储自定义类型键值:-key:String类型String类型重写hashCode()方法和equals()方法,可以保证key唯一。-value:Person类型-value可以重复(同名同年龄的人视为同一个,覆盖)
HashMap存储自定义类型键值
Map集合保证key是唯一的:作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一HashMap存储自定义类型键值key:Person类型Person类就必须重写hashCode方法和equals方法,以保证key唯一value:String类型可以重复
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student {private String name;private int age;private String address;private String school;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
@Testpublic void test2() {Student s1 = new Student("张三",11,"河南","太康");Student s2 = new Student("李四",66,"郑州","扶沟");Student s3 = new Student("张三",11,"河北","武汉");Student s4 = new Student("李四",66,"广东","深圳");HashMap<Student,String> map = new HashMap<>();map.put(s1,"中国");map.put(s4,"韩国");map.put(s3,"意大利");map.put(s2,"美国");System.out.println(map);}
运行结果
{Student(name=李四, age=66, address=广东, school=深圳)=美国, Student(name=张三, age=11, address=河南, school=太康)=意大利}
集合的常用分类
List集合有序,可重复
分类:ArrayList:集合数据存储的结构是数组结构。元素增删慢,查找快LinkedList:集合数据存储的结构是链表结构。查找慢,增删快
Set集合,无序,不可重复分类:HashSet:它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致),HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode与equals方法。LinkedHashSet:有序,不可重复
简单排序:ArrayList<String> list = new ArrayList<String>();list.add("cba");list.add("aba");list.add("sba");list.add("nba");//排序方法 按照第一个单词的降序Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.charAt(0) - o1.charAt(0);}});System.out.println(list);}
Map集合:集合不能包含重复的键,值可以重复;每个键只能对应一个值分类:HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。