集合大总结

1.数组数据类型

ArraysList底层是容量为10的数组,有索引
    数组存满了会扩容,增长到原容量的1.5倍,扩容效率低,建议使用构造方法的时候指定容量
    可以通过索引来增删查改元素
    因为是数组结构,所以查询效率高,随机增删效率低,因为增删元素会变动整个数组
    末尾增删元素效率不受影响
    存元素的原理:
        使用add()方法会把元素添加到ArraysList集合的末尾
        可以存放重复的元素
    取元素的原理:
        因为ArraysList集合有索引,可以通过get()方法获取指定索引的元素
    遍历ArraysList集合(显示的元素顺序和存入的顺序一样):
        有索引,可以通过for循环
        可以使用迭代器迭代
        可以使用增强for

LinkList集合底层是默认没有容量的链表数据结构,有索引,但是检索,查找效率较低
    随机增删效率高,因为增删元素的时候不会有大量元素位移
    存元素的原理:
       使用add()方法会把元素存入头节点,后续存入的元素会一一存入后面的节点
       每个节点存2部分信息,一个是存上一个节点的地址,一个是存元素
       可以存放重复的元素
    取元素的原理:
        因为LinkList集合有索引,可以通过get()方法获取指定索引的元素
    遍历LinkList集合:
        有索引,可以通过for循环
        可以使用迭代器迭代
        可以使用增强for

Vetor集合底层是一个初始容量为10的数组,扩容是原容量的2Voctor中所有的方法都是线程同步的,都带有synchronized关键字
        是线程安全的,但是效率比较低,使用较少

2.哈希表数据类型

HashMapHashSet集合
    HashMap集合的默认初始化容量是16(必须是2的倍数,为了达到散列分布均匀),
    默认加载因子是0.75
    底层是哈希表/散列表的数据结构,是一个数组和单向链表的结合体
    重复发挥了数组查询效率高的优点和链表随机增删效率高的优点
    HashMap底层是一个存放Node<K,V>类型的一维数组
    HashMap.NodeHashMap类中的静态内部类,包含了哈希值,键,值,和下一个节点的内存地址
    放在HashMap集合key部分的元素其实就是放到HashSet集合中了

    HashMap集合的key部分特点
        1.存入的元素无序,因为存入的元素的时候,会先计算元素的哈希值,再通过哈希算法转换成
        数组的下标,所以不一定挂到那个数组的单项链表上
        2.存入的元素不可重复,[存入的元素的类型的类需要重写hashCode方法+equals方法]
        如果发现重复的元素会被覆盖

     [重点:放在HashMap集合中key部分的元素,以及放在HashSet集合中的元素,
        需要同时重写hashCode和equals方法]

    HashMap存元素的原理:
        调用map.put(k,v)方法
        1.先把k,v封装到Node对象当中
        2.底层会调用k的hashCode方法得出hash值
        3.然后通过哈希算法,将hash值转换成数组下标
        4.如果下标对应的位置有链表,此时会拿着k和链表上的每一个节点中的k进行equals
        5.如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾
        6.如果其中一个节点返回了true,那么这个节点的value将会被覆盖


    HashMap取元素的原理
        1.先调用hashCode方法得出哈希值
        2.通过哈希算法转换成数组的下标,通过下标快速定位到某个上
        3.如果这个位置上什么也没有,返回null
        4.如果这个位置上有链表,那么会拿着参数k和单项链表上的每个节点中的k进行equals
        5.如果所有equals方法返回false,那么get方法返回null
        6.只要其中有一个节点的k和参数k equals时候返回true,
            那么此时这个节点的value就是我们要找的value,get方法最终返回这个要找的value

    遍历Map集合
        方法一:可以获取Map集合中的所有key,通过遍历key,来遍历value
                因为HashMap的key部分是HashSet集合,
                最后迭代或循环:每遍历到Set集合的元素(key),取获取对应的值(value)
                //使用到的方法:获取Map集合中的所有key
                Set<Integer> keys = map.keySet();
        方法二:把Map集合转换成Set集合
                转换后的Set集合元素都是Map.Entry类型
                同时也是node类型
                key和value都是直接从node对象中获取的属性值
                最后迭代或循环:遍历Set集合,每遍历到一个Node,获取对应的key和value
                //使用到的方法:把Map集合转换成Set集合
                Set<Map.Entry<Integer,String>> set = map.entrySet();


jdk8对HashMap的改进:
    如果哈希表单项链表中的元素超过8个
    单项链表这种数据结构会变成红黑树数据结构
    当红黑树上的节点数量小于6个的时候
    会重新把红黑树变成单项链表数据结构
    这是为了提高检索效率
    (而成的检索会再次缩小扫描范围)

3.二叉树数据类型

TreeMapTreeSet集合
    TreeMapTreeSet集合的底层是自平衡得到二叉树数据结构,存放顺序是左小右大
    TreeMapTreeSet集合采用的是中序遍历:左根右
    存取元素的特点:
        存储时顺序和取出的顺序不同
        不可重复
        存取的顺序会有一定规律
            存放Integer类型,会升序方式存放
            存放String,按照字典顺序,中文无法正常排序
            存放没有实现Comparable接口的自定义类型,会出现类型转换异常

    TreeSet集合存自定义类型的元素:
        方法一:自定义类型继承Comparable接口,然后重写compareTo方法
        方法二:自定义一个实现Comparator接口的比较器类,然后重写compareTo方法
                最后创建TreeSet集合对象的时候传入比较器对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值