@SupperWarnings注解及其参数表示只有有关“不受检查的异常”的警告信息因该被抑制,但可能会导致运行时错误。
应用预定义的泛型可以在编译期防止将错误类型的对象放置到容器中。
当你指定了某个类型作为泛型参数时,你不仅限于只能将该确切类型的对象放置到容器中。向上转型也可以像作用与其他类型一样作用于容器。
Java容器类类库的用途是保存对象,并将其划分为两个不同的概念:
Collection:一个独立元素的序列,这些元素都服从一条或多条规则。Collection接口概括了序列的概念:一种存放一组对象的方式。Collection在每个槽中只能保存一个对象,此类容器包括List,它以特定的顺序保存一组元素;Set,元素不能重复;Queue只允许在容器的一端插入对象,并从另一端移除对象
Map:一组成对的“键值对”对象,允许你使用键来查找值。Map在每个槽内保存了两个对象,即键和与之相关联的值
Arrays.asList() 方法是接受一个数组或是一个用逗号分隔的元素列表,并将其转换为一个List对象,但这种情况下,其底层表示是数组,因为此不能调整尺寸,当你试图用add()或delete()方法在这种列表中添加或删除元素,就可能会引发去改变数组尺寸的尝试,在运行时获得Unsupport Operation错误。Arrays.asList()对它所产生的List做处了最理想的假设,它只能产生上一层级的父类List,若想明确告诉编译器要产生的类型,应使用显示类型参数说明:Arrays.<>asList();
Collection.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,将元素添加到Collection中。Collection.addAll()只接受另一个Collection对象作为参数
HashSet是最快获取元素的方式;TreeHashSet按照比较结果的升序保存对象;LinkedHashSet可以按照被添加的顺序来保存对象。
HashMap是采用了最快的查找技术;TreeHashMap按照比较结果的升序保存key;LinkedHashMap可以按照插入顺序来保存key,同时保留了HashMap的查询速度
List
list可以将元素维护在特定的序列中。有两种类型的List:ArrayList,它长于随机访问元素,但是在List的中间插入和移除元素时较慢;LinkedList,它长于在List中间进行的插入和删除操作,提供了顺序访问。LinkedList在随机访问方面相对较慢。
List常用的一些方法:
contains():确定某个对象是否在list中
remove(obj):移除obj,
indexOf(obj):返回该对象在list中所处位置的索引编号
subList(startIndex, endIndex):从list中国年创建出一个片段
containsAll(list):确定某个list是否在这个list中,在list中的存储顺序不重要
retainAll(list):返回两个list的交集
removeAll(list):从list中移除list
set(index, obj):在list的index位置存放obj
addAll(index, list):在index处插入list,index也可以省略,则在list的末尾处插入list
toArray():讲一个list转换成数组
迭代器是一个对象,它的工作是遍历并选择序列中的对象。迭代器通常被称为轻量级对象,创建它的代价比较小。
Java的Iterator只能单向移动,这个Iterator只能用来
使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素
使用next()获得序列中的下一个元素
使用hasNext()检查序列中是否还有元素
使用remove()将迭代器新返回的元素删除
ListIterator是Iterator的子类型,用于各种List的访问。它可以双向移动,还可以产生相对于迭代器在列表中指向当前位置的前一个和后一个元素的索引。并且可以用set()方法替换它访问过的最后的一个元素。调用listIterator()方法产生一个指向List开始处的ListIterator,并且还可以通过调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
ListIterator常用方法:
listIterator.next(); //返回下一个元素
listIterator.hasNext(); //判断是否有下一个元素
listIterator.nextIndex(); //返回下一个元素的下标
listIterator.previous(); //返回上一个元素
listIterator.hasPrevious(); //判断是否有上一个元素
listIterator.previousIndex(); //返回上一个元素的下标
listIterator.set(T); //在当前位置用T替换
LinkedList
getFirst()和element()完全一样,它们都返回列表的头,并不移除它,当List为空时,则抛出NoSuchElementException。
peek()方法也返回list中的第一个元素,但当List为空时,它返回null。
removeFirst()和remove()完全一样,它们都移除并返回列表的头,在列表为空时抛出NoSuchElementException。
poll()方法移除并返回list中的头,但当List为空时,它返回null。
addFirst()方法在list的头部插入一个元素。
add()和addList()相同,将元素插入到列表的尾部。
removeLast()移除并返回列表中的最后一个元素
Stack
栈是指先进后出的容器,有时也称叠加栈
public class Stack { private LinkedList<T> storage = new LinkedList<T>(); public void push(T v){ storage.addFirst(v); } public T peek(){ storage.getFirst(); } public T pop(){ storage.removeFirst(); } public boolean isEmpty(){ return storage.isEmpty(); } @Override public String toString() { return storage.toString(); } }
Set
Set不保存重复的元素,是基于对象的值来确定归属性的。
对数据结构进行排序,使用TreeSet。
Set常用方法:
set.addAll(set, T[]) //
set.add(T) //向Set中添加某个元素
set.contains(T) //判断set是否还有某个元素
set.containsAll(anotherSet) //判断set是否含有anotherSet中的所有元素
set.remove(T) //从set中移除某个元素
Queue
队列是一个典型的先进先出容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出是相同的。
LinkedList实现了Queue接口。
Queue常用接口:
offer()讲一个元素插入到队尾
peek()和element()在不移除的情况下返回队头,但peek()方法在队列为空时返回null,而element()会抛出NoSuchElementException异常
poll()和remove()方法将队头移除并返回队头,但poll()方法在队列为空时返回null,而element()则会抛出NoSuchElementException异常
队列规则是指在一组队列中的元素的情况下,确定下一个弹出队列元素的规则。先进先出声明的是下一个元素应该是等待时间最长的元素。优先级队列声明下一个弹出元素是最需要的元素。
Java SE5提供了Priority Queue方法。当在Priority Queue上调用offer()方法来插入一个对象时,这个对象会在队列中被排序。默认的排序将使用对象在队列中的自然顺序,但可以通过提供自己的Comparator来修改这个顺序。 PriorityQueue可以确保当你调用peek(),pool()和remove()时,获取的元素将是队列中国年优先级最高的元素。
Collection是描述所有序列容器的共性根接口。