前言 |
在上一篇中我们说了数组,这一篇我们说说集合。集合和数组的本质是一样的,都是对一组数进行操作。至于数组和集合的区别,可以查看<【java基础】数组是啥?有啥用?>,在此不再赘述。下面的思维导图是我们这一系列集合相关博客的“目录”。
集合是可以储存数量不确定的不同对象的容器。java的集合类主要由2个接口派生:Collection和Map。具体可参考如下。
Collection是Set接口、Queue接口、List接口的父接口,所以其中定义的方法,也适用于操作此3类集合。大致包括添加对象,删除对象,清空集合,判断集合为空等方法。
常用方法 |
//定义一个ArrayList类型的集合
Collection a=new ArrayList();
//添加元素
a.add("大美女");
//删除指定元素
a.add("大美女");
//清空集合
a.clear();
//查询集合中的元素个数
a.size();
//判断是否包含指定的字符串
a.contains("大美女");
//输出集合中的元素,输出结果:[大美女]
a
遍历集合 |
我们知道,遍历数组时有两个方法:for循环和foreach循环。遍历集合也有两种方法:Iterator接口和foreach循环。
Iterator是啥?Iterator是一个迭代器,用于遍历集合元素。它的优点是遍历时不用考虑集合元素的个数和类型,这样能实现访问代码和集合本身的解耦。下面我们定义一个HashSet类型的集合,来说明遍历集合的方法。
b集合,HashSet类型,其中的元素有{4,3,5,7,9}
(1)使用Lambda表达式
Lambda表达式的作用是把“一块代码”赋给一个java变量。
b.forEach(obj->System.out.println("迭代集合元素:"+obj));
(2)使用Iterator接口遍历
Iterator it=b.iterator();
while(it.hasNext()){
//it.next()方法返回的数据类型是object,因此需要强制类型转换
Int b=(Int)b.next();
System.out.println(b);
}
(3)使用Lambda表达式+Iterator接口
Iterator it=b.iterator();
it.forEachRemaining(obj->System.out.println("迭代集合元素:"+obj));
(4)使用foreach循环遍历
for(Object obj:b){
Int b=(Int)obj;
System.out.println(b);
}
操作集合 |
(1)使用Predicate操作集合
c集合,HashSet类型,其中的元素有:{“红色”,“酒红色”,“粉色”,“玫瑰红色”}
使用Lambda表达式和Predicate对集合进行操作的示例如下:
//批量删除集合中符合条件的元素
c.removeIf(ele->((String)ele).length()<3);
//统计集合中包含“红色”子串的数量
calAll(c,ele->((String)ele).contains("红色"));
(2)使用Stream操作集合
//调用builder()类方法创建该Stream对应的Builder
IntStream d=IntStream.builder()
.add(14)
.add(13)
.add(5)
.add(3)
.build();
//求元素的最大值
d.max().getAsInt();
//求所有元素的总和
d.sum();
//求所有元素的总数
d.count();
//求所有元素的平均值
d.average();
//统计c集合中包含“红色”子串的数量
books.stream().filter(ele->((String)ele).contains("红色")).count();
Collections类 |
就像Arrays类用于操作数组,Collections类用于操作集合。下面列举几个典型应用。
e集合,ArrayList类型,其中的元素有:{3,-1,6,9}
(1)排序操作
//将List集合元素的次序反转,输出[9,6,-1,3]
Collections.reverse(e);
//将元素按自然顺序排列,输出[-1,3,6,9]
Collections.sort(e);
//将元素按随机顺序排序,每次输出的都不确定
Collections.shuffle(e);
(2)查找、替换操作
//输出最大元素
Collections.max(e);
//判断6在集合中出现的次数,输出1
Collections.frequency(e,-5);
//对集合进行排序
Collections.sort(e);
//将nums中的-1使用1代替
Collections.replaceAll(e,-1,1);
//排序完成后,用二分法查找3
Collections.binarySearch(nums,3);
(3)同步控制
//创建线程安全的map对象
Map m=Collections.synchronizedMap(new HashMap());
(4)设置不可变集合
//创建包含4个元素的Set类型的不可变集合
Set set=Set.of("java ","if","else","swift");
//【方式一】-创建包含3个key-value对的map不可变集合
Map map=Map.of("语文",80,"数学",98,"英语",80);
//【方式二】
Map map2=Map.ofEntries(Map.entry("语文",80),Map.entry("数学",98),Map.entry("英语",80));