集合_Day03

Map

/----Map : 存储双列数据[key-value]
    /----HashMap : 作为Map的主要实现类 (线程不安全,效率高,可以存储null的key和value)
        /----LinkedHashMap : 保证在遍历map元素时,可以按照添加的顺序遍历
                             (在原有的HashMap的层结构基础上,添加的了一对指针,只想前一个节点和后一个节点)
                             (对于频繁的遍历操作,此类执行效率高于HashMap)
    /----TreeMap : 保证按照添加的key-value进行排序,实现遍历排序,默认使用key来排序
                    (底层使用红黑树)
    /----Hashtable : 作为古老的实现类 JDK1.0 (线程安全,效率低,不可以存储null的key和value)
        /----Properties : 常用来处理配置文件,key和value都是String类型
  • Map中的key : 无序的,不可重复的,使用Set存储 ---->所在类需要重写equals和hashcode方法
    Map中的value : 无序的, 可重复的,使用Collection来存储 ---->所在类需要重写equal方法
    一个key-value键值对购政策和那个一个Entry对象

HashMap

JDK7.0及之前

  • 底层结构 : 数组 + 链表
  •   Map map = new HashMap<>();
      map.put(key1,value1);
    
    • 1.在HashMap实例化后,底层创建了长度为16的一维数组Entry[] table
    • 2.调用key1.hashcode()方法,计算其哈希值,此哈希值经过算法计算,得到在Entry数组的存放位置
    • 3.如果此位置为空,则key1-value1添加成功
    • 4.如果此位置上的数据不为空(此位置上存在一个或者多个数据(以链表的形式存在)),比较key1的哈希值和已经存在的多个数据的哈希值.
      • 4.1如果key1的哈希值与已经存在的哈希值都不一样,此时key1-value1添加成功
      • 4.2如果key1的哈希值与已经存在的某一个数据的哈希值相同,继续调用key1.equals()方法进行比较
        • 5.1如果equals方法返回false,此时key1-value1添加成功
        • 5.2如果equals方法返回true,使用value1替换

JDK8.0

  • 底层结构 : 数据 + 链表 + 红黑树
  • jdk8的底层实现方面与jdk7的不同
    • new Hashmap()底层没有创建一个长度为16的数组
    • jdk8底层数组是 Node[] 而非 Entry[]
    • 首次调用put方法时,底层创建长度为16的数组
    • jdk7 底层只有数组+链表,jdk8中的底层有数组+链表+红黑树
      当数的某一个索引位置上以链表形式存在的数据个数大于8,且当前数组长度大于64,此时此索引位置上的所有数据改为用红黑树存储
public class Test1 {
    public static void main(String[] args) {
        Map map = new HashMap<>();
        map.put("1","a");
        map.put("2","b");
        map.put("3","c");
        map.put("4","d");
        map.put("5","e");
        map.put("6","f");
        map.put("7","g");

        // keySet()方法
        Set set = map.keySet();
        System.out.println(set);
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        // values()方法
        Collection collection = map.values();
        System.out.println(collection);
        for (Object o : collection){
            System.out.println(o);
        }

        // entrySet()方法
        Set entrySet = map.entrySet();
        System.out.println(entrySet);
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()){
            Map.Entry entry = (Map.Entry)iterator2.next();
            System.out.println(entry.getKey()+"  :   "+entry.getValue());
        }

    }
}

TreeMap

  • 应为要根据key排序,所以key必须同一类型
  • 排序分为自然排序 和 定制排序
public class Test2 {
    public static void main(String[] args) {
        // 定制排序 (从大到小)
        Comparator comparator = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof User && o2 instanceof User){
                    User u1 = (User) o1;
                    User u2 = (User) o2;
                    return -Integer.compare(u1.getAge(),u2.getAge());
                }else{
                    throw new RuntimeException("Yes, Error!");
                }
            }
        };
        TreeMap treeMap = new TreeMap(comparator);



        // 自然排序(从小到大)
        //TreeMap treeMap = new TreeMap();
        User user1 = new User(33);
        User user2 = new User(23);
        User user3 = new User(90);
        User user4 = new User(45);
        User user5 = new User(-12);
        User user6 = new User(34);
        treeMap.put(user1,98);
        treeMap.put(user2,85);
        treeMap.put(user3,34);
        treeMap.put(user4,123);
        treeMap.put(user5,-23);
        treeMap.put(user6,128);

        Set set = treeMap.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            Map.Entry entry = (Map.Entry)iterator.next();
            System.out.println(entry.getKey()+"  :   "+entry.getValue());
        }


    }
}


public class User implements Comparable{
    private int age ;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User(int age) {
        this.age = age;
    }

    public User() {
    }
    
    @Override
    public int compareTo(Object o) {
        if (o instanceof User){
            User u = (User) o;
            return Integer.compare(this.age,u.age);
        }else{
            throw new RuntimeException("Yes, Error!");
        }

    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                '}';
    }
}

Collections

  • 是一个操作Collection和Map的工具类
上一篇:Day03 -Java入门01


下一篇:day03