面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用
Array
存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。
数组的弊端
数组初始化以后,长度就确定了,不便于扩展;数组声明的类型,就决定了进行元素初始化时的类型,数组中提供的属性和方法少,不便于进行添加、删除、插入等操作, 且效率不高。
Java集合的组成
图解:
Collection
接口:单列集合,用来存储一个一个的对象。List
接口:存储有序的、可重复的数据。也称为“动态”数组。Set
接口:存储无序的、不可重复的数据 。高中讲的“集合”Map
接口:双列集合,用来存储一对(key - value)一对的数据 -->高中函数:y = f(x)
java集合Collection
是一个接口类,它是List
、Set
和Map
的父接口,Collection
接口中定义了许多方法,JDK中不提供该接口的任何直接实现,而是提供更具体的子接口的实现。在 Java5 之前, Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理; 从 JDK 5.0 增加了泛型以后, Java 集合可以记住容器中对象的数据类型。
Collection的接口方法
方法签名 | 方法介绍 |
---|---|
add(Object obj) | 添加单个元素 |
addAll(Collection collection) | 添加所给集合中的所有元素 |
clear() | 清空集合 |
isEmpty() | 判断是否是空集合 |
contains(Object obj) | 判断集合中是否包含某个元素(通过元素的equal方法来判断是否是同一个对象) |
containsAll(Collection col) | 判断集合中是否包含给定集合中的元素(也是用equals来判断是否相等) |
remove(Object obj) | 移除某个元素(通过equals方法参照元素) |
removeAll(Collection col) | 取当前集合的差集 |
equals(Collection col) | 判断与集合是否相等 |
toArray() | 转换成对象数组 |
hashCode() | 获取元素的哈希值 |
Iterator() | 返回迭代器对象 |
Iterator迭代器
Collection
接口也继承了Iterable
,所以可以使用迭代器来遍历对象。
- 内部方法包含
hasNext()
和next()
- 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
- 内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
// 创建集合
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new String("Tom"));
coll.add(false);
// 遍历集合
iterator = coll.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
List接口
List
接口是用来存储有序的、可重复的数据,我们常常用来当成“动态”数组。它有三个实现类,分别是ArrayList
、LinkedList
和Vector
,它们的实现方式和数据结构均有所不同,所以合适使用的的场景也不一样。
实现类 | 时间 | 描述 |
---|---|---|
Vector | JDK1.0 | 作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储 |
ArrayList | JDK 1.2 | 作为List接口的主要实现类;线程不安全的,效率高;底层用Object[] elementData存储 |
LinkedList | JDK1.2 | 对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储 |
ArrayList
、LinkedList
、Vector
三者的异同? 三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据.不同点就是各自底层的数据结构不同,以及他们的多线程安全性也不同。
Set接口
Set接口是用来存储无序、不可重复的数据。它有三个实现类:HashSet
、LinkedHashSet
和TreeSet
。
实现类 | 时间 | 描述 |
---|---|---|
HashSet | JDK1.2 | 作为Set接口的主要实现类;线程不安全的;可以存储null值 |
LinkedHashSet | JDK 1.2 | 作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历 |
TreeSet | JDK1.2 | 可以按照添加对象的指定属性,进行排序或自定义排序。 |
HashSet特点:
无序性
:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。不可重复性
:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。
Map接口
Map接口是用来存储键值对的,它是一个双列数据结构。
他的实现类有HashMap
、LinkedHashMap
、TreeMap
、Hashtable
以及Properties
。
实现类 | 时间 | 描述 |
---|---|---|
Hashtable | JDK1.0 | 作为古老的实现类;线程安全的,效率低;不能存储null的key和value |
Properties | JDK 1.0 | 作为Hashtable的子类;常用来处理配置文件。key和value都是String类型 |
HashMap | JDK1.2 | 作为Map的主要实现类;线程不安全的,效率高;存储null的key和value |
LinkedHashMap | JDK 1.2 | 保证在遍历map元素时,可以按照添加的顺序实现遍历。原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。 |
TreeMap | JDK 1.2 | 保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序 |
Map中的key:无序的、不可重复的,使用Set存储所有的key ---> key所在的类要重写equals()和hashCode() (以HashMap为例)
Map中的value:无序的、可重复的,使用Collection存储所有的value --->value所在的类要重写equals()一个键值对:key-value构成了一个
Entry
对象。Map中的
entry
:无序的、不可重复的,使用Set存储所有的entry
Collections工具类
Collections
是一个操作Set
、List
和Map
等集合的工具类,Collections
中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。
排序操作
方法名 | 方法简介 |
---|---|
reverse(List) | 反转 List 中元素的顺序 |
shuffle(List) | 对 List 集合元素进行随机排序 |
sort(List) | 根据元素的自然顺序对指定 List 集合元素按升序排序 |
sort(List, Comparator) | 根据指定的 Comparator 产生的顺序对 List 集合元素进行排序 |
swap(List, int, int) | 将指定 list 集合中的 i 处元素和 j 处元素进行交换 |
查找/替换
方法名 | 方法简介 |
---|---|
Object max(Collection) | 根据元素的自然顺序,返回给定集合中的最大元素 |
Object max(Collection, Comparator) | 根据 Comparator 指定的顺序,返回给定集合中的最大元素 |
Object min(Collection) | 根据元素的自然顺序,返回给定集合中的最小元素 |
Object min(Collection, Comparator) | 根据 Comparator 指定的顺序,返回给定集合中的最小元素 |
int frequency(Collection, Object) | 返回指定集合中指定元素的出现次数 |
void copy(List dest,List src) | 将src中的内容复制到dest中 |
replaceAll(List list,Object oldVal,Object newVal) | 使用新值替换List 对象的所有旧值 |
同步控制
Collections
类中提供了多个 synchronizedXxx()
方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全
问题
方法名 | 方法简介 |
---|---|
Collection synchronizedCollection(Collection c) | 包装集合返回一个线程安全的集合 |
Set synchronizedSet(Set s) | 包装Set返回一个线程安全的Set |
List synchronizedList(List list) | 包装List返回一个线程安全的List |
Map synchronizedMap(Map m) | 包装Map返回一个线程安全的Map |