java集合介绍
java集合是java提供的工具包,包含常用的数据结构:集合、链表、队列、栈、数组、映射等。java集合工具包主要在java.util.*下。java集合主要划分为4部分:List列表、Set集合、Map映射以及工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。集合的框架图如下:
从上图中可以看出,java集合主要由Collection和Map两大体系构成。其中Collection和Map是两大体系的顶层接口。
Collection
Collection是集合类的根接口/祖宗接口。在java源码中Collection接口没有直接的实现类,但有两个子接口:List集合和Set集合。List集合是一个有序的集合,可存储重复的元素。Set集合是无序的且不可存储重复的元素。Queue(队列)是在JDK1.5才出现的新的集合,主要以数组和链表形式存在。
Collection集合
Collection集合的三个接口:List、Set、Queue队列
List集合
List接口有三个接口实现类:ArrayList、LinkedList、Vector集合。
ArrayList集合
1)底层数据结构是数组,查询快,但增删慢
2)线程不安全,效率高
LinkedList集合
1)底层数据结构是链表,查询慢,但增删快
2)线程不安全,效率高
Vector集合
1)底层数据结构是数组,查询快,增删慢
2)线程安全,效率低
Set集合
Set接口有两个实现类:HashSet和TreeSet集合
HashSet集合
1)底层数据结构是哈希表,HashSet依赖于HashMap,它实际是通过HashMap实现的。哈希表依赖hashcode和equal方法
2)两个方法执行顺序是先判断hashcode值是否相同,若相同的话则执行equal方法看返回值是否相同,true表示有重复元素,false表示无重复元素直接添加此元素。
TreeSet集合
1)底层数据结构是二叉树。它依赖TreeMap,实际是通过TreeMap实现的
Queue队列
Queue接口,存储有序可重复元素,有两个子接口:Deque和BlockingQueue。
队列分为两种,阻塞队列和非阻塞队列。阻塞队列是如果你试图向一个 已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致消费者线程或者生产者线程阻塞,非阻塞队列是能即时返回结果(消费者),但必须自行编码解决返回为空的情况处理(以及消费重试等问题)。这两种都是线程安全的。理论上非阻塞队列更高效,但是实际应用中阻塞队列已经可以应付大多数的并发了。
队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
Deque
ConcurrentLinkedDeque,ConcurrentLinkedQueue
BlockingQueue
ArrayBlockingQueue,DelayQueue,LinkedBlockingDeque,LinkedBlockingQueue,LinkedTransferQueue,PriorityBlockingQueue,SynchronousQueue
Map
Map集合和Collection接口相互独立的,属于集合的一部分。Map集合是双列的,一般以成对形式出现,键值对方式,同时不允许出现相同的key。
1)Map集合是Map集合的根接口,子类有:HashMap和TreeMap集合两个子类。
2)Map集合中键不可重复,值可重复。
AbstractMap
是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。
Hashtable
虽然继承了Dictionary,但它实现了Map接口。
HashMap
底层数据结构是哈希表
Treemap
底层数据结构是二叉树,其性质和Set的底层数据结构一样。
Iterator迭代器
Iterator是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。Collection依赖Iterator,其实现类都需要iterator函数,返回一个Iterator对象。
ListIterator是专门遍历List存在的。
工具类
Arrays操作数组的工具类
Collections操作集合的工具类。
java中ArrayLiat和HashSet的区别
首先分别介绍
ArrayList:
1)ArrayList中存放顺序和添加顺序是一致的。并且可重复元素。
2)不是线程安全的,不是线程同步的