集合

java 集合框架

集合图解

img

个人总结

List :有序 可以插入多个空,可以有重复值

​ ArrayList: 查询修改快,增删慢,因为List底层结构是数组有索引,所以可以根据索引查询效率快,线程不安全,效率快。

​ LinkedList:增删快,查询慢,底层结构是双向链表,所以增加删除快,线程也是不安全,效率快

​ Voctor:线程安全,底层加了Synchronized 但是效率慢

set:

​ hashSet: 只可以插入一个null,不能重复,底层结构是Map,插入的值就是插入到Key上,

​ 线程不安全,无序的

​ LinkedSet: 底层是双向链表,所以查询出来的是有序的,底层结构是LinkedHashMap

Map

​ HashMap:

  1. 键值对的形式存储,底层结构是数组+链表+红黑数,数组初始化大小是16,默认加载因子是0.75,16x0.75=12,这个12 就是临界值,意思就是当塞入的数据到达12的时候,就会增加数组长度,16x2=32, 32x0.75=24,就是下一个临界值。

  2. 链表就是每一个Key的Has值相同,然后就在eques比较值,Key不相同:就会形成一个链表,第一个值的next就会指向下一个数据。相同的Key:就不能增加

  3. 当两个数据Key相同的时候,value的值就会替换上一个值

  4. 红黑数的出现,就是当链表到达8或者以上,和数组值到到64才能转换成红黑数

    HashTable:

    ​ hashTable 的键和值都不能为null,否则会抛出NullPointerException

    ​ hashTable 线程是安全的 ,因为加了synchronized关键字,HashMap 线程是不安全的

Iterator 迭代器

​ iterator 迭代器 就是循环 集合中的数据

在调用iterator.next()方法之前必须要调用iterator.hasNext()进行检测,若不调用,且下一条记录无效,直接调用iterator.next()会抛出

NoSuchElementException异常

​ iterator.hasNext() 判断下个坐标是否有数据

​ iterator.next() 获取下个数据

增加for循环也可以循环获取集合中的数据

增强for循环底层也是迭代器

List

list集合 是有序的 可以重复

ArrayList

  1. ArrayList 可以塞入任何数据,和空值

  2. ArrayList 是由数组来实现数据存储

  3. ArrayList 是线程不安全

  4. ArrayList 查询快 增删慢

    ​ 查询快:是因为可以根据下标查询 ,顺序都是有序的

    ​ 增删慢 :每当插入或者删除的时候倒要想后移动元素

    ​ 当插入元素的时候还要判断需要是否扩容 然后需要扩容就的增加操作

当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍

如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍

自我总结ArrayList源码分析

底层结构是数组

不管有参无参 第一个就是装箱操作 List 只接受装箱的数据类型

假如是无参构造的ArryList

​ 增加的执行顺序

在这里插入图片描述

在这里插入图片描述

 先进入下面这个方法

elementData==0 就进入Math.max 方法

在这里插入图片描述

在这里插入图片描述

返回的就是10

10-0>0

在这里插入图片描述

​ 这个方法 就是扩容方法 每次扩容1.5倍

int newCapacity = oldCapacity + (oldCapacity >> 1);

在这里插入图片描述

vector

底层结构是数组

vector 空参数构造 也是初始化为10

扩容 是2倍

vector 是线程安全的 因为 add 方法 增加了synchronized 所以线程是安全的 但是效率会低

LinkedList

  1. LinkedList底层实现是双向链表

  2. 可以添加任意元素,元素可以重复,可以为null

  3. 线程不安全,没有实现同步

  4. 增删快,查询慢

    ​ 只需要修改插入位置或删除位置左右数据的引用目标即可。

    ​ 查询的话 就的从头开始一个个查询

set

set 接口是无序的 不可以重复 可以增加一个空

set add 的底层是HasMap

增加的值就是Map 的K 的位置 所以是不能重复的

LinkedHashset

LinkedHashset 插入的顺序和取出的顺序是一致的

LinkedHashset 底层维护的就是LinkedHashMap(hashMap的子类)

LinkedHashset 底层结构 是数组加双向链表

Map

Map保存具有映射关系的数据 :Key-Value

Map中的Key和Value 都是用的引用数据类型

Map中的Key不允许重复 ,value 可以重复

Map中可以存一个NUll ,Value可以存多个Null

HasMap 的底层是数组加链表+红黑树


hasMap的扩容机制

1<<4 默认是16个 加载因子 是0.75 16*0.75 那么 就会算出12

当数据增加到12 的时候就会扩容 而不是增加满了才扩容

16x2=32 32x0.75=24 那么下次的临界值就是24


hasMap底层数组加链表的实现

每次插入一个数据都会有has 值 ,然好会跟每一个值去比较,假如是相同的has值

那么就要eques比较内容是否相同,相同的话就不加入,然后返回

不相同的话 就在后面加上变成链表形式

当链表的个数达到8的时候不会变成红黑数,要等数组个数变成64才能变成红黑树

Hashtable

hashTable 的键和值都不能为null,否则会抛出NullPointerException

hashTable 线程是安全的 ,因为加了synchronized关键字,HashMap 线程是不安全的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值