java常用的集合对象_java常用集合

java常用集合

简介

Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是Map(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

集合接口

接口接口描述

Collection 接口

Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。

Collection 接口存储一组不唯一,无序的对象。

List 接口

List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。

List 接口存储一组不唯一,有序(插入顺序)的对象。

Set接口

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。

Set 接口存储一组唯一,无序的对象。

SortedSet

继承于Set保存有序的集合。

Map

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

Map.Entry

描述在一个Map中的一个元素(键/值对)。是一个 Map 的内部接口。

SortedMap

继承于 Map,使 Key 保持在升序排列。

Enumeration

这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。

Set和List的区别

1:list的子类          :list集合包含重复元素,并且有序(存储顺序和取出顺序一致);

ArrayList:      底层是数组,线程不安全,查询快,增删慢,效率高;

vector:          底层是数组,线程安全,查询快,增删慢,效率低;

linkedList:      底层是链表,线程不安全,查询慢,增删快,效率高;

2:set类集合:   set集合不包含重复,具有唯一性;

HashSet:                  唯一性;

LinkedHashSet :      底层是hash表(唯一性)和链表(存放和取出有序)组成,所以具有唯一性和有序性;

TreeSet :                   唯一性,集合内部有两种排序方式:自然排序 和 比较器排序;

3: Map类集合:          键值对集合,键具有唯一性;

HashMap:     存储无序,键具有唯一性;

TreeMap:       存储为自然排序,键具有唯一性;

LinkedHashMap:    存放和取出有序,键具有唯一性;

java 集合之Queue接口:

Queue

队列集合在集合的基础上添加了增删改查操作,并且队列默认使用FIFO(先进先出)规则。

Queue接口:

队列的主要特点是在基本的集合方法之外,还提供特殊的插入、获取和检验操作。每个操作都提供两个方法,一种返回异常,一种返回null或者false.

队列一般满足先进先出规则(FIFO),除了优先队列(priority queue)和栈(stack),但是栈是FILO(先进后出规则),优先队列自己定义了排序规则。

队列不允许插入null元素,但是LinkedList可以

- add(E e) 插入一个元素到队列中,失败时返回IllegalStateException (队列容量不够)

- element() 返回队列头部的元素

- peek() 返回队列头部的元素,队列为空时返回null

- offer(E e) 插入一个元素到队列中,失败时返回false

- poll() 返回并移除队列的头部元素,队列为空时返回null

- remove() 返回并移除队列的头部元素,为空时报错

Deque

双端队列是一种线性集合,可以从两端操作的队列。

Deque的抽象数据模型

ADT Deque

Data 数据集合为{a1,a2,a3...an},数据类型都是DataType,双端队列,可以同时在队列的两端进行插入和获取操作。

Operations

InitDeque(); 初始化一个空队列

PeekFirstDeque(); 获取队列的头部元素

PeekLastDeque(); 获取队列的尾部元素

ClearDeque(); 清空队列的元素

DequeEmpty(); 判断队列是否为空

OfferFirstDeque(DataType d); 将元素d添加到队列头部

OfferFirstDeque(DataType d); 将元素d添加到队列尾部

DequeLength(); 队列的长度

Deque接口

双端队列

add(E e) 将新元素添加到队列的尾端(当不超过队列的容量时)

addFirst(E e) 将新元素添加到队列的头部

addLast(E e) 将新元素添加到队列的尾部

contains(Object o) 双端队列是否含有对象o

descendingIterator()倒叙返回队列的迭代器

element() 返回队列的头部元素

getFirst() 获取头部元素

getLast() 获取尾部元素

iterator() 迭代队列

offer(E e) 将新元素插入到队列尾部

offerFirst(E e) 将新元素添加到队列的头部

offerLast(E e) 将新元素添加到队列的尾部

peek() 返回队列的头部元素

peekFirst() 获取头部元素

peekLast() 获取尾部元素

pool() 返回并移除队列的头部元素

poolFirst() 获取并移除头部元素

poolLast() 获取并移除尾部元素

pop() 将一个元素出栈

push(E e) 讲一个元素压入栈

remove() 移除队列的头部元素

remove(Object o) 移除队列中第一个o

removeFirst() 移除队列的头部元素

removeFirstOccurrence(Object o) 移除队列中第一个o

removeLast() 移除队列的尾部元素

removeLastOccurrence(Object o) 移除队列中最后一个o

size()

ArrayDeque

双端队列的数组实现类,底层数据存储在数组中,数组双端队列是可扩容的.

数组双端队列就是双端队列接口的实现类,没有额外的功能,这里不详细讨论了。

PriorityQueue

不同于Queue,PriorityQueue优先队列默认按照自然顺序排序元素,或者按照定义的比较器排序元素。

逻辑上使用堆结构(完全二叉树)实现,物理上使用动态数组实现,并非像TreeMap一样完全有序,但是如果按照指定方式出队,结果可以是有序的。

BlockingQueue

A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

BlockingQueue methods come in four forms, with different ways of handling operations that cannot be satisfied immediately, but may be satisfied at some point in the future: one throws an exception, the second returns a special value (either null or false, depending on the operation), the third blocks the current thread indefinitely until the operation can succeed, and the fourth blocks for only a given maximum time limit before giving up.

阻塞队列用于处理当前操作无法立即满足的场景,比如队列中没有多余的存储空间时。

阻塞队列有四种实现方式:第一种当目前操作无法满足时,立即抛出异常,第二种当目前操作无法满足时,返回null或者false,第三种会无限阻塞直到操作成功,第四种会阻塞一定的时间(given maximum time limit)直到操作成功或者到时间期限后放弃。

BlockingQueue继承了Queue接口,具有队列的特性,同时定义了阻塞方法的通用实现。

void put(E e) 将特定元素插入阻塞队列,如果当前队列空间不够则等待知道队列有足够的存储空间

boolean offer(E e, long timeout, TimeUnit unit) 将特定元素插入阻塞队列,如果当前队列空间不够则等待知道队列有足够的存储空间,或者等待时间达到timeout后放弃操作

E take() 查找并且移除队列的头部元素,或者等待知道队列中有元素

E poll(long timeout, TimeUnit unit) 查找并且移除队列的头部元素,或者等待知道队列中有元素,或者等待时间达到timeout后放弃操作

int drainTo(Collection< ? super E> c) 将队列中的元素全部删除并且添加到集合c,如果发生异常,可能会出现一个元素同时存在队列和集合c的情况

int drainTo(Collection< ? super E> c, int maxElements) 将队列中的元素删除并且添加到集合c,最多不超过maxElements,如果发生异常,可能会出现一个元素同时存在队列和集合c的情况

面试相关:

1:HashMap与Hashtable的区别:

HashMap:   线程不安全,允许null键和null值;

Hashtable:   线程安全,不允许null键和null值;

2:list、set、Map是否都是继承map ??

否,list、set继承的collection接口,而map接口本身就是一个顶层接口;

3:collection与collections的区别:

collection :   是单列集合的顶层接口,有子接口list、set;

collections:   是针对集合操作的工具类,像常用的:对集合进行排序和二分查找;

collections的常用方法:

collections里面都是静态方法:

collections.sort(List<>  list)   :集合的自然排序;

collections.binarySearch(List<>  list  ,T   key)   : 集合的二分查找;

collections.max()          :  获取最大值;

collections .reverse()       :  元素反转;

collections .shuffle()      :    元素位置随机置换;

4:开发中如何使用线程安全的集合?

List objects = Collections.synchronizedList(new ArrayList<>());

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值