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

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

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

Java集合

集合框架体系

Java集合框架体系图

Collection

先上Collection接口知识框架图
Collection知识框架图

  • 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)交换元素

参考内容:
【1】https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.337.search-card.all.click&vd_source=dd9bdf6f42e38406b07ef92b986e8171

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值