java集合Collection常用方法解读
作者:Galen-gao 发布时间:2023-11-16 18:29:07
前言
出去面试的时候,对java的集合框架考察的知识点还是蛮多的。除了基础的集合常见API使用,对集合底层的实现原理以及数据结构等也有很多考察方面。而自己对这方面知之甚少,特地抽空进行研究和学习一下。
为什么要有集合
提到集合就不得不提一下数组,好多集合底层都是依赖于数组的实现。数组一旦初始化后,长度就确定了,存储数据对象不能达到动态扩展,其次数组存储元素不便于对数组进行添加、修改、删除操作,而且数组可以存储重复元素。
这个时候集合对作用显现出来了。
集合分为Collection
和Map
两种体系。
下面先介绍Collection的集合类的继承树如下图所示:
Collection接口是 (java.util.Collection)是Java集合类的顶级接口之一,整个集合框架就围绕一组标准接口而设计,本文研究的集合基于JDK8的实现,下面将会进行多个集合类方法使用和主要方法源码分析,以作为后续出去面试的参考资料。
Collection方法接口介绍
Collection 接口有 3 种子类型集合: List
、Set
和 Queue
,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、ArrayBlockingQueue等,下面是Collection的所有方法。
这些方法即可以操作Set集合,也可以操作Queue和List集合,下面分别使用Collection
集合接口的方法说明
方法名 | 说明 |
---|---|
boolean add(E e) | 向集合添加元素e,若指定集合元素改变了则返回true |
boolean addAll(Collection<? extends E> c) | 把集合C中的元素全部添加到集合中,若指定集合元素改变返回true |
void clear() | 清空所有集合元素 |
boolean contains(Object o) | 判断指定集合是否包含对象o |
boolean containsAll(Collection<?> c) | 判断指定集合是否包含集合c的所有元素 |
boolean isEmpty() | 判断指定集合的元素size是否为0 |
boolean remove(Object o) | 删除集合中的元素对象o,若集合有多个o元素,则只会删除第一个元素 |
boolean removeAll(Collection<?> c) | 删除指定集合包含集合c的元素 |
boolean retainAll(Collection<?> c) | 从指定集合中保留包含集合c的元素,其他元素则删除 |
int size() | 集合的元素个数 |
T[] toArray(T[] a) | 将集合转换为T类型的数组 |
下面是主要方法的演示:
@Test
@SuppressWarnings("all")
public void testCollection() {
// 创建Collection接口的实现
Collection collection = new ArrayList<>();
// 添加元素
collection.add("嘻嘻");
String src = "????";
collection.add(src);
System.out.println(collection);
// 创建Collection的实现
Collection<String> coll = new HashSet<>();
coll.add("?");
coll.add("?");
coll.add("?");
System.out.println(coll);
// 添加一个集合数据
collection.addAll(coll);
// 输出集合的长度
System.out.println(collection);
// 判断是否包含
System.out.println(collection.contains("?"));
// 移除元素
collection.remove("?");
// 添加对象
collection.add(new Person("张三", 23, 5000d));
// 当认为两个对象属性一致,相等时候,需重写hashCode 和 equals方法
System.out.println(collection.contains(new Person("张三", 23, 5000d)));
System.out.println("-------");
collection.add(null);
Collection<String> collection1 = new ArrayList<>();
collection1.add("嘻嘻");
collection1.add("?");
// 求两个集合的交集(只保留collection1存在的元素)
collection.retainAll(collection1);
System.out.println(collection);
// 清空元素
collection.clear();
System.out.println(collection);
}
java8新特性操作集合
使用lambda表达式遍历集合
java8为Collection
的父接口(Iterable
)提供了一个默认的Foreach
方法,我们可以使用它进行集合遍历,若对lambda不太了解,不妨访问一下这篇文章☞ lambda表达式学习
@Test
public void testForeach() {
Collection<String> collection = new ArrayList<>();
collection.add("i");
collection.add("love");
collection.add("china");
// foreach遍历
collection.forEach(e-> System.out.println(e));
// 可以使用方法引用简写
collection.forEach(System.out::println);
// 或者迭代器的forEachRemaining方法
collection.iterator().forEachRemaining(System.out::println);
}
使用java8的predicate操作集合
@Test
public void testPredicate() {
Collection<Integer> collection = new ArrayList<>();
// 添加0-49
for (int i = 0; i < 50; i++) {
collection.add(i);
}
// 移除10-49的数字
collection.removeIf(e -> (e > 9 && e < 50));
System.out.println(collection);// 输出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}
基于流操作集合
java8之后引入了Stream
相关流操作java集合,通过流大大简化了对集合操作,关于这些流式操作,可以查看这篇文章☞ Stream入门学习,下面是基于流的一些简单演示:
@Test
public void testIntStream() {
Collection<Integer> collection = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
collection.add(random.nextInt(100));
}
System.out.println(collection);
// collection存储的数值是包装类型,可以将其转换为IntStream
IntStream intStream = collection.stream().mapToInt(e -> e);
// intStream.forEach(System.out::println);
System.out.println(collection.stream().mapToInt(e -> e).sum());
// 输出最大值
collection.stream().mapToInt(e -> e).max().ifPresent(System.out::println);
// 输出最小值
collection.stream().mapToInt(e -> e).min().ifPresent(System.out::println);
// 统计大于50的数
System.out.println(collection.stream().filter(e -> e > 50).count());
// 原集合每一个值加1
collection.stream().mapToInt(e-> e+1).forEach(System.out::println);
// 排序
collection.stream().mapToInt(e-> e).sorted().forEach(System.out::println);
// 原数值每一个元素扩大2倍
int[] ints = collection.stream().mapToInt(e -> e << 1).toArray();
// 输出原数组
System.out.println(Arrays.toString(ints));
// 将数组转流
IntStream stream = Arrays.stream(ints);
// 输出流平均数
System.out.println(stream.average().getAsDouble());
}
来源:https://blog.csdn.net/javaee_gao/article/details/96372530


猜你喜欢
- app中肯定是少不了与用户交互的各种dialog,下面给大家介绍几种提示框的提示。一般创建一个对话框需要经过以下几步:1、创建AlertDi
- Java中数组被实现为对象,它们一般都会因为记录长度而需要额外的内存。对于一个原始数据类型的数组,一般需要24字节的头信息再加上保存值所需的
- 1、安装依赖<dependency> <
- 一、运行class文件执行带main方法的class文件,命令行为:java <CLASS文件名>注意:CLASS文件名不要带文
- 本文实例讲述了C#实现IP摄像头的方法。分享给大家供大家参考。具体实现方法如下:#region IP摄像头代码/// <summary
- 1、反射的概念1、概念反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种
- 一、项目简述功能包括: 仓库管理,出入库管理,仓库人员管理,基本信息管理, 供应商信息,系统管理等等。二、项目运行环境配置: Jdk1.8
- 初始化sp 内部将数据放到 xml 文件中,加载时首先会将硬盘中文件读取到内存中,这样加快了访问速度这次从源码开始,看看里面具体做了什么//
- 很多人都知道:浮点数值不适用于无法接受舍入误差的金融计算中,即:我们常说的丢失精度问题。这是为什么呢?很多人还知道这样一句话:这种舍入误差的
- 首先给大家来讲一个我们遇到的一个奇怪的问题:1.我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器
- android 修改launcher行数和列数Launcher3桌面的行数和列数都是在InvariantDeviceProfile.java
- 简单介绍如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点。单向环
- 修改整理的一个通用类,用来操作oracle数据库 十分的方便,支持直接操作sql语句和Hash表操作.现在修补MIS我都用这个类,节约了大
- 1: * 的定义: * 实际上是一个类,这个类实现了特定的接口,然后将这个类在 web.xml 文件中进行描述,这样服务器在启动的时候就可
- 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是
- 今天给大家介绍一下如何实现一款简约时尚的安卓登陆界面。大家先看一下效果图当用户输入时动态出现删除按钮 现在先罗列一下技术点:1.如何使用圆角
- 本文实例讲述了C#动态创建button的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.C
- RestTemplate简介Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTem
- 一、导入JAR包二、配置applicationContext.xml的spring核心配置三、 public static void mai
- 1,带Tomcat的打包方式1.1, 在pom.xml文件添加以下配置(目的:自定main入口和跳过Junit代码)<build>