JavaSe学习总结_day14

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):随机置换

猜你喜欢

转载自blog.csdn.net/jcx_1020/article/details/81604247