Java常见的几种集合类

一、前言

集合类是Java数据结构的实现。它是java.util包中的重要内容,允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。

二、Java集合类框架图

在这里插入图片描述

三、Java集合类型

Java集合框架主要包括两种类型的容器,一种是集合(Collection),另一种是图(Map)。

一、Collection接口

Collction接口有三种类型,分别是List,Set和Queue;
List常用的实现类ArrayList、LinkedList、Vector;
Set常用的实现类TreeSet、HashSet、LinkedHashSet;

1.List

List接口扩展自Collection,它可以定义一个允许重复的有序集合,用数组存储元素,可以插入多个null元素,同时它增加了面向位置的操作,允许在指定位置上操作元素,也就是建立了索引,可以用for进行循环遍历。

1.1ArrayList

ArrayList用数组存储元素,数组容量可动态扩建,如果元素个数超过了数组的容量,会自动进行扩容(扩容机制原理);
ArrayList是线程不安全的集合(ArrayList线程不安全底层原理);

1.2LinkedList

LinkedList用链表存储元素,链表和数组最大的区别在于它们对元素的存储方式的不同,导致它们在对数据进行操作时,效率也会不同;
PS:数组元素增删慢,查找快,而链表却相反,增删快,查找慢(数组连续内存空间,查找速度快,增删慢;链表充分利用了内存,存储空间是不连续的,首尾存储上下一个节点的信息,所以寻址麻烦,查找速度慢,但是增删快);数组和链表的区别

1.3Vector

Vector用数组存储元素,容量能够动态的增长,它的很多实现方法都加入了同步语句,因此是线程相对安全的;(Vector是相对安全的线程

2.Set

Set接口扩展子Collection,它是不允许存储重复元素的无序集合,只允许一个null元素,不具备索引,因此不可以用普通for循环遍历(可以用强for循环和迭代器)底层数据结构采用的是哈希表
PS:这里的无序指的是存入和取出的顺序不一致,取出的时候会根据存入数据的属性进行排序
哈希表=数组+链表(如果链表长度超过8,自动转换为红黑树)

2.1TreeSet

TreeSet扩展自AbstractSet,它是一个有序的Set集合,通过TreeMap实现(TreeSet的实现

2.2HashSet

HashSet是一个用于实现Set接口的具体类,通过散列法的机制来存储信息,元素并没有以某种特定顺序存放,底层是HashMap;

2.3LinkedHashSet

LinkedHashSet是用一个链表来扩展HashSet类,以元素插入的顺序来维护集合的链表,允许以插入的顺序在集合中迭代,底层是HashMap;

二、Map接口

Map接口有两种类型,分别是HashMap和TreeMap;
常用的实现类有HashMap、LinkedHashMap、TreeMap;

1.HashMap

HashMap是基于哈希表的Map接口的非同步实现的双列的无序集合,元素以key-values形式存储,它根据键的hashCode值存储数据,根据键可以获取值,具有很快的访问速度,同时,key不可以重复,因此最多只允许一条记录的key为null,底层数据结构是哈希表(HashMap底层原理);

1.1LinkedHashMap

LinkedHashMap继承自HashMap,它主要是用链表实现来扩展HashMap类,因此它是有序的HashMap(LinkedHashMap底层原理)

2.TreeMap

TreeMap基于红黑树数据结构的实现,实现SortMap,能够把它保存的记录根据键排序,也可以指定排序的比较器(键值使用Comparable或Comparator接口来排序),当用Iterator遍历TreeMap时,得到的记录是排过序的,同时不允许key值为空,非同步的;

四、集合类型的线程安全性

线程安全的集合:Vector、Hashtable;
线程不安全的集合:ArrayList、TreeSet、HashSet、LinkedHashSet、HashMap、LinkedHashMap、TreeMap;
PS:高并发的情况下,使用线程不安全的集合,容易抛出ConcurrentModificationException异常;

一、如何解决集合的线程不安全问题;

java中的JUC为我们提供了一些解决并发问题的工具类;
ArrayList转换为线程安全的类,使用:CopyOnWriteArrayList(实现线程安全的原理);
Set转换为线程安全的类,使用:CopyOnWriteArraySet(实现线程安全的原理);
Map转换为线程安全的类,使用: ConcurrentHashMap(实现线程安全的原理);
PS:也可以使用Arrays、Collections集合工具类;

五、Java的多线程和锁机制

参考:Java的多线程和锁机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值