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;
@Override
public 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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
测试
@Test
public 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;
@Override
public 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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
@Test
public 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>() {
@Override
public 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()方法。