Map集合
1.双列集合,可以存储键值对关系的数据,所有数据结构只与键有关,不能包含重复的键,每个键最多只能映射一个值
2.分类:HashMap LinkedHashMap TreeMap
3.Map集合的基本功能
V put(K key,V value) //向集合中添加键值,如果键相同则值覆盖,返回被覆盖的值
V remove(Object key)//如果存在一个键的映射关系,则将其从此映射中移除
void clear()//从此映射中移除所有映射关系
boolean containsKey(Object key)//如果此映射包含指定键的映射关系,则返回 true
boolean containsValue(Object value)//如果此映射将一个或多个键映射到指定值,则返回 true
boolean isEmpty()//如果此映射未包含键-值映射关系,则返回 true
int size()//返回此映射中的键-值映射关系数
V get(Object key)//返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
Collection<V> values()//返回此映射中包含的值的 Collection 视图
Set<K> keySet()//返回此映射中包含的键的 Set 视图
Set<Map.Entry<K,V>> entrySet()//返回此映射中包含的映射关系的 Set 视图
4.集合的遍历方式
a 键找值,使用keySet()和get()方法
b 键值对对象,用entrySet()方法
(一)HashMap
1.其底层数据结构为哈希表,元素无序且唯一,通过重写hashCode()方法和equals()方法来保证其键的唯一性,允许null值和null键
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
class Student {
private String name ;
private int age ;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@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);
}
}
public class Test {
public static void main(String[] args) {
Map<Student, String> hashMap = new HashMap<>();
hashMap.put(new Student("张三",20),"x001");
hashMap.put(new Student("李四",13),"x002");
hashMap.put(new Student("王五",24),"x003");
hashMap.put(new Student("张三",20),"x005");
//键找值遍历
Set<Student> students = hashMap.keySet();
for(Student s : students){
System.out.println(s.getName()+"--"+s.getAge()+"--"+hashMap.get(s));
}
}
}
运行结果:
张三--20--x005
王五--24--x003
李四--13--x002
2.HashMap和Hashtable的区别:
HashMap:线程不安全, 效率高.允许null值和null键
Hashtable:线程安全, 效率低.不允许null值和null键
(二)LinkedHashMap
底层数据结构为链表和哈希表,元素唯一且有序,通过重写hashCode()方法和equals()方法来保证其键的唯一性,链表来保证其有序,允许null值null键
import java.util.*;
class Student {
private String name ;
private int age ;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@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);
}
}
public class Test {
public static void main(String[] args) {
Map<Student, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(new Student("张三",20),"x001");
linkedHashMap.put(new Student("李四",13),"x002");
linkedHashMap.put(new Student("王五",24),"x003");
linkedHashMap.put(new Student("张三",20),"x005");
//键值对 对象遍历
Set<Map.Entry<Student, String>> entries = linkedHashMap.entrySet();
for(Map.Entry<Student, String> entry : entries){
Student key = entry.getKey();
System.out.println(key.getName()+"--"+key.getAge()+"--"+entry.getValue());
}
}
}
运行结果:
张三--20--x005
李四--13--x002
王五--24--x003
(三)TreeMap
1.底层数据结构为红黑树,元素可以按固定顺序排序,元素唯一,不允许null键
2.排序方法
a.实现Comparable<>接口,并重写此接口中compareTo()方法
b.用匿名内部类重写Comparator<>接口中compare()方法
import java.util.*;
class Student implements Comparable<Student>{
private String name ;
private int age ;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@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);
}
@Override
public int compareTo(Student s) {
int num1 = this.age - s.age ;
int num2 = num1 == 0 ? this.name.length() - s.name.length() : num1 ;
int num3 = num2 == 0 ? this.name.compareTo(s.name) : num2 ;
return num2 ;
}
}
public class Test {
public static void main(String[] args) {
Map<Student, String> treeMap = new TreeMap<>();
treeMap.put(new Student("杨颖",20),"x001");
treeMap.put(new Student("迪丽热巴",13),"x002");
treeMap.put(new Student("范冰冰",24),"x003");
treeMap.put(new Student("杨幂",21),"x004");
treeMap.put(new Student("赵丽颖",26),"x005");
//键值对 对象遍历
Set<Student> students = treeMap.keySet();
for(Student s : students){
System.out.println(s.getName()+"--"+s.getAge()+"--"+treeMap.get(s));
}
}
}
运行结果:
迪丽热巴--13--x002
杨颖--20--x001
杨幂--21--x004
范冰冰--24--x003
赵丽颖--26--x005
Collections工具类
成员方法:
public static <T > void sort (List < T > list):排序, 默认按照自然顺序
public static <T > int binarySearch (List < ? > list, T key):二分查找
public static <T > T max(Collection < ? > coll):获取最大值
public static void reverse (List < ? > list):反转
public static void shuffle (List < ? > list):随机置换