文档章节

Java基础之容器类库

klink
 klink
发布于 2014/05/29 17:32
字数 3148
阅读 54
收藏 2
点赞 1
评论 0

java.util提供了各种各样的基础容器类库,如List, Set, Queue以及 Map。总的来讲,java的基础容器类库可以分出两大类:Conllection,Map (List, Set, Queue都继承自Collection)。

  1. Collection: 指的通常是只存储value的数据容器。
  2. Map: 存储的是Key-Value的键值对。其中Key必须是唯一的,用户可以通过Key查找相应的Value。

Iterable

Collection接口继承了Iterable接口。该接口只定义了一个iterator()方法,并返回Iteractor接口。Iteractor的优势在于:我们可以使用Iteractor来遍历不同类型的容器,不论是List, Queue还是Set,他们都继承了Iterable。 Iterable 的接口方法,请参考Java API Doc。

http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html

Iterator 的接口方法,请参考 Java API Doc。

http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html

Collection

Collection 作为所有一维类型容器的基类,提供了一些操作容器的常用方法。详细的接口方法,请参考Java API Doc. http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html

List

List继承了Collection所有的接口方法,并且定义一些额外的方法:允许随机访问集合中的元素,可以在集合的中间进行插入和删除操作。

void	add(int index, E element)
//Inserts the specified element at the specified position in this list (optional operation).

boolean	addAll(int index, Collection<? extends E> c)
//Inserts all of the elements in the specified collection into this list at the specified position (optional operation).

E	get(int index)
//Returns the element at the specified position in this list.

int	indexOf(Object o)
//Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.


int	lastIndexOf(Object o)
//Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain the element.


ListIterator<E>	listIterator()
//Returns a list iterator over the elements in this list (in proper sequence).

ListIterator<E>	listIterator(int index)
//Returns a list iterator over the elements in this list (in proper sequence), starting at the specified position in the list.

E	remove(int index)
//Removes the element at the specified position in this list (optional operation).

E	set(int index, E element)
//Replaces the element at the specified position in this list with the specified element (optional operation).

List<E>	subList(int fromIndex, int toIndex)
//Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive.

从上面的列表中,我们可以看到不同于Iteractor接口的 ListIterator 接口。 这个接口的继承自Iteractor,它除了具有Iteractor往后遍历的功能之外,还可以往前遍历。并且可以获取当前元素在容器中的下标Index。

List有两种实现:ArrayList和LinkedList。

ArrayList

可以随机访问集合中的任意元素。但是在删除和插入时需要移动集合中的其他元素,效率较低。

ArrayList除了继承List的所有接口函数外,还继承了RadomAccess的接口。但是RadomAccess并没有接口方法。

ArrayList是非线程安全的,内部并没有提供同步机制。

ArrayList自己本身还实现了一些public方法

void	ensureCapacity(int minCapacity)
//Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument.

void	trimToSize()
//Trims the capacity of this ArrayList instance to be the list's current size.

LinkedList

只能顺序的访问集合中的元素,但是当插入和删除时不需要移动其他元素,效率很高。

LinkedList是非线程安全的,内部没有提供同步机制。

LinkedList也继承了List接口,并且实现了List接口中的所有方法。 此外ListedList还继承了Deque接口。而Deque继承了Queue接口。所以它可以用作 Stack, Queue, Double-ended Queue(双队列)。

Queue

Queue接口同样也继承了Collection接口。所不同的是Queue增加了队列的基本操作(First-in First-Out)。Queue的接口:

boolean	add(E e)
//Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available.
E	element()
//Retrieves, but does not remove, the head of this queue.
boolean	offer(E e)
//Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions.
E	peek()
//Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.
E	poll()
//Retrieves and removes the head of this queue, or returns null if this queue is empty.
E	remove()
//Retrieves and removes the head of this queue.

Deque

Deque继承自Queue接口。并提供了双向队列的一些操作。

void	addFirst(E e)
//Inserts the specified element at the front of this deque if it is possible to do so immediately without violating capacity restrictions.
void	addLast(E e)
//Inserts the specified element at the end of this deque if it is possible to do so immediately without violating capacity restrictions.
boolean	contains(Object o)
//Returns true if this deque contains the specified element.
Iterator<E>	descendingIterator()
//Returns an iterator over the elements in this deque in reverse sequential order.
E	getFirst()
//Retrieves, but does not remove, the first element of this deque.
E	getLast()
//Retrieves, but does not remove, the last element of this deque.
boolean	offerFirst(E e)
//Inserts the specified element at the front of this deque unless it would violate capacity restrictions.
boolean	offerLast(E e)
//Inserts the specified element at the end of this deque unless it would violate capacity restrictions.
E	peekFirst()
//Retrieves, but does not remove, the first element of this deque, or returns null if this deque is empty.
E	peekLast()
//Retrieves, but does not remove, the last element of this deque, or returns null if this deque is empty.
E	pollFirst()
//Retrieves and removes the first element of this deque, or returns null if this deque is empty.
E	pollLast()
//Retrieves and removes the last element of this deque, or returns null if this deque is empty.
E	pop()
//Pops an element from the stack represented by this deque.
void	push(E e)
//Pushes an element onto the stack represented by this deque (in other words, at the head of this deque) if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available.
boolean	remove(Object o)
//Removes the first occurrence of the specified element from this deque.
E	removeFirst()
//Retrieves and removes the first element of this deque.
boolean	removeFirstOccurrence(Object o)
//Removes the first occurrence of the specified element from this deque.
E	removeLast()
//Retrieves and removes the last element of this deque.
boolean	removeLastOccurrence(Object o)
//Removes the last occurrence of the specified element from this deque.
int	size()
//Returns the number of elements in this deque.

从Interface的列表中,可以看到了pop和push的方法,因此Deque其实也提供了Stack的操作。(First-in, Last-out)

E	pop()
//Pops an element from the stack represented by this deque.
void	push(E e)
//Pushes an element onto the stack represented by this deque (in other words, at the head of this deque) if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available.

此外在JDK1.0的时候,java提供了java.util.Stack类,Stack类提供了Stack的操作,但是并没有继承Deque接口。所以java在jdk 1.6推荐使用java.util.ArrayDeque类替代Stack类来实现Stack的功能。ArrayDeque实现了Deque接口。

ArrayDeque和LinkedList都实现了Deque的接口,所以都可以用作Stack,但是ArrayDeque和LinkedList内部实现是不同的,Array是基于顺序数组存储数据的,而LinkedList是基于链表存储数据的。

PriorityQueue

普通的Queue是遵循First-in, First-Out的准则的,但是PriorityQueue打破了这样的准则,当向PriorityQueue中放入元素时,它会基于Comparator定义的方法进行优先级比较,它会把优先级高的放到队列的最前面。

值得一提的是,PriorityQueue有6个构造函数,其中实用PriorityQueue(),PriorityQueue(int initialCapacity)构造的PriorityQueue队列,其队列中元素仍是按照插入的顺序排列的(First-in, First-out)。如果使用Comparator接口或者其子接口作为参数,PriorityQueue队列中的元素会依据Comparator的规则进行优先级对比。

PriorityQueue()
//Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.
PriorityQueue(Collection<? extends E> c)
//Creates a PriorityQueue containing the elements in the specified collection.
PriorityQueue(int initialCapacity)
//Creates a PriorityQueue with the specified initial capacity that orders its elements according to their natural ordering.
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
//Creates a PriorityQueue with the specified initial capacity that orders its elements according to the specified comparator.
PriorityQueue(PriorityQueue<? extends E> c)
//Creates a PriorityQueue containing the elements in the specified priority queue.
PriorityQueue(SortedSet<? extends E> c)
//Creates a PriorityQueue containing the elements in the specified sorted set.

Example 1: 使用PriorityQueue()构造的PriorityQueue

package io.github.klink;

import java.util.*;

public class PriorityQueueTest {

	public static void main(String[] args) {
		Queue<Integer> intQ = new PriorityQueue<Integer>();

		intQ.add(20);
		intQ.add(10);
		intQ.add(100);
		intQ.add(2);
		
		print(intQ);

	}

	public static void print(Queue<?> q) {
		Iterator<?> iter = q.iterator();

		while(iter.hasNext()) {
			System.out.print(iter.next()+"  ");
			
		}
	}
}

输出结果是插入的顺序:

2  10  100  20  

Example 2: 使用PriorityQueue(int initialCapacity, Comparator<? super E> comparator)构造的PriorityQueue

package io.github.klink;

import java.util.*;

public class PriorityQueueTest {

	public static void main(String[] args) {
		
		Queue<String> strQ = new PriorityQueue<String>(20,
				new Comparator<String>() {

					@Override
					public int compare(String str1, String str2) {
						// TODO Auto-generated method stub
						return str1.compareTo(str2);
					}
					
				});
		
		strQ.add("Hello");
		strQ.add("World");
		strQ.add("Nice");
		strQ.add("To");
		strQ.add("Meet");
		strQ.add("You");
		
		print(strQ);

	}

	public static void print(Queue<?> q) {
		Iterator<?> iter = q.iterator();

		while(iter.hasNext()) {
			System.out.print(iter.next()+"  ");
			
		}
	}
}

输出结果为:

Hello  Meet  Nice  World  To  You  

Set

Set接口只是继承了Collection的所有方法,本身并没有提供额外的方法。

Set的主要特点在于Set不能存储重复的值,当向Set中插入重复的值时,会报错。 基于Set接口的实现类有HashSet,LinkedHashSet,TreeSet。

HashSet

在往HashSet中存储数据时,会调用存储对象的getHashCode()方法,计算出唯一的hash值,该hash值会映射容器的一个位置,然后就会将该值存储在这个位置。所以HashSet中的元素是乱序的,我们利用Iteractor遍历HashSet时,获取的顺序并不是数据插入的顺序。

HashSet会初始化一段数组空间,当元素逐渐增多时,数据空间也会随之增大。

LinkedHashSet

它继承自HashSet,所以它的内部存储结构跟HashSet是一样的。

但是它除了具有HashSet的功能之外,还维护了一个链表,这个链表保存了HashSet中元素的插入顺序。所以通过Iteractor遍历LinkedHashSet时,元素获取的顺序是插入时的顺序。

TreeSet

TreeSet除了继承了Set接口之外,还继承了NavigableSet接口。NavigableSet又继承了SortedSet接口。NavigableSet是在java 1.6出现的,在java 1.5之前,TreeSet是直接继承的SortedSet接口。

TreeSet基于红-黑二叉树实现的,关于红-黑二叉树的介绍可参考http://blog.csdn.net/v_JULY_v/article/details/6105630

将元素存储到TreeSet,TreeSet中的元素会基于comparator()方法对元素进行比较后插入树中。所以利用Iteractor遍历TreeSet时,元素获取的顺序已经是通过comparactor()排完序的结果了。

SortedSet

SortedSet接口也继承了Set接口。并提供了一些额外的方法。具体每个方法的含义可参考注释。

Comparator<? super E>	comparator()
//Returns the comparator used to order the elements in this set, or null if this set uses the natural ordering of its elements.
E	first()
//Returns the first (lowest) element currently in this set.
SortedSet<E>	headSet(E toElement)
//Returns a view of the portion of this set whose elements are strictly less than toElement.
E	last()
//Returns the last (highest) element currently in this set.
SortedSet<E>	subSet(E fromElement, E toElement)
//Returns a view of the portion of this set whose elements range from fromElement, inclusive, to toElement, exclusive.
SortedSet<E>	tailSet(E fromElement)
//Returns a view of the portion of this set whose elements are greater than or equal to fromElement.

NavigableSet

NavigableSet继承了SortedSet接口,除此之外还定义了额外的一些方法。感觉很强大的样子。

E	ceiling(E e)
//Returns the least element in this set greater than or equal to the given element, or null if there is no such element.
Iterator<E>	descendingIterator()
//Returns an iterator over the elements in this set, in descending order.
NavigableSet<E>	descendingSet()
//Returns a reverse order view of the elements contained in this set.
E	floor(E e)
//Returns the greatest element in this set less than or equal to the given element, or null if there is no such element.
NavigableSet<E>	headSet(E toElement, boolean inclusive)
//Returns a view of the portion of this set whose elements are less than (or equal to, if inclusive is true) toElement.
E	higher(E e)
//Returns the least element in this set strictly greater than the given element, or null if there is no such element.
Iterator<E>	iterator()
//Returns an iterator over the elements in this set, in ascending order.
E	lower(E e)
//Returns the greatest element in this set strictly less than the given element, or null if there is no such element.
E	pollFirst()
//Retrieves and removes the first (lowest) element, or returns null if this set is empty.
E	pollLast()
//Retrieves and removes the last (highest) element, or returns null if this set is empty.
NavigableSet<E>	subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
//Returns a view of the portion of this set whose elements range from fromElement to toElement.
NavigableSet<E>	tailSet(E fromElement, boolean inclusive)
//Returns a view of the portion of this set whose elements are greater than (or equal to, if inclusive is true) fromElement.

TreeSet则完全实现这些方法。除此之外并没有提供额外的方法。

Map

Map用于存储Key-Value的容器。在Map容器中Key是唯一的,不能重复。可以看出Map与Set有很多相似之处。(其实Set的实现如HashSet,都是基于Map的实现进行封装的如HashMap)具体Map接口的方法,请参考Java API Doc http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

Map的实现主要有HashMap, LinkedHashMap, TreeMap。

原理与Set一样。

历史遗留的类库

Vector

Vector是在java 1.0的时候开发的,当时是作为单独的容器提供了ArrayList的功能。后面在java 1.2中,也让Vector重新继承了List接口。

Stack

在上面的介绍中,也提到过,继承自Vector。

Dictionary 以及HashTable

HashTable起初设计是并没有考虑到可扩展性,但是也在java 1.2中,重新继承了Map接口。 HashTable是线程安全的。

© 著作权归作者所有

共有 人打赏支持
klink
粉丝 0
博文 11
码字总数 29450
作品 0
苏州
gradle/Groovy语法

Groovy官网的介绍(http://www.groovy-lang.org/download.html#gvm) Gradle API 文档: https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 深入理解Android(一)......

shareus ⋅ 04/27 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 06/21 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

[Java 并发编程] 集合框架之 同步容器类 & 并发容器类

吾生也有涯,而知也无涯。———《庄子》 通过上一篇文章,我们已经知道设计一个线程安全类的原则和步骤,以及在设计过程中我们应当注意的细节。实际上,Java 的集合库包含了线程安全集合和非...

seaicelin ⋅ 05/25 ⋅ 0

你不知道 Java 10 的 5 件事

局部变量类型推断是有争议的热点,但Java 10在JVM中的垃圾收集和容器识别上带来了可喜的变化。 关于本系列 所以你认为你了解Java编程? 事实是,大多数开发人员只是浮于Java平台的表面上,仅...

ismdeep ⋅ 04/24 ⋅ 0

JVM性能调优实践——JVM篇

前言 在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践...

lijingyao8206 ⋅ 05/24 ⋅ 0

【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___ ⋅ 05/06 ⋅ 0

编写你的第一个HelloWorld

写在前面的话 因为Java基础是以后学习框架的基石,因此开个文集首先写写Java基础,本来想直奔基础知识的介绍,但是为了保证知识的完整性,因此从Java安装和运行“hello world”开始(虽然百度...

nanaFighting ⋅ 06/15 ⋅ 0

IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981 ⋅ 2016/07/25 ⋅ 14

Java 常用工具包 - VJTools

VJTools,是主力于Java的唯品会,关于Java的一些小家底:《唯品会Java开发手册》,核心基础类库VJKit ,问题排查工具VJMap 和 VJTop 三部分。

江南白衣 ⋅ 06/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20.zip压缩 tar打包 打包并压缩

6月25日任务 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 6.5 zip压缩工具: zip支持压缩目录 zip压缩完之后原来的文件不删除 不同的文件内容其实压缩的效果不一样 文件内有很多重复的用xz压...

王鑫linux ⋅ 2分钟前 ⋅ 0

double类型数据保留四位小数的另一种思路

来源:透析公式处理,有时候数据有很长的小数位,有的时候由在四位以内,如果用一般的处理方法,那么不足四位的小树会补充0到第四位,这样子有点画蛇添足的感觉,不太好看。所以要根据小数的...

young_chen ⋅ 9分钟前 ⋅ 0

Python 优化 回溯下降算法

使用sympy构造表达式,实现回溯下降算法 画出函数图像,先使用暴力搜索,找到最小值约为2.5左右 然后选定初始点,开始进行回溯搜索,下降方向为负梯度方向 下降的误差与步数大致呈现下面的状...

阿豪boy ⋅ 14分钟前 ⋅ 0

Django配置163邮箱出现 authentication failed(535)错误解决方法

最近用Django写某网站,当配置163邮箱设置完成后,出现535错误即:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') Django初始配置邮箱设置 EMAIL_HOST = "smtp.1...

陈墨轩_CJX ⋅ 15分钟前 ⋅ 0

用接口模拟可伸缩枚举(34)

1、枚举的可伸缩性最后证明都不是什么好点子 扩展类型的元素是基本类型实例,基本类型的实例却不是扩展类型的元素,很混乱 目前还没有很好的方法来枚举基本类型的所有元素,及其扩展 可伸缩性...

职业搬砖20年 ⋅ 19分钟前 ⋅ 0

Ubuntu18.04 IDEA快捷键无法使用

IDEA默认的回退到上一视图的快捷键是Ctrl + Alt + Left,在ubuntu中这个快捷键被占用了,在16.04中可以在界面中取消这个快捷键,但是18.04就看不到了,可以使用以下命令解决 gsettings set ...

Iceberg_XTY ⋅ 23分钟前 ⋅ 0

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 35分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 55分钟前 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 今天 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部