JAVA集合框架详解

bilibili视频地址:https://www.bilibili.com/video/BV1zD4y1Q7Fw?p=43.
对应笔记地址:https://lazydog036.gitee.io/2020/10/29/JAVA%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/.
总结:
在这里插入图片描述

1 List

特点:有序、有下标、元素可以重复。
方法:

void add(int index,Object o) //在index位置插入对象o。
boolean addAll(index,Collection c) //将一个集合中的元素添加到此集合中的index位置。
Object get(int index) //返回集合中指定位置的元素。
List subList(int fromIndex,int toIndex) //返回fromIndex和toIndex之间的集合元素。

1.1 ArrayList

  • 数组结构实现,查询块、增删慢;
  • JDK1.2版本,运行效率快、线程不安全。
  • 默认容量大小:private static final int DEFAULT_CAPACITY = 10;当没有向集合中添加任何元素时容量是0,添加第一个元素时变为10.
  • 存放元素的数组:transient Object[] elementData;
  • 实际元素个数:private int size;
  • 扩容速度:newCapacity = oldCapacity + (oldCapacity >> 1);变为原来的1.5倍。

1.2 Vector

  • 数组结构实现,查询快、增删慢;
  • JDK1.0版本,运行效率慢、线程安全。

1.3 LinkedList

  • 链表结构实现(双向链表),增删快,查询慢。

2 Set

  • 特点:无序、无下标、元素不可重复。
  • 方法:全部继承自Collection中的方法。

2.1 HashSet

  • 基于HashCode计算元素存放位置。
    • 根据hashCode计算保存的位置,如果位置为空,则直接保存,否则执行第二步。
    • 执行equals方法,如果方法返回true,则认为是重复,拒绝存储,否则形成链表。
  • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
  • 本质为HashMap,将值存进Map的K中。

2.2 TreeSet

  • 基于排序顺序实现不重复。
  • 实现了SortedSet接口,对集合元素自动排序。
  • 元素对象的类型必须实现Comparable接口,指定排序规则。
  • 通过CompareTo方法确定是否为重复元素。
  • 可以在创建TreeSet时给出排序规则:public TreeSet(Comparator<? super E> comparator)
    • 本质为TreeMap,将值存进Map的K中。

3Map

  • 用于存储任意键值对(Key-Value)。
  • 键:无序、无下标、不允许重复(唯一)。
  • 值:无序、无下标、允许重复。
  • 方法:
V put(K key,V value)//将对象存入到集合中,关联键值。key重复则覆盖原值。
Object get(Object key)//根据键获取相应的值。
Set<K>//返回所有的key
Collection<V> values()//返回包含所有值的Collection集合。
Set<Map.Entry<K,V>>//键值匹配的set集合

3.1 HashMap

  • 线程不安全,运行效率快;允许用null作为key或是value。
  • 默认初始化容量:static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    • 并不是初始化完就拥有16个空间,当添加第一个元素时变为默认初始化容量
  • 数组最大容量:static final int MAXIMUM_CAPACITY = 1 << 30;
  • 默认加载因子:static final float DEFAULT_LOAD_FACTOR = 0.75f;
    • 就是判断数组是否扩容的一个因子。假如数组容量为100,如果HashMap的存储元素个数超过了100*0.75=75,那么就会进行扩容。
  • 扩容速度:每次扩容都是原来大小的两倍
  • 链表调整为红黑树的链表长度阈值(JDK1.8):static final int TREEIFY_THRESHOLD = 8;
  • 红黑树调整为链表的链表长度阈值(JDK1.8):static final int UNTREEIFY_THRESHOLD = 6;
  • 链表调整为红黑树的数组最小阈值(JDK1.8):static final int MIN_TREEIFY_CAPACITY = 64;
    • 并不是只要链表长度大于8就可以转换成红黑树,在前者条件成立的情况下,数组的容量必须大于等于64才会进行转换。
  • HashMap存储的数组:transient Node<K,V>[] table;
  • HashMap存储的元素个数:transient int size;
  • Node:
    static class Node<K,V> implements Map.Entry<K,V> {
          final K key;
          V value;
          Node<K,V> next;
      }
    

3.2 TreeMap

  • 实现了SortedMap接口(是Map的子接口),可以对key自动排序。
    • 元素对象的类型必须实现Comparable接口,指定排序规则。
  • 通过CompareTo方法确定是否为重复元素。
  • 可以在创建TreeSet时给出排序规则: public TreeMap(Comparator<? super K> comparator)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我橘子超酸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值