目录
1.初识集合
什么是集合
简单来说,集合就是一个存放数据的容器,主要包括Collection和Map。
1. Java的集合是java.util包中的重要内容。
2.集合是Java数据结构的实现。在编写程序时,经常需要和各种数据打交道,为了处理这些数据而选用数据结构对于程序的运行效率是非常重要的。
3.集合只能存放对象,即Object类的实例,Java中每一种基本数据类型都有对应的引用类型。并且集合可以存放多个不同类型,不限数量的数据类型。
有几点需要注意:
- 集合与数组不同,数组可以容纳对象和简单数据。
- 集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。
现在来简单介绍一下Java集合的结构:
很显然按照图片,集合包含Collection接口,集合遍历,List,Set,Map,泛型集合
2.Collection接口
Collection 接口存储一组不唯一,无序的对象
Collection接口是List、Set接口的父接口
接口里定义的方法即可用于操作Set集合,也可用于操作List集合
常用方法:
| 方法 | 描述 |
|---|---|
| boolean add(Object o) | 用于向集合中添加一个元素 如果集合不允许重复且已包含了指定元素,则返回false |
| boolean addAll(Collection c) | 将集合c里所有元素添加到指定集合里。添加成功返回true |
| void clear() | 清除集合中所有元素,将集合长度变为为0 |
| boolean contains(Object o) | 判断集合中是否包含指定元素 |
| boolean containsAll(Collection c) | 判断集合中是否包含集合c里所有的元素 |
| boolean remove(Object o) | 删除集合中的指定元素o。当集合中包含了一个或多个元素o时,这些元素将被删除。删除成功,返回true |
| int size() | 返回集合里元素的个数 |
| boolean retainAll(Collection c) | 从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集) 如果该操作改变了调用该方法的集合,则返回true |
| boolean removeAll(Collection c) | 从集合中删除集合c里包含的所有元素 如果删除了一个或一个以上的元素,则返回true |
| boolean isEmpty() | 如果此集合中不包含任何元素,则返回true |
| Object[] toArray() | 该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素 |
3.List 集合
List接口:
- 继承Collection接口,存储一组可重复的有序对象
- 元素顺序以元素插入的次序来放置元素,不会重新排序
- 通过索引访问数组元素,索引从0开始
- 根据索引操作集合元素的方法
常用方法:
| 方法 | 描述 |
|---|---|
| void add(int index,Object element) | 将元素(element)插入到List的指定位置(index)处 |
| boolean addAll(int index,Collection c) | 将集合c所包含的所有元素都插入List集合指定位置(index)处 |
| Object get(int index) | 返回集合index索引处的元素 |
| int indexOf(Object o) | 返回对象o在List集合中第一次出现的位置索引 |
| int lastIndexOf(Object o) | 返回对象o在List集合中最后一次出现的位置索引 |
| Object remove(int index) | 从集合中删除指定位置的元素 |
| boolean remove(Object o) | 从集合中删除指定对象 |
| Object set(int index,Object element) | 将index索引处的元素替换成element对象,返回新元素 |
| List subList(int fromIndex,int toIndex) | 返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合 |
List集合
List集合是List接口所有实现类组成的集合
List集合中分为Array List类和Linked List类

ArrayList
ArrayList类实现长度可变的数组,遍历元素和随机访问元素的效率比较高,在内存中分配连续的空间
| 0 | 1 | 2 | 3 | 4 | ...... |
| 苹果 | 桃子 | 鸭梨 | 西瓜 | 桃子 |
示例:
List fruits = new ArrayList(); //创建集合及元素对象
fruits.add(fruit1);
fruits.add(fruit2); //将数据插入到List集合
fruits.add(fruit3);
使用List集合的注意事项
- 可以使用索引访问List集合元素
- 可以使用for循环遍历List集合
- List集合中存放的都是Object类对象:
- add(Object o)方法的参数是Object类对象
- 在通过get(int i)方法获取元素时必须进行强制类型转换
- 删除集合元素的方法
- 按索引删除:fruits.remove(2);
- 按对象删除:fruits.remove(fruit3);
- 调用set(int index,Object o)方法改变List集合指定索引的元素时,指定的索引必须是List集合的有效索引
- set(int index,Object o)方法不会改变List集合的长度
LinkedList类
LinkedList类采用双向链表存储方式,插入、删除元素时效率比较高,每个节点中都有两个指针
、
具有双向链表结构,更加方便实现添加和删除操作 除了具有List接口扩展的方法外,还提供了实现链表操作的方法
| 方法 | 描述 |
| void addFirst(Object o) | 在链表的首部添加元素 |
| void addLast(Object o) | 在链表的末尾添加元素 |
| Object getFirst() | 返回链表中第一个元素 |
| Object getLast() | 返回链表中最后一个元素 |
| Object removeFirst() | 删除并返回链表中的第一个元素 |
| Object removeLast() | 删除并返回链表中的最后一个元素 |
示例:
LinkedList fruits = new LinkedList(); //创建链表集合
fruits.add(fruit1);
Fruit firstFruit = (Fruit) ((LinkedList) fruits).getFirst(); //在集合首部添加对象
Fruit lastFruit = (Fruit) ((LinkedList) fruits).getLast(); //在集合结尾添加对象
fruits.removeFirst(); //删除集合首部对象
fruits.removeLast(); //删除集合结尾对象
ArrayList类和LinkedList类对比
- ArrayList类和LinkedList类的共同点:
- 可以容纳所有类型的元素对象,包括null
- 元素值可以重复
- 元素按顺序存储
- ArrayList类特点:
- 底层是数组
- 优点:基于数组实现,读取操作效率高
- 缺点:不适合频繁进行插入和删除操作,因为每次执行该类操作都需要频繁移动其中的元素
- LinkedList类特点:
- 由双向链表实现,任意一个节点都可以方便地访问它的前驱节点和后继节点
- 优点:增加、删除操作只需修改链表节点指针,不需进行频繁的移动
- 缺点:遍历效率较低
4.Set接口
Set接口和List接口一样,也是Collection的子接口。集合里的多个对象之间没有明显的顺序,不允许包含重复的元素。与Collection接口基本一样,没有提供额外的方法,只是行为上略有不同

HashSet类
- 是Set接口的典型实现
- 可以实现对无序不重复数据的存储,具有很好的存取和查找性能
- 特征:
- 不允许存储重复的元素
- 没有索引,没有包含索引的方法,不能使用索引遍历
- 无序集合,存储元素和取出元素的顺序可能不一致
- 执行添加操作时,会将新添加的对象依次和集合中现有的元素进行比较
- 通过执行集合元素的hascode()方法和equals()方法进行判断
- 如果集合中不存在所添加的元素,则添加成功;否则,添加失败
- 不能使用索引进行遍历
示例:
Set pets= new HashSet(); //创建一个HashSet集合
Pet pet1 = new Pet ("泰迪", 2.5);
Pet pet2 = new Pet ("比熊", 2.0);
pets.add(pet1 ); //向集合中添加元素
pets.add(pet2 );
//遍历集合
for(Object o:pets) {
Pet pet= (Pet )o;
pet.show();
}
6.Map接口
- Map接口存储一组键值对象,提供key到value的映射
- Map接口专门处理键值映射数据的存储
- 根据键(key)实现对值(value)的操作:
- Key:不要求有序,不允许重复
- Value:不要求有序,但允许重复
- 与Collection接口不存在继承关系
常用方法:
| 方法 | 描述 |
| Object put(Object key,Object value) | 以“键-值对”的方式进行存储 |
| Object get(Object key) | 返回指定键所对应的值。如果不存在指定的键,返回null |
| int size() | 返回元素个数 |
| boolean remove(Object key) | 删除指定的键映射的“键-值对” |
| Set keyset() | 返回键的集合 |
| Collection values() | 返回值的集合 |
| boolean containsKey(Object key) | 如果存在指定的键映射的“键-值对”,则返回true |
| Set entrySet() | 返回“键-值对”集合 |
| boolean isEmpty() | 若不存在“键-值对”元素,则返回true |
| void clear() | 删除该Map对象中的所有“键-值对” |
最常用的实现类是HashMap

一个Map对象有若干个“键-值对”组成
示例
Map provinces = new HashMap();
provinces.put("京", "北京市"); //使用HashMap存储多组键值对
provinces.put("沪", "上海市");
provinces.put("闽", "福建省");
provinces.put("湘", "湖南省");
String province = (String) provinces.get("京");//获取指定元素的值
Map.Entry接口
用于保存“键-值对”元素
常用方法:
| 方法 | 描述 |
| Object getKey() | 取得此“键-值对”对应的key值 |
| Object getValue() | 取得此“键-值对”相对应的value值 |
| int hashCode() | 返回该“键-值对”的哈希码值 |
| Object setValue(Object value) | 用指定的值替换该“键-值对”的value值 |
- 运用Map.Entry接口遍历集合
- 通过entrySet()方法获取所有“键-值”对元素的集合
- 遍历集合中每个元素,进行键和值的分离
Hashtable类
- 与HashMap类具有相似的特征,也可以存储“键-值对”元素
- 是一个古老的Map接口实现类

- Hashtable类和HashMap类之间存在的区别
Hashtable
HashMap
继承自Dictionary类
Java1.2引进的Map interface的一个实现
比HashMap要古老
是Hashtable的轻量级实现
线程安全
线程不安全
不允许有null的键和值
允许有null的键和值
效率稍低
效率稍高
7.泛型集合
- 约束录入集合的元素类型,大大提高数据安全性
- 从集合中取出数据无需进行类型转换,让代码更加简洁,程序更加健壮
- JDK1.5使用泛型改写了集合框架中的所有接口和类
本文介绍了Java集合框架的基础知识,包括Collection接口、List接口及其实现类ArrayList和LinkedList的区别,Set接口的HashSet实现,Map接口的HashMap和Hashtable类,并探讨了泛型集合的应用。
187





