JAVA容器的那些事—集合

Posted songyajian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA容器的那些事—集合相关的知识,希望对你有一定的参考价值。

1.首先我们先讲下Collection接口

Collection接口:

Collection是最基本的集合接口,它是由一个独立元素所组成的序列,这些元素服务一条或多条规则。一个Collection代表一组Object,即Collection的元素(Elements)。

有些Collection允许有相同的元素,另一些则不允许,有些可以进行排序,另一些则也不允许,Java SDK不提供直接继承Collection的接口,而是继承Collection的一些子接口,“如List,Set”接口。

Collection的一些方法:

技术分享图片

 

2.然后再说下List接口,Set接口和Map接口,当然顺便提一下Queue队列

List接口:

List是有序的Collection,按照插入的顺序保存元素,使接口能够精确的控制每个元素插入的位置,用户能够根据索引来访问List中的元素。

实现List接口的常用类有:LinkedList,ArrayList,Vector和Stack。

 

Set接口:

核心点,Set是不包含重复元素的Collection(例:e1和e2都有e1.equals(e2)=false),允许有Null元素,但最多只能有一个Null元素。

Set容器类主要有HashSet和TreeSet等。 

      

Map接口:

Map和List,Set接口有所不同,没有继承Collection。它是一组成对的“键值对”对象,允许通过键来查找值。

Map提供key到value的映射,一个Map中不能包含有相同的key,一个key只能映射一个value(一对一的关系)。

实现Map接口的常用类有:HashTable,HashMap,WeekHashMap。

       

主要方法:
1.boolean equals(Object o)比较对象
2.boolean remove(Object o)删除一个对象
3.put(Object key,Object value)添加key和value
4.Hashtable类

 

Queue接口:

Queue(又称"队列")它是一种特殊的线性表,按照排队规则来确定对象产生的顺序。

简单来说就是按照"先进先出"规则,表的前端部分用作删除操作,后端部分用作插入操作,前端删除部分称做:“对头”;后端插入部分称做:“队尾”。如果队列为空的话,又被称做:“空队列”。  

值得一提的是LinkedList也实现了Queue接口,所以也可以把LinkedList当做Queue来用。

 

 

3.一起探索下实现List接口的常用类:LinkedList,ArrayList,Vector和Stack

LinkedList类:

LinkedList实现了List接口,允许Null元素,并且是线程不安全的(非线程安全),且无法随机访问,原因就是它的底层是通过链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用,所以在速度方面的话相对ArrayList要快一些。

此外LinkedList还提供了一些额外的方法:get(),remove(),insert()用作LinkedList的首部和尾部,这些方法主要可以用作堆栈(stack),队列(queue),双向队列(deque)。

注意:LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(…));

         

ArrayList类:

ArrayList实现的是可变大小的数组,它允许所有元素,包括Null元素,并且也是线程不安全的(非线程安全),但是允许随机访问,原因就是它是数列结构(数组),此结构本身就适合随机访问。

[]数组,Vector,ArrayList的结构在随机访问,遍历和获得大小方面都是O(1)的性能。

注意:和LinkedList一样,ArrayList也是非同步的(unsynchronized)。一般情况下使用这两个就可以了。因为非同步,所以效率比较高,如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

                              

Vector类:

和ArrayList非常的类似,不同处就是,它是线程安全的,由Vector创建的Iterator(迭代器),本身和ArrayList创建的Iterator(迭代器)是同一个接口,但因为Vector是线程安全的,所以当一个Iterator(迭代器)被创建而且在被使用时,另一个线程会改变Vector的状态(例如:“添加”或“删除”一些元素),这时候调用Iterator(迭代器)的方法时会抛出异常:" ConcurrentModificationException",因此这个异常必须被捕获。

 

Stack类:

继承了Vector,实现“后进先出”的堆栈,Stack提供了5个方法让Vector当做堆栈被使用,基本的push()和pop()方法,还有peek方法取得栈顶的元素,empty方法判断堆栈是否为空,search方法检测一个元素在堆栈中的位置。

注:Stack刚创建后是“空栈

 




以上是关于JAVA容器的那些事—集合的主要内容,如果未能解决你的问题,请参考以下文章

强隔离容器的那些事

云原生制品那些事:容器镜像

iOS 端容器之 WKWebView 那些事

iOS 端容器之 WKWebView 那些事

唠唠 RDS 那些事 ——发布虚拟机

唠唠 RDS 那些事 ——发布虚拟机