集合类
一、集合类概述
集合与数组的不同之处:
-
数组长度是固定的,集合的长度是可变的
-
数组用来存放基本类型的数据,集合用来存放对象的引用
常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,详见图“常用集合类的继承关系”
二、Collection接口
-
Collection接口是层次结构中的根接口。构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List与Set集合是通用的。
//Collection接口的常用方法
add();
remove();
isEmpty();
iterator();
size();
-
如何遍历集合中的每个元素?通常遍历集合,都是通过迭代器(Iterator)来实现。迭代出来的元素都是原来集合元素的拷贝。Java集合中保存的元素实质是对象的引用,而非对象本身。
public static void main(String[] args) {
Map <String,String>map = new HashMap<>();
map.put("熊大", "棕色");
map.put("熊二", "黄色");
Iterator<Map.Entry<String, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<String, String> entry = entries.next();
System.out.println(entry.getKey() + ":" + entry.getValue()); //熊大:棕色
}
Collection<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
Iterator<String> it = list.iterator();
while(it.hasNext()){ //判断是否有下一个元素
System.out.println(it.next()); //获取集合中元素(对象)并输出
}
}
三、List(列表)
-
List的特征是其元素以线性方式存储,集合中可以存放重复对象。
-
List接口继承了Collection接口,包含其中的所有方法,此外List接口还定义了以下两个非常重要的方法:
-
get(int index); //获得指定索引位置的元素
-
set(int index, Object obj); //指定索引位置对象为指定对象
-
List接口的常用实现类有ArrayList与LinkedList
-
ArrayList类实现了可变数组,允许保存所有元素,包括null。
-
优点:可以根据索引位置对集合进行快速随机访问,
-
缺点:向指定的索引位置插入对象或删除对象速度较慢。
-
LinkedList类采用链表结构保存对象,
-
优点:向集合中插入、删除对象时,使用LinkedList类实现的List集合效率较高,
-
缺点:但对于随机访问集合中的对象,使用LinkedList类实现List集合效率较低。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
int i = (int)(Math.random()*list.size());
System.out.println(list.get(i)); //输出随机值
list.remove(i); //移除元素
for (int j = 0; j < list.size(); j++){
System.out.println(list.get(j)); //输出
}
}
-
将字符串转为List集合
String str = "aaa,bbb,ccc";
List<String> list = Arrays.asList(str.split(","));
四、Set(集合)
-
Set是最简单的一种集合。集合中的对象不按特定的方式排序(存入与取出的顺序不一定相同),集合中没有重复对象(可以用来去重)。
-
Set接口继承了Collection接口,包含其中的所有方法
-
Set接口常用的实现类有HashSet 和 TreeSet
-
HashSet类
-
TreeSet类
public static void main(String[] args) {
Set set = new HashSet();
set.add("世界军事");
set.add("兵器知识");
set.add("兵器知识");
set.add("舰船知识");
set.add("汉和防务");
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next()); //Set 集合存和取的顺序不一致。
}
}
五、Map(映射)
-
Map接口常用的实现类有HashMap和TreeMap
-
HashMap类
-
TreeMap类
Map接口中的常用方法
put();
containsKey();
containsValue();
get();
keySet(); //返回该集合中所有Key对象形成的Set集合
values(); //返回该集合中所有值对象形成的Collection集合
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("01","aaa");
map.put("02","bbb");
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Collection <String> coll = map.values();
it = coll.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
六、CollectionUtils(Java集合类工具)的操作方法
-
集合判断
//例1: 判断集合是否为空:
CollectionUtils.isEmpty(null): true
CollectionUtils.isEmpty(new ArrayList()): true
CollectionUtils.isEmpty({a,b}): false
//例2: 判断集合是否不为空:
CollectionUtils.isNotEmpty(null): false
CollectionUtils.isNotEmpty(new ArrayList()): false
CollectionUtils.isNotEmpty({a,b}): true
-
2个集合间的操作
//2个集合间的操作:
//集合a: {1,2,3,3,4,5}
//集合b: {3,4,4,5,6,7}
CollectionUtils.union(a, b)(并集): {1,2,3,3,4,4,5,6,7}
CollectionUtils.intersection(a, b)(交集): {3,4,5}
CollectionUtils.disjunction(a, b)(交集的补集): {1,2,3,4,6,7}
CollectionUtils.disjunction(b, a)(交集的补集): {1,2,3,4,6,7}
CollectionUtils.subtract(a, b)(A与B的差): {1,2,3}
CollectionUtils.subtract(b, a)(B与A的差): {4,6,7}