一、集合类与数据容器
1、集合与数组的特点:
集合只存储对象,是一个容器,用于存放对象,长度可变,要存储基本数据需先转换为对象
数组可存对象,也可是基本数据,长度不可变,是一个容器
2、 Java用集合类来容纳不同种类的数据,这种容纳是建立在未知的基础上,即Java要用有限种类的集合类,来容纳无限种类的数据对象。
3、分类:Java的集合类可以分为三类:集、列表和映射
(1)集(Set):和数学上的“集合”概念相对应,是最简单的一种集合。
Set集合中不区分元素的顺序,因此也就不记录元素的加入顺序。
‚Set集合中不包含重复元素,即任意的两个元素e1和e2都有e1.equals(e2)=false,并且最多有一个null元素。
(2)列表(List)
List列表区分元素的顺序,即List列表能够精确的控制每个元素插入的位置,用户能够使用索引(元素在List中的位置)来访问List中的元素。List允许包含重复元素,可以通过角标操作。
(3)映射:保存的是“键-值”对信息,即Map中存储的每个元素都包括起标识作用的“键”和该元素的“值”两部分,查找数据时不需提供相应的“键”,才能查找到该“键”所映射的“值”。因此,Map集合中不能包含重复的“键”,并且每个“键”最多只能映射一个值。
二、Collection接口
Java.util.Collection接口是最基本的集合接口,是根接口,方法不能实现,只能在子类中实现。定义了集合操作的普遍方法。
public booleanadd(E e) :向集合添加一个元素,成功返回true,否则返回false,子接口中此方法发生了变化,set接口中添加重复元素时会被拒绝并返回false,而list接口则会接受重复元素并返回true。
public boolean addAll(Collection<?extends E> c) :将指定集合中的所有元素都添加到此集合中
public voidclear():移除此集合中的所有元素(可选操作)。
public booleancontains(Object o) :如果此集合包含指定的元素,则返回 true。
public booleancontainsAll(Collection<?> c) :如果此集合包含指定集合中的所有元素,则返回 true。
public booleanequals(Object o) :比较此集合与指定对象是否相等。
public inthashCode() :返回此集合的哈希码值。
public booleanisEmpty() :如果此集合不包含元素,则返回 true。
publicIterator<E> iterator() :返回在此集合的元素上进行迭代的迭代器。
public booleanremove(Object o) :从此集合中移除指定元素的单个实例,如果存在的话
public booleanremoveAll(Collection<?> c) :移除此集合中那些也包含在指定集合中的所有元素
public booleanretainAll(Collection<?> c) :仅保留此集合中那些也包含在指定集合的元素
public intsize() :返回此集合中的元素个数。
public Object[]toArray() :返回集合中所有元素的数组。
需注意:
Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”。
Collection接口有多个子接口,其中最重要的两个java.util.Set和java.util.List分别描述集Set和列表List。
三、列表
java.util.List接口描述的是列表结构,允许程序员对列表元素的插入位置进行精确控制,并增加了根据元素索引来访问元素、搜索元素等功能。在继承父接口Collection的基础之上,List接口新增的相应方法:
void add(intindex, E element) 在列表的指定位置插入指定元素
boolean add(E e)在列表的指定位置插入指定元素
E remove(intindex) 删除指定索引号元素
booleanremove(Object o) 删除第一个指定内容的元素
E get(int index)返回列表中指定位置的元素
int size() 返回列表中的元素数
intindexOf(Object obj) 如找到指定元素,返回索引值,否则返回—1
List<E>subList(int fromIndex, int toIndex) 返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图。
void clear()从列表中移除所有元素
Java.util.List接口的实现类有多个,分别体现了列表的不同分化形式。
ArrayList
Vector
Stack
LinkedList
四、Vector类:(底层数据结为数组,存储,查找慢)
构造方法:
Vector() :构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
Vector(Collection<? extends E> c) :构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。
Vector(int initialCapacity) :使用指定的初始容量和等于零的容量增量构造一个空向量。
Vector(int initialCapacity, intcapacityIncrement) :使用指定的初始容量和容量增量构造一个空的向量。
方法:
void addElement(E obj) :向Vector中添加元素
void insertElementAt(E obj, int index) :在指定索引处添加元素
void setElementAt(E obj, int index) :替换指定所引出元素
boolean removeElement(Object obj) : 删除指定队象元素
voidremoveElementAt(int index) :删除指定索引的元素
void removeAllElements() :删除所有元素 E elementAt(int index)
int size() :获取当前Vector的长度。
五、先进后出的Stack类(堆栈)
Stack是Vector类的子类,特点:“后进先出”(Last In First Out)类型的容器,即最后一个被“压(push)”进堆栈中的对象,会被第一个“弹(pop)”出来。
只可以从堆栈的顶端,执行从堆栈里弹出元素和压入元素的动作
构造方法
Stack() :用于创建支持“后进先出”访问方式的对象
方法
E peek() 返回栈顶元素,但没有弹出栈顶元素
E pop() 弹出栈顶元素,并返回其中的对象。
E push(E item) 向堆栈顶端压入item对象,同时将item对象返回。
boolean empty() 判断堆栈是否为空,如果该堆栈为空,返回true,反之返回false。
Push和pop是两个重要方法,反映了堆栈“后进先出”的重要特性
六、LinkedList类
构造方法:
LinkedList() :构造一个空列表。
LinkedList(Collection<? extends E> c):构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。
方法:
void addFirst(E e) :将指定元素插入此列表的开头。
void addLast(E e) :将指定元素添加到此列表的结尾。
E getFirst() :返回此列表的第一个元素。
E getLast() :返回此列表的最后一个元素。
E removeFirst() :移除并返回此列表的第一个元素。
E removeLast() :移除并返回此列表的最后一个元素。
boolean offerFirst(E e) :在此列表的开头插入指定的元素。
boolean offerLast(E e) :在此列表末尾插入指定的元素。
E peekFirst() :获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
E peekLast() :获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null
E pollFirst() :获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
E pollLast() :获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
七、ArrayList类:
构造方法:
ArrayList() :构造一个初始容量为 10 的空列表。
ArrayList(Collection<? extends E> c) :构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
ArrayList(int initialCapacity) :构造一个具有指定初始容量的空列表。
方法:
boolean add(E e) :将指定的元素添加到此列表的尾部。
void add(int index, E element) :将指定的元素插入此列表中的指定位置。
booleanaddAll(Collection<? extends E> c) : 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
boolean addAll(int index, Collection<?extends E> c) :从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
voidclear() :移除此列表中的所有元素。
Object clone() :返回此 ArrayList 实例的浅表副本。
boolean contains(Object o) :如果此列表中包含指定的元素,则返回 true。
voidensureCapacity(int minCapacity) :如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。
Eget(int index) :返回此列表中指定位置上的元素。
intindexOf(Object o) :返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
boolean isEmpty() :如果此列表中没有元素,则返回 true
intlastIndexOf(Object o) :返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。
Eremove(int index) :移除此列表中指定位置上的元素。
boolean remove(Object o) :移除此列表中首次出现的指定元素(如果存在)。
protected void removeRange(int fromIndex, int toIndex) :移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
Eset(int index, E element) :用指定的元素替代此列表中指定位置上的元素。
intsize() :返回此列表中的元素数。
Object[] toArray() :按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
<T> T[]toArray(T[] a) :按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
voidtrimToSize() :将此 ArrayList 实例的容量调整为列表的当前大小。
实现了Set接口的类HashSet
“基于散列表”的检测重复元素的策略:HashSet里的元素值同这个元素在Set里所存放的索引位置有个对应关系(散列函数),在HashSet里插入元素前,可根据这个元素值和对应关系,计算出这个元素在HashSet里的插入位置,如果在这个位置里(或位置周围)已经存在了待插入元素的值,则不能插入。
构造方法
HashSet()
HashSet(<E>c)
其他方法
booleancontains(Object o) 判断是否存在指定元素
HashSet类的综合应用。
Set<String> set = newHashSet<String>();
set.add("One"); set.add("One");
System.out.println(set.size()); //输出元素个数为:1
set.add(“Two”); System.out.println(set.size()); // 元素个数:2
System.out.println(set.contains(“One”)); //true,包含元素“One”
第一类集合有着共同的特性:它们存储的对象都是一元的(线性的),只不过存储的方式和使用的数据结构不同,以Collection为基类--封装了线性表的插入、删除等基本操作。
List接口和Set接口都是Collection的子接口
实现List接口:基于线性链表来存放数据的,例如Vector
实现Set接口:它们不允许有重复的元素,例如HashSet。
日常生活中,经常需要把复杂对象用索引形式管理的情况。
在Java中,专门建立以Hashtable为代表的“键-值”对类型对象,“键”--索引信息,而“值” –同索引值相对应的信息。
为什么要使用“键-值”对型的数据结构
原因:便于信息检索,提高在大数据量里检索信息的速度。
工作原理
(1)如果要从其中查询指定数据的话,不得不依次遍历这个数组,这样效率会很低。
(2)换一种思路:将10存入数组不是插入在第一个空闲空间里!