Java基础知识总结梳理(四)

重要的集合知识点梳理来了!

Java集合

集合框架体系

java项目增量打包工具 java增量包和全量包的区别_java

Collection

先上Collection接口知识框架图

java项目增量打包工具 java增量包和全量包的区别_开发语言_02

  • List :有序,可重复
    实现List接口的常用类包括Vector、ArrayList、LinkedList等
  • Vector: 线程安全;
    扩容机制:如果无参,默认10,满后,按照2倍扩容;如果指定大小则每次直接按2倍扩容;
  • ArrayList:线程不安全;
  • 底层是可变数组,可以加入多个null;
  • ArrayList中维护了一个Object类型的数组,elementData
  • 当创建对象时,如果使用的是无参构造器,则初始elementData容量为0(jdk7是10)
  • 当添加元素时:先判断是否需要扩容,如果需要扩容,则调用grow方法,否则直接添加元素到合适位置
  • 如果使用的是无参构造器,如果第一次添加,需要扩容的话,则扩容elementData为10,如果需要再扩容的话,则扩容elementData为1.5倍
  • 如果使用的是指定容量capacity的构造器,则初始elementData容量为capacity
  • 如果使用的是指定容量capacity的构造器,如果需要扩容,则直接扩容elementData为1.5倍
  • LinkedList:线程不安全
  • 底层是双向链表
  • 增删效率高,改查效率低
  • 接口常用方法:
  • add()
  • addAll()
  • get(int index)
  • indexOf(Object obj)
  • lastIndexOf(Object obj)
  • remove(int index)
  • set(int index, Object ele)
  • subList(int fromIndex, int toIndex)
  • Set:无序,不可重复
  • HashSet
  • 采用Hashmap的key来存储元素;主要特点是无序的
  • HashSet底层是HashMap
  • 添加第一个元素时,先得到hash值 -> 会转成 -> 索引值,第一次添加时,table数组扩容到16,临界值(threshold)是16*加载因子(loadFactor)是0.75 = 12
  • 找到存储数据表table,看到这个索引位置是否已经存放的有元素
  • 如果没有,直接加入
  • 如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后,如果table数组使用到了临界值12,就会扩容到162=32,新的临界值就是320.75=24,依此类推
  • 在Java8中,如果一条链表的元素个数超过了TREEIFY_THRESHOLD(默认是8),并且table的大小>=MIN_TREEIFT_CAPACITY(默认64),就会进行树化(红黑树)
  • TreeSet
  • 可以进行排序,需要使用带比较器的构造器
  • 底层为TreeMap
  • 接口常用方法
  • add()
  • remove()
  • contains()
  • size()
  • isEmpty()
  • clear()
  • addAll()
  • containsAll()
  • removeAll()
  • 接口遍历元素方式
  • 使用Iterator迭代器:注意,如果在循环中直接调用集合的remove()方法,例如,list.remove();循环过成功list.size()的大小变化,就会导致错误。所以如果想在循环语句中删除集合中的某个元素,需要用迭代器iterator的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态
  • for循环增强

Map

  1. Map接口特点
    Map存放数据一对k-v是放在一个Node中的,又因为Node实现了Entry接口,有些书上也说是一对k-v就是一个Entry
  2. Map接口常用方法
  • put
  • remove
  • get
  • size
  • isEmpty
  • clear
  • containsLey
  1. HashMap
  • 线程不安全
  • jdk 1.7 中采用 数组+链表数据结构,头插法插入数据
  • jdk 1.8 中采用 数组+链表+红黑树数据结构,尾插法插入数据
  • 扩容机制:初始容量16,LoadFactory默认为0.75,扩容时会创建一个空数组重新Hash计算,Hash公式和长度有关
  • 初始容量为2的幂次的好处:方便位运算和均匀分布
  • 重写equals必须重写HashCode
  1. Hashtable
  • 线程安全
  • 键值都不能为null
  • 扩容机制:底层数组初始化大小为11,LoadFactory默认是0.75,扩容后大小为2倍加1
  1. LinkedHashMap
  2. TreeMap
  3. Properties
  • Hashtable的子类
  • 可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改

Collections

  • 工具类中提供的均为static方法
  • reverse(List)
  • shuffle(Lisy):对List集合元素进行随机排序
  • sort(List)
  • swap(List,int,int)交换元素