学习集合之前我们存储多个对象(数据)时,只能采用数组来存储,但是数组的长度是固定并且元素类型必须一致。但实际开发
时,往往我们需要保存的对象(数据)的个数是不确定的,这时我们需要用到其他的容器(集合):collection
集合:就是可以存储多个对象数据的容器
Java中提供java.util.Collection作为集合接口,定义了许多关于集合的处理方法:比如集合中元素的增删查改。
Collection只是一个接口
Collection有两个常用子接口:List和Set(其中List最常用)
一:List集合:是一个有序可重复的容器。
- 有序:List集合中的元素都有索引标记,可以通过索引访问元素。
- 可重复:list集合中允许加入重复的元素。
List集合的实现类:
- ArrayList:
底层通过数组来存储数据,
读取数据的效率比LinkedList高,
删除和插入数据的效率比LinkedList低
- LinkedList:
底层通过双向链表来存储数据,
读取和设置数据的效率比ArrayList低
删除和插入数据的效率比ArrayList高
- Vector:
底层通过数组来保存数据,线程安全
- list集合的常用API:
boolean add(E element); 添加元素(添加到尾部)
void add(int index,E element);插入元素
set(int index,E element);修改元素
get(int index); 获取元素
remove(int index); 根据下标删除元素
int size(); 获取容器大小(元素个数)
二:Set集合:是一个无序且元素不可重复的容器。
- 如何判断元素是否重复?
将元素存入set集合中时,首先会比较对象的hash值,如果没有相同的则表示没有重复,直接存入set集合中;如果存
在相同的hash值,则还需要根据equals来比较对象的内容是否相同,如果equals比较也相同则表示元素重复了,不予 存放;如果equals比较不相同则表示元素没有重复,可以存放。
- set集合的实现类:
- HashSet
底层通过hashMap存储元素数据,性能比TreeSet好。
- TreeSet
底层通过TreeMap存储元素数据,并且会自动对元素进行升序排列。(通常不使用自动排序,需要排序时 采用Arrays.sort进行排序就行了)
- set集合的常用API:
boolean add(E element); 添加元素
boolean remove(Object o); 删除元素
clear();清除元素(删除全部元素)
int size();容器大小(元素个数)
boolean contains(Object obj);是否包含元素obj
toArray()set转数组(顺序随机,但是如果set是排过序的则按照它的顺序)
三:Map容器:通过键值对的方式存储数据。
- 特点:通过键值对存放数据
通过键来访问值
键:不可以重复
值:可以重复
- 实现类:
HashMap:底层通过哈希表实现数据的存储,线程不完全。
HashTable:底层通过哈希表实现数据的存储,线程安全。
TreeMap:底层通过红黑树实现数据的存储,性能比HashMap差,但是可以自动对键做升序排列。通常不用它。
Properties:继承自Hashtable。主要用于Properties文件进行交互(存储和读取数据)
- 注意点:hashMap的键和值可以是null值,但是Hashtable不可以是null值。
- map集合常用的api:
put(key,value); 添加或者修改数据(存在则修改)
get(key);通过键获取值
remove(key);通过键移除键值对(数据)
clear(); 清除数据(全部删除)
size(); 获取键值对(数据)的总个数
booelan containsKey(key) 是否包含该键key所对应的键值对,有则返回true
booelan containsValue(value)是否包含该值value所对应的键值对,有则返回true
四:Collections工具类
该类定义了对collection,list,set,map集合对象的一些通用操作方法
sort(List<?> list); 对list集合进行排序
binarySearch(List list,E element); 二分法查找元素
- 引用数据类型的排序:1、内比较器:Comparable;2、外比较器:Comparator
//使用外比较器
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//按照身高降序,返回正数表示对象大,返回负数表示对象小,返回0表示对象相同
return -(o1.height-o2.height);
}
});