java中集合及其实现类

声明:本文材料来源于bilibili动力节点视频,仅为学习使用!!!

Collection

 

1. List接口继承Collection接口,Collection接口继承了Iterable接口。

Iterable接口中定义了iterator()抽象方法,获得迭代器对象。

使用迭代器hashNext方法,next方法对Iterable实现类进行遍历。

所以但凡是Iterable下的子类均可以获得迭代器对象进行遍历。

iterator的remove方法移除某个下标的对象,将其返回并将指针前移一位。

2. Collection接口下还分List接口,Set接口:

List是有序可重复的,Set是无序不可重复的。有序是指存进去是什么顺序,取出来就是什么顺 序。无序是存进去是什么顺序,取出来不一定是原来的顺序。可重复是指存入的元素可以相同。 不可重复是指存入的元素不可以相同。

Collection中contains(Object o)方法会调用o.equals()方法,所以要求Collection中的元素重写equals方法。

3. List接口的常用实现类:ArrayList,LinkedList,Vector。

ArrayList:底层数据结构是数组。在内存中连续存储。有序可重复。有下标。优点是在末尾增加元素的效率高。根据下标查找元素效率高。缺点是随机增删元素效率低。不指定容量的情况下,默认容量是10,当实际容量等于最大容量时会自动扩容,增加到原来的1.5倍。扩容会导致运行效率降低,所以尽量避免扩容行为的出现。

LinkedList:底层数据结构是双向链表,在内存中分散存储。优点是随机增删元素效率高。缺点是查询某个元素效率低,每次都要遍历整个链表。

Vector:底层数据结构是数组,是线程安全的。类中每个方法都有synchronized关键字,所以Vector使用时效率低。

4. Set接口的常用实现类:HashSet,TreeSet(实现SortedSet可排序的set)

HashSet:底层数据结构是HashMap,无序不可重复。往HashSet中添加元素等于往HashMap的key部分添加元素。具体细节见下面HashMap。

TreeSet实现了SortedSet接口,SortedSet接口继承Set接口。所谓sort即可排序的。底层数据结构是TreeMap二叉树。装入的Set集合中的元素要实现Comparable接口的compareTo方法或者在创建HashSet对象时传入一个Comparator接口实现。需按自己的需求写比较规则。二叉树通过比较大小来判断进入左子树还是右子树。

private V put(K key, V value, boolean replaceOld) {
        Entry<K,V> t = root;
        if (t == null) {
            addEntryToEmptyMap(key, value);
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else {
                    V oldValue = t.value;
                    if (replaceOld || oldValue == null) {
                        t.value = value;
                    }
                    return oldValue;
                }
            } while (t != null);
        } else {
            Objects.requireNonNull(key);
            @SuppressWarnings("unchecked")
            Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else {
                    V oldValue = t.value;
                    if (replaceOld || oldValue == null) {
                        t.value = value;
                    }
                    return oldValue;
                }
            } while (t != null);
        }
        addEntry(key, value, parent, cmp < 0);
        return null;
    }

Map

1.  Map也是集合,与Collection没有任何关系。Map最大的特点是存储的形式是键值对Key/Value。

2.  Map接口常用的实现类有HashMap,HashTable,Properties,TreeMap(实现SortedMap接口,可排序)。

HashMap:底层是数组和单向链表简称哈希表。优点是结合了数组和链表的优势。增删元素在链表上完成,查询也不需要全部扫描,只需要扫描一部分。

使用HashMap存储数据时,Key对应的类必须同时重写HashCode(),equals()方法。在put(k,v)方法调用后,会调用key的hashCode(),返回哈希值,会将key,value,hash封装成Node对象。将哈希值进行哈希算法得到对应的数组下标。若此时对应的位置没有Node对象,则放入链表。若有对象,则对遍历他们。遍历的同时调用Node对象的key.equals(其他Node对象的key)。若key重复则覆盖value。若遍历结束仍没有相同的key则将Node对象放到链表末端。 get(k)方法调用后,会根据调用key的hashCode方法得到hash值,对哈希值进行哈希算法计算对应的数组下标。若该位置没有Node对象则返回Null。若有Node对象,遍历他们,直到key.eqlaus(其他Node.key)返回true,返回value。若匹配不到,返回Null。 

HashMap默认容量为16,加载因子为0.75,当容量到达原容量的0.75时,扩大到原容量的两倍,链表节点数大于8时,转换为红黑树(一种自平衡二叉树)。

HashTable:是线程安全的,效率较低。原容量为11,加载因子为0.75,扩容为原容量*2+1。

Properties:是线程安全的,因为继承了HashTable。KeyValue只能是String类型。

TreeMap:底层是二叉树。

总结:

ArrayLsit:底层是数组。

LinkedList:底层是双向链表。

Vector:底层是数组,线程安全的,效率较低,使用较少。

HashSet:底层是HashMap,放到HashSet集合中的元素等于放到HashMap的key部分了。

TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap的key部分了。

HashMap:底层是哈希表。

HashTable:底层也是哈希表,是线程安全的,效率较低,使用较少。

Properties:是线程安全的,key和value只能存储字符串String。

TreeMap:底层是二叉树。可按key的大小自动顺序排序。

List集合存储元素的特点:

         有序可重复

Set(Map)集合存储元素的特点:

          无序不可重复

SortedSet(SortedMap)集合存储元素的特点:

           首先是无序不可重复,第二可以进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值