[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 为集合排序

原文地址:https://www.cnblogs.com/jimwind/p/2954514.html