[Java2 入门经典]第14章 集合框架
前言:
Vector<T> 保存的是对象的引用,所有序列的集合都实现了Iterable<>接口,可以从集合中获取迭代器对象。
Vector<String> names = new Vector<String>();
java.util.Iterator<String> iter = names.iterator();
==============================================================================
集合框架由多种代表集合类的泛型构成。这些泛型定义在java.util包中。
为构造和管理程序中的对象集合提供了多种方式,尤其是在无法预先确定需要存储的对象的数目时,或者需要比数组提供的索引机制更灵活的集合对象访问方式时。
本章:
Q:什么是集、队列、映射,及其工作机理。
A:集里的对象根本不按任何特定的方式排列。集中不能有重复的对象。
序列中的对象以线性方式存储,不需要特殊的顺序,但有开头和结尾。因为是线性的,只能在序列开头或尾部添加新对象,或者在序列中指定对象的位置后面插入新对象。序列具有在序列的不同位置保存同一对象的多份副本的能力。
集:HashSet<T> LinkedHashSet<T> TreeSet<T> EnumSet<T extends Enum<T>>
列表:Vector<T> Stack<T> LinkedList<T> ArrayList<T>
队列:PriorityQueue<T>
映射:Hashtable<K,V> HashMap<K,V> LinkedHashMap<K,V> WeakHashMap<K,V> IdentityHashMap<K,V> TreeMap<K,V>
Q:集合对象Vector<T>是什么,以及如何在程序中使用Vector<T>对象。
A:Vector<T> 定义了元素类型为T的序列集合。
Q:如何管理Vector<T>对象才能保证元素的存储和获取是类型安全的。
Q:集合Stack<T>是什么,以及如何使用。
Q:如何使用集合LinkedList<T>
Q:如何在以HashMap<K,V>对象表示的散列表中存储和获取对象。
Q:如何为自己的类的对象生成散列码(hashcode)。
14.1
Java的集合框架是一套用来创建集合类的泛型。
14.2 对象的集合
在不同的组织方式中,主要有三种类型的集合,称作集(set),序列(sequence)和映射(map)。
集合只存储引用-至于对象本身,均位于集合外部。
14.3 迭代器
Iterator<>
列表迭代器
ListIterator<>
14.4 集合类
集 HashSet<T> LinkedHashSet<T> TreeSet<T> EnumSet<T extends Enum<T>>
列表 Vector<T> Stack<T> LinkedList<T> ArrayList<T>
队列 PriorityQueue<T>
映射 Hashtable<K,V> HashMap<K,V> LinkedHashMap<K,V> WeekHashMap<K,V> IdentityHashMap<K,V> TreeMap<K,V>
集,列表,队列的基类是AbstractCollection<> 提供的操作有:向集合中添加对象、从集合中删除对象、为集合提供迭代器,以及测试集合中是否还存有对象。
映射基类是AbstractMap<>
集合接口
。。。
14.5 使用向量
14.5.1 创建向量
Vector<String> transactions = new Vector<String>();//默认容量为10
Vector<String> transactions = new Vector<String>(100);//每次超过容量时,它的容量会加倍。
Vector<String> transactions = new Vector<String>(100,10); //每次超过容量时,增加10
向量的容量(capacity)和长度(size)
长度是指实际存储的对象的数量,每次加入对象时长度都会增加
容量是指能够存储的对象的最大数量。(容量会在对象数量超过当前容量时,自动按约定增加,如上面14.5.1)
(1)获取和确保容量大小
capacity()
ensureCapcity(150)
(2)改变长度
setSize(50)
如果每次超过当前容量时容量都加倍,那么将造成内存浪费,trimToSize() 改变容量以匹配当前的长度。
14.5.2 把对象存入向量中
add()
add(index,object) 索引值必须小于等于向量的长度,就是说这个位置已经存有对象的引用,或者位于向量的尾部。索引值从零开始。原先索引值大于或等于index的元素向后移动。
set(index, object)这是改变index对应的引用。通过返回值可以获得那个已经替换掉的对象。
addAll(myNamesList) 可以把另一集合中的所有对象添加到向量中 LinkedList<> myNamesList
addAll(i, myNamesList) 指定插入的位置。
14.5.3 从向量中获取对象
get(index)
firstElement() 获取第一个元素
lastElement() 获取最后一个元素
1、利用列表迭代器访问向量中的元素
ListIterator<String> listIter = names.listIterator();
ListIterator<String> listIter = names.listIterator(2); 该迭代器封装了names中从索引值为2的元素开始到最后一个的元素。
List<String> list = names.subList(2,5); 第一个参数是索引位置,第一个是上限元素位置,不包括在列表中,取的是2号到4号元素。
ListIterator<String> listIter = names.subList(5,15).listIterator(2); 此迭代器访问7号到14号的元素。
2、提取向量中的所有元素
有时希望能够将Vector>对象包含的元素作为普通数据取出来
String[] data = names.toArray(new String[names.size()]); //集合 -> 数组
String[] people = {"Brian","Beryl","Belinda", "Barry","Bill","Barbara"}
List<String> nameList = java.util.Arrays.asList(people); //数组 -> 集合
Vector<String> names = new Vector<String>(java.util.Arrays.asList(people));
14.5.4 从数组中删除对象
boolean remove(index)
boolean remove(object)
void removeElementAt()
removeAll
names.removeAll(names.subList(5,15));删除5号到14号索引元素。
retainAll
names.retainAll(names.subList(5,15)); 保留索引值5到14的元素,其余将被删除。
names.removeAllElements() 丢弃所有元素。
isEmpty()确定向量中是否仍含用元素
14.5.5 搜索向量
indexOf(object)
indexOf(object, position) 第二个实参是定义起始搜索位置的索引值。这个方法主要用于向量中有一个对象的多次引用的情况
14.5.6 应用向量
示例后续再看。
14.5.7 为集合排序