JAVA集合详解

目录

前言

1、集合框架

2、Collection 

List

ArrayList

LinkedList

Vector

Set

HashSet

TreeSet

LinkedHashSet

sortedSet

Queue

总结

3、Map

HashTable

HashMap

WeakHashMap

TreeMap

IdentityHashMap

ConcurrentHashMap

LinkedHashMap


喜欢的朋友可以关注一下,下次更新不迷路!💕(●'◡'●)

 

前言

Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:ListSetQueue

1、集合框架

  • List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
  • Set(注重独一无二的性质): 存储的元素不可重复的。
  • Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
  • Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x" 代表 key,"y" 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。

2、Collection 

List

特点

(1)有序性:List中的元素是按照添加顺序进行存放的。因为有序,所以有下标,下标从0开始

(2)可重复性: List中可以存储重复的元素

ArrayList

概念:

底层使用数组来存储元素,而数组的长度是固定的,但ArrayList长度却是可变的。

 自动扩容机制:

在ArrayList中,每当添加一个元素时,都需要先检查当前数组容量是否足够,如果容量不足,则需要进行扩容操作。而ArrayList的扩容机制是:将原数组的长度乘以一个增长因子,通常是1.5,生成一个新的大数组,然后将原数组中的元素复制到新数组中来,这样就完成了扩容操作。

LinkedList

概念:

底层使用的是双向链表数据结构

Vector

概念:

允许不同类型元素共存的变长数组

 ArrayList的PLUS版

Set

特点

不存放重复的元素

HashSet

HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。

HashSet不存入重复元素的规则.使用hashcode和equals来判断元素是否相同

TreeSet

 红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,那么元素重复。

LinkedHashSet

会保存插入的顺序。

sortedSet

特点

SortedSet 是一个按升序维护其元素的集合,根据元素的自然顺序或根据 SortedSet 创建时提供的Comparator进行排序。

Queue

特点

代表一个先进先出(FIFO)的队列

总结

看到array,就要想到角标。

看到link,就要想到first,last。

看到hash,就要想到hashCode,equals.

看到tree,就要想到两个接口。Comparable,Comparator。

3、Map

HashTable

特点

HashTable线程安全 (每一个方法都加了锁,适用于多线程并发的环境)

HashTable是继承Dictionary类 都实现了 map,cloneable serializable 接口

HashTable中,key和value都不能为null

HashMap

特点

HashMap线程不安全(在多线程并发会造成死锁问题)但是他的效率比HashTable高,大部分都是单线程操作

HashMap是继承AbstractMap类 都实现了 map,cloneable serializable 接口

HashMap中,可以允许key和value为空的且存储在数组索引为0处 

WeakHashMap

特点

改进的HashMap,实现了“弱引用”,如果一个key不被引用,则被GC回收

WeakHashMap.Entry 和 HashMap.Node 的不同点在于,WeakHashMap.Entry 继承了WeakReference。

弱引用的生存期特别短。垃圾回收的时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。

想象一下如下场景:

调用两次 size():第一次为 10,第二次就为 8 了。
两次调用 isEmpty():第一次返回 false,第二次返回 true。
两次调用 containsKey():第一次返回 true,第二次返回 false。
两次调用 get():第一次返回一个 value,第二次返回 null。

TreeMap

特点

TreeMap是一个基于key有序的key value散列表

  • map根据其键的自然顺序排序,或者根据map创建时提供的Comparator排序
  • 不是线程安全的
  • key 不可以存入null
  • 底层是基于红黑树实现的
  •  按key排序,key不重复

IdentityHashMap

特点

底层实际就是一个 Object 数组,但是在存储上并没有使用链表来存储,而是将 K 和 V 都存放在 Object 数组上。

ConcurrentHashMap

特点

ConcurrentHashMap是线程安全的,ConcurrentHashMap并非锁住整个方法,而是通过原子操作和局部加锁的方法保证了多线程的线程安全,且尽可能减少了性能损耗。

乐观锁嘛,认为更新操作时不会被其他线程影响。所以时候再更新少的情况下性能高。

volatile修饰的节点数组

//ConcurrentHashMap使用volatile修饰节点数组,保证其可见性,禁止指令重排。
transient volatile Node<K,V>[] table;

LinkedHashMap

LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值