1 什么是集合
-
本质就是容器的封装,可以存储多个元素
-
数组一旦创建,长度就不能再改变了。
-
数组一旦创建,存储内容的类型不能改变。
-
数组可以存储基本类型,也可以存储引用类型。
-
数组可以通过length获得容量的大小,但无法获得存储内容的多少。
-
集合可以无限存储存储元素 (底层还是对数组做了扩容)
-
集合可以通过size方法获得存储元素的个数 int size
-
集合只能存储引用类型的数据
-
有多种集合,底层使用不同的存储结构存储元素,适合不同的存储场景
-
线性结构(数组)
-
链表结构
-
哈希(hash)结构 , 散列结构
-
二叉树结构
-
2 JDK提供的集合
-
jdk中提供了多种集合
-
基本上都实现了下面的4种接口(我们称为有4类集合)
-
实现Collection接口的集合
存储元素的特点是 无序(存取顺序) 可重复
常用的实现类:无
-
实现List接口的集合
存储元素的特点是 有序 可重复
常用的实现类:ArrayList , LinkedList , Vector
-
实现Set接口的集合
存储元素的特点是 无序 不可重复的(唯一的)
常用的实现类:HashSet , TreeSet
-
实现Map接口的集合
存储元素的特点是 键值存储, 一个元素由2部分组成
键的存储特点是 无序 不可重复的
值的存储特点是 无序 可重复的
常用的实现类:HashMap , TreeMap , Hashtable
-
注意
List 和 Set 都继承了 Collection
3 List集合的使用
-
所有的List集合,都实现了List接口
-
List的常用方法
List<String> list = new ArrayList<>();
list.add(E e) ; //添加一个元素(末尾)
list.addAll(Collection es) ;//添加一组元素(末尾) , 将另一个集合中的元素都添加到当前list集合中
list.add(int index , E e) ; //插入一个元素
list.addAll(int index , Collection es) ;//插入一组元素
list.remove(Object o) ;//删除指定的元素 (底层使用equals判断相等)
list.remove(int index) ;//删除指定位置的元素
list.removeAll(Collection es) ;//删除一组元素
list.size();
list.get(int index) ;//获取指定位置的元素
Iterator it = list.iterator(); //先获得迭代器对象,可以通过迭代器对象遍历容器中每一个元素
//就是我们之前封装的Manager
it.hashNext() ;//判断是否还有下一个元素
it.next() ;//获得下一个元素
Object[] os = list.toArray() ;//将容器中的元素装入数组并返回
String[] ss = list.toArray(new String[0]); //根据指定的类型,返回指定类型的数组
list.clear();//清空容器中的元素
list.isEmpty();//判断容器是否为空 (size == 0)
list.contains(Object o) ;//判断容器中是否包含指定的元素(equals)
list.indexOf(Object o) ;//找到容器中指定元素的位置(用来判断元素是否判断存在)
list.sort(Comparator c) ;//根据指定的比较器,比较元素大小,并完成排序
4 增强for循环
-
jdk1.5之后,提供了一个循环新特性,叫增强for循环,foreach循环
-
增强for循环主要是简化集合和数组元素遍历的
-
增强for循环的本质就是使用Iterator迭代器,所有实现了Iterable接口的类都可以使用怎强for循环
List<String> list = new ArrayList<>();
for(String s : list){
...
}
//等价于
Iterator<String> it = list.iterator();
for(;it.hashNext();){
String s = it.next();
....
}
String[] array = new String[5] ;
for(String s : array){
....
}
//等价于
for(int i=2;i<array.length-2;i+=2){
String s = array[i];
....
}
5 Set集合的使用
-
所有的Set集合,都实现Set接口
-
Set集合的常用方法
Set<String> set = new TreeSet<>();
set.add(E e) ;//添加一个元素(位置不定)
set.addAll(Collection es);//添加一组元素,将另一个集合中的元素存入当前集合中
set.remove(Object o) ;//删除指定的元素 (equals比较)
set.removeAll(Collection es) ;//删除一组元素
set.size();
set.clear() ;
set.isEmpty();
set.contains(Object o) ;
Iterator it = set.iterator(); //获得迭代器对象,进而遍历集合中的所有元素
it.hashNext();
it.next();
6 Map集合的使用
-
所有的Map集合,都实现了Map接口
-
Map集合中的每一个元素,由2部分组成
-
一个称为key
-
一个称为value
-
-
map的特点是基于key找到与之对应的value。遍历不是map的强项
Map<Integer,String> map = new HashMap<>();
map.put(key,value) ; //添加一个元素
//重复添加同一个key的元素,value值覆盖 (key是去重)
map.putAll(Map otherMap) ;//添加一组元素。将另一个map中的元素都添加到当前map集合中
String value = map.get(key) ; //根据key取出对应的value
map.remove(key) ;//删除key对应的数据, 同时返回删除的value
map.size(); //获取元素(键值对)的个数
map.clear();//清空集合
map.isEmpty();//判断集合是否为空
map.containsKey(key);//判断集合是否包含指定的key
map.containsValue(value);//判断集合是否包含指定的value
//map集合的遍历
// map集合不支持直接遍历(这就不是map特点)
// 可以间接遍历
Set<Integer> keys = map.keySet(); //返回装有所有key的set集合
Collection<String> values = map.values();//返回装有所有value的collection集合,
//Collection集合也支持迭代器遍历
//对于map存储的元素,在存入之前,这个原有分为key和value
//在存入map集合之后,会将key和value组成一个对象(方便存储)
//entrySet获得一个装有所有键值对数据的set集合
//Entry是Map中定义的一个内部类(内部接口)