java常用集合总结

Java常用集合

图解关系

单列Collection接口

«interface» Itertable hasNext() next() remove() «interface» Collection isEmpty() size() contains() iterator() toArray() add() remove() containsAll() addAll() removeAll() retainAll() clear() equals() hashCode() spliterator() «interface» List subList() listIterator() lastIndexOf() indexOf() remove() add() set() get() sort() addAll() replaceAll() ArrayList ensureCapacity() trimToSize() ArrayList() LinkedList LinkedList() Deque addLast() getFirst() getLast() emoveFirst() removeLast() addFirst() peek() element() poll() remove() offer() offerFirst() offerLast() peekFirst() peekLast() pollFirst() push() pollLast() pop() removeFirstOccurrence() removeLastOccurrence() descendingIterator() Vector removeAllElements() removeElement() addElement() insertElementAt() removeElementAt() setElementAt() lastElement() firstElement() elementAt() lastIndexOf() indexOf() elements() capacity() setSize() ensureCapacity() trimToSize() copyInto() Vector() «interface» Set HashSet HashSet() LinkedHashSet LinkedHashSet() TreeSet TreeSet()

双列Map接口

«interface» Map size() isEmpty() containsKey() containsValue() get() put() remove() putAll() clear() keySet() values() entrySet() getOrDefault() forEach() replaceAll() putIfAbsent() remove() replace() computeIfAbsent() computeIfPresent() compute() merge() HashMap HashMap() LinkedHashMap LinkedHashMap() Hashtable Hashtable() contains() Properties Properties() setProperty() load() save() store() loadFromXML() storeToXML() getProperty() propertyNames() stringPropertyNames() list() «interface» SortedMap TreeMap TreeMap()

List接口对比

底层结构版本线程安全(同步效率)扩容倍数
ArrayList可变数组jdk1.2不安全,查询效率高、增删效率低有参构造1.5倍数;如果是无参第一次10,第二次1.5倍
Vector可变数组jdk1.0安全,效率不高无参,默认10,满后按2倍扩容,指定大小,则每次按2倍扩容
LinkedList双向链表jdk1.2不安全,增删效率高、查询效率低无需扩容
  • RandomAccess 作用

    ArrayList实现RandomAccess接口,但是RandomAccess接口里面是空的!Linked并没有实现RandomAccess接口,这只是一个标记接口,发现ArrayList的普通for遍历更快,Linked的迭代器更快,可以list instanceof RandomAccess进行判断

Set接口

Hashset
  • 原理
  1. 实现set接口

  2. 实际上是HashMap(数组+链表+红黑树)

  3. 可以放null,但是只能放一个(元素不能重复)

  4. 不保证元素有序,取决于hash后,再决定索引值

  • 添加流程

    1. HashSet底层是HashMap
    2. 添加元素时,先得到hash值,会转成索引值
    3. 找到数组,看这个索引位置是否有值
    4. 如果没有值直接加入;如果有值,调用equals方法比较(一个节点、红黑树、链表),如果相同,放弃添加,不同,则添加到最后
    5. 添加完后,判断,在java8中,链表的个数8(含),数组64(含),链表进行红黑树化
    6. 数组的扩充。默认16,是16*0.75就开始认为提前扩充,扩充为原来的2倍
  • 应用

    1. 加入学生类,将姓名和年龄相同的认为同一个放入HashSet中保存
LinkedHashSet
  • 说明
    1. LinkedHashSet是HashSet的子类

    2. LinkedHashSet的底层是LinkedHashMap,LinkedHashSet实际是数组+双向链表

    3. LinkedHashSet是根据元素的hashCode值来决定元素的存储位置,同时使链表维护元素次序,看起来是以插入顺序保存的

    4. 不能添加重复元素

TreeSet&TreeMap
  • 说明

    1. TreeSet的排序是通过TreeSet的构造器中传入一个Comparator匿名内部类,匿名内部类重写compare方法实现
    2. TreeSet的底层实际上时TreeMap实现
    3. 在调用add添加方法的时候,在底层调用我们重写的compare方法
    4. 注意,添加的时候是否能够后加入看我们的compare是否返回0而不是重复(默认是无规则的)
    5. TreeSet的add所以一定实现Comparator匿名类,或者默认有,实现Comparble接口
Set的去重机制在这里插入图片描述

Map接口

Map
  • 说明

    1. Map和Collection是并列的,用于保存映射关系的K-V性

    2. Map的key和value可以是任何引用类型,会封装到HashMap$Node对象中

    3. Map的key不许重复,和HashSet一样

    4. Map的value是可以重复的

    5. Map的key可以为null,但是只能一个,value也可为null,可以为多个

    6. Map的可以常用String

    7. key和value是对应的,可通过key找到value

  • Map的遍历

    1. 通过KeySet得到一个key集合的Set(通过迭代器或者增强for循环遍历全部)
    2. 通过Values取出v,map.values()得到一个Collection集合(迭代器、增强for)
    3. 通过EntrySet来获取K-v,得到一个Entry对象的Set集合,通过getKey()、getValue()取值(迭代器、增强for)

HashMap
  • 添加流程和上面HashSet一样

  • 原理性

    1. k-v 最后是HashMap$Node node = newNode(hash,key,value,null)

    2. k-v是为了方便遍历,会创建EntrySet集合,该集合存放的Entry,而一个Entry对象就有k、v EntrySet<Entry<K,V>>即:transient Set<Map.Entry<K,V>> entrySet

    3. entrySet中,定义的类型Map.Entry,但是实际上还是HashMap$Node,其实是一种多态的向上转型

    4. 当把HashMap$Node对象存放到entrySet就方便遍历Map.Entry提供getKey()、getValue()

    5. put一个重复key,更新原来的value,返回一个原来的old值

HashTable
  1. 存放的元素是k-v键值对
  2. Hashtable的键和值都不能为null
  3. Hashtable使用方法基本和HashMap一样
  4. Hashtable是线程安全的(synchronized),HashMap线程不安全的
  • 原理性
    1. 底层有一个数组Hashtable$Entry[],第一次初始化大小为11
    2. 临界值threshold 8 = 11*0.75(加载因子)
    3. 扩容的的机制当大于等于临界值时,将大小扩容为old*2+1
Properties
  1. Properties实现类继承HashTable类并实现了Map接口,使用键值对存储数据
  2. Properties多用于从xxx.properties文件,加载到Properties类对象,并读取和修改
  3. k-v都不能为空
TreeMap&TreeSet
Collections工具类
  • Collection常用方法
    1. reverse() 顺序的反转
    2. shuffle() 随机的重新排序
    3. sort() 自然排序
    4. sort(list,Comparator) 指定排序
    5. swap(list,i,j) 指定集合在i和j进行相互调换
    6. max() min()自然排序的最/最小值
    7. max(list,Comparator) min(list,Comparator)指定排序的最大/最小值
    8. frequency() 出现频率的次数
    9. copy(dest,src) 拷贝集合,需要指定内容大小,不然直接报错
    10. replaceAll() 替换
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值