集合类
一.集合概述:
在我们编程时候,我们常常要利用集合把一组数据存储起来,数据多了以后,我们用对象存储,对象多了,我们用数组存储,但是数组也有以下的缺陷:
- 数组长度是不可变的,一旦定义了一个数组,如果要保存个数变化的数据,就不能了.
- 数组无法保持具有映射关系的数据,如 张三-50岁, 李四--25岁,如果确定两个数组,那么它们的元素之间要有一定的联系,很麻烦.
- 数组只能存储单一的类型
于是,Java提供了集合类,高效地解决了上面三个问题,集合类又称做是容器类,集合里面保存的是对象,所有集合类位于java.util包下面
如下图,对集合类做个概括
集合的结构
Java集合类主要由两个接口派生出来:Collection 和Map, 其中
Collection----
|---List 有序且允许元素重复。
|--ArrayList 一种类似数组的形式进行存储
|--LinkedList 链表存储
|--Vector 实现类似数组功能
|---Set 不允许元素重复
|--HashSet 哈希编码存储
|--TreeSet 唯一一个在集合中有排序的
Map--- key对value的映射集合
|--HashMap 哈希结构
|--TreeMap 二叉树结构
二. Collection 接口 是List 和Set的父接口,定义了如下操作集合元素的方法
(1) 对单个元素的添加、删除操作:
boolean add(Object o):将对象添加给集合
boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o
(2) 查询操作:
int size() :返回当前集合中元素的数量
boolean isEmpty() :判断集合中是否有任何元素
boolean contains(Object o) :查找集合中是否含有对象o
Iterator iterator() :返回一个迭代器,用来访问集合中的各个元素
boolean add(Object o):将对象添加给集合
boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o
(2) 查询操作:
int size() :返回当前集合中元素的数量
boolean isEmpty() :判断集合中是否有任何元素
boolean contains(Object o) :查找集合中是否含有对象o
Iterator iterator() :返回一个迭代器,用来访问集合中的各个元素
|--boolean hasNext() 如果仍有元素可以迭代,则返回 true。
|--E<泛型>next() 返回迭代的下一个元素。
(3) 对组操作 :作用于元素组或整个集合
boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素
(3) 对组操作 :作用于元素组或整个集合
boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素
boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合
void clear(): 删除集合中所有元素
void clear(): 删除集合中所有元素
void removeAll(Collection c) : 从集合中删除集合c 中的所有元素
void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素
(4) Collection转换为Object数组 :
Object[] toArray() :返回一个内含集合所有元素的array
Object[] toArray(Object[] a):返回一个内含集合所有元素的array。
import java.util.*;
public class Demo_Collection {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Collection c=new ArrayList();
c.add("哥哥");
c.add("姐姐");
c.add(1);
System.out.println(c.size());
c.remove(1);
System.out.println(c.size());
System.out.println(c.contains("哥哥"));
Iterator i=c.iterator();
While(i.hasNext()) {
System.out.println(i.next());
}
Collection person=new HashSet();
person.addAll(c);
System.out.println(person);
person.clear();
System.out.println(person);
}
}
List 接口 代表一个有序集合,集合中的每个元素都有相应的顺序索引,可以通过索引来访问指定的集合元素。因为List集合默认按元素的添加顺序设置元素的索引。
void add(int index, Object element): 在指定位置index上添加元素element
boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index
Object get(int index): 返回List中指定位置的元素
int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1
int lastIndexOf(Object o) :返回最后一个出现元素o的位置,否则返回-1
Object remove(int index) :删除指定位置上的元素
Object set(int index, Object element) :用元素element取代位置index上的元素,并且返回旧的元素
(2) List 接口不但以位置序列迭代的遍历整个列表,还能处理集合的子集:
ListIterator listIterator() : 返回一个列表迭代器,用来访问列表中的元素
ListIterator listIterator(int index) : 返回一个列表迭代器,用来从指定位置index开始访问列表中的元素
List subList(int fromIndex, int toIndex) :返回从指定位置fromIndex(包含)到toIndex(不包含)范围中各个元素的列表视图
void add(int index, Object element): 在指定位置index上添加元素element
boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index
Object get(int index): 返回List中指定位置的元素
int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1
int lastIndexOf(Object o) :返回最后一个出现元素o的位置,否则返回-1
Object remove(int index) :删除指定位置上的元素
Object set(int index, Object element) :用元素element取代位置index上的元素,并且返回旧的元素
(2) List 接口不但以位置序列迭代的遍历整个列表,还能处理集合的子集:
ListIterator listIterator() : 返回一个列表迭代器,用来访问列表中的元素
ListIterator listIterator(int index) : 返回一个列表迭代器,用来从指定位置index开始访问列表中的元素
List subList(int fromIndex, int toIndex) :返回从指定位置fromIndex(包含)到toIndex(不包含)范围中各个元素的列表视图
注意:Object set(int index, Object element) 替换元素不能超出List集合的索引范围。也就是不能改变集合的长度。
ArrayList 动态分配,动态的增加和减少元素,查询速度快。
主要方法:
boolean add(E e) 将指定的元素添加到此列表的尾部。
void add(int index, E element) 将指定的元素插入此列表中的指定位置
E set(int index, E element)
用指定的元素替代
此列表中指定位置上的元素。
小结:在每个ArrayList 对象中都有一个capacity.这个capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的capacity在常量时间内自动增加。开始创建是容量10的列表,超过则50%添加,而Vector 是100%添加。
可以自定义增加分配的空间
void ensureCapacity(int minCapacity) 增加了容量的ArrayList实例,如果有必要,以确保它可以容纳至少指定的元素数量的最小容量参数。
LinkList 链表排序 是对链头,链尾操作的集合类,利用它,可以实现堆栈,队列的数据结构
addFirst(e); 在链头插入元素
getFirst(e); 取出链头的元素
removeFirst(e); (有打印作用)
.....
removeFirst(e); (有打印作用)
.....
堆栈(先进后出)addLast(e) --removeLast(e);
队列 (先进先出)
Set 接口 不可以存放重复,同样的元素,元素存取是无序的。即是存入和取出顺序是不同的。
前述:在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现 Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过 Comparator接口来定义您自己的比较方式。
Comparable接口 常用类:
Character:按照字符的UNICODE值进行比较
String: 按照字符的UNICODE值进行比较
HashSet 线程不安全,不是同步的,不能保证元素排列顺序,元素值可以为null,但是存取速度快。
HashSet中的对象需要实现 hashCode()方法,利用哈希码的算法。而对于唯一性是通过hashCode和equals方法来完成的,当元素的hashcode值相同。当元素在HashSet中存储对象时,会分配一个hash值,这个hash值是不定的,而在hash表当中是按照hash值的大小取出来的,所以HashSet实现了无序。如果两个对象的hash值相同,则会判断比较是否同一个对象,调用equals的方法比较,如果不同,则存入,相同,则不存储,这保证了HashSet接口对象的唯一性。
构造函数:
(1) HashSet(): 构建一个空的哈希集
(2) HashSet(Collection c): 构建一个哈希集,并且添加集合c中所有元素
(3) HashSet(int initialCapacity): 构建一个拥有特定容量的空哈希集
(4) HashSet(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空哈希集。LoadFactor是0.0至1.0之间的一个数
(2) HashSet(Collection c): 构建一个哈希集,并且添加集合c中所有元素
(3) HashSet(int initialCapacity): 构建一个拥有特定容量的空哈希集
(4) HashSet(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空哈希集。LoadFactor是0.0至1.0之间的一个数
TreeSet 底层数据结构是红黑树。给据红黑树数据结构对元素进行排序,它支持两种排序方法。
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法来比较元素间的大小关系。该方法返回一个整数值,正数,0,负数分别表示大于,等于,小于。 这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet第二种排序(主要的)当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
定义一个类,实现Comparator接口,覆盖compare方法。
构造方法:
(1) TreeSet():构建一个空的树集
(2) TreeSet(Collection c): 构建一个树集,并且添加集合c中所有元素
(3) TreeSet(Comparator c): 构建一个树集,并且使用特定的比较器对其元素进行排序
“comparator比较器没有任何数据,它只是比较方法的存放器。这种对象有时称为函数对象。函数对象通常在“运行过程中”被定义为匿名内部类的一个实例。”
TreeSet(SortedSet s): 构建一个树集,添加有序集合s中所有元素,并且使用与有序集合s相同的比较器排序
(2) TreeSet(Collection c): 构建一个树集,并且添加集合c中所有元素
(3) TreeSet(Comparator c): 构建一个树集,并且使用特定的比较器对其元素进行排序
“comparator比较器没有任何数据,它只是比较方法的存放器。这种对象有时称为函数对象。函数对象通常在“运行过程中”被定义为匿名内部类的一个实例。”
TreeSet(SortedSet s): 构建一个树集,添加有序集合s中所有元素,并且使用与有序集合s相同的比较器排序
Map 用于保存具有映射关系的数据,key值(不允许重复),value值。一个key值对应一个value值,value值可以重复。相当于高中时期学过的映射关系。
Map 接口常用的方法:
(1) 添加、删除操作:
Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在,那么与此关键字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回null
Object remove(Object key): 从映像中删除与key相关的映射
void putAll(Map t): 将来自特定映像的所有元素添加给该映像
void clear(): 从映像中删除所有映射
“键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。”
(2) 查询操作:
Object get(Object key): 获得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有在该映像中找到该关键字,则返回null
boolean containsKey(Object key): 判断映像中是否存在关键字key
boolean containsValue(Object value): 判断映像中是否存在值value
int size(): 返回当前映像中映射的数量
boolean isEmpty() :判断映像中是否有任何映射
(3) 视图操作 :处理映像中键/值对组
Set keySet(): 返回映像中所有关键字的视图集
“因为映射中键的集合必须是唯一的,您用Set支持。你还可以从视图中删除元素,同时,关键字和它相关的值将从源映像中被删除,但是你不能添加任何元素。”
Collection values():返回映像中所有值的视图集
“因为映射中值的集合不是唯一的,您用Collection支持。你还可以从视图中删除元素,同时,值和它的关键字将从源映像中被删除,但是你不能添加任何元素。”
Set entrySet(): 返回Map.Entry对象的视图集,即映像中的关键字/值对
“因为映射是唯一的,您用Set支持。你还可以从视图中删除元素,同时,这些元素将从源映像中被删除,但是你不能添加任何元素。”
Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在,那么与此关键字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回null
Object remove(Object key): 从映像中删除与key相关的映射
void putAll(Map t): 将来自特定映像的所有元素添加给该映像
void clear(): 从映像中删除所有映射
“键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。”
(2) 查询操作:
Object get(Object key): 获得与关键字key相关的值,并且返回与关键字key相关的对象,如果没有在该映像中找到该关键字,则返回null
boolean containsKey(Object key): 判断映像中是否存在关键字key
boolean containsValue(Object value): 判断映像中是否存在值value
int size(): 返回当前映像中映射的数量
boolean isEmpty() :判断映像中是否有任何映射
(3) 视图操作 :处理映像中键/值对组
Set keySet(): 返回映像中所有关键字的视图集
“因为映射中键的集合必须是唯一的,您用Set支持。你还可以从视图中删除元素,同时,关键字和它相关的值将从源映像中被删除,但是你不能添加任何元素。”
Collection values():返回映像中所有值的视图集
“因为映射中值的集合不是唯一的,您用Collection支持。你还可以从视图中删除元素,同时,值和它的关键字将从源映像中被删除,但是你不能添加任何元素。”
Set entrySet(): 返回Map.Entry对象的视图集,即映像中的关键字/值对
“因为映射是唯一的,您用Set支持。你还可以从视图中删除元素,同时,这些元素将从源映像中被删除,但是你不能添加任何元素。”
HashMap和Hashtable实现类
它们是Map接口的典型实现类,它们的区别:
1.Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现。
2.Hashtable不允许使用Null作为key和value,但HashMap可以。
HashMap
(1) HashMap(): 构建一个空的哈希映像
(2) HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
(3) HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
(4) HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
(1) TreeMap():构建一个空的映像树
(2) TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
(3) TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
(4) TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序
(2) TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
(3) TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
(4) TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序