Java 集合 --- Collection 框架

2023-11-15

Collection Interface

  • the Java collection library separates interfaces and implementations
    在这里插入图片描述

Concrete Implementations

在这里插入图片描述

LinkedList

Add
在这里插入图片描述
Get and Set
在这里插入图片描述
在这里插入图片描述

Offer, Peek, Poll
在这里插入图片描述
Pop, Push
在这里插入图片描述
Remove
在这里插入图片描述
Utilities

void clear(): Removes all of the elements from this list.
Object clone(): Returns a shallow copy of this LinkedList.
boolean	contains(Object o): Returns true if this list contains the specified element.
int indexOf(Object o): Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
int	size(): Returns the number of elements in this list.
Object[]	toArray(): Returns an array containing all of the elements in this list in proper sequence (from first to last element).

ArrayList

Add
在这里插入图片描述
delete
在这里插入图片描述
set, get, replace

E get(int index): Returns the element at the specified position in this list.
E set(int index, E element): Replaces the element at the specified position in this list with the specified element.
void replaceAll(UnaryOperator<E> operator): Replaces each element of this list with the result of applying the operator to that element.##  Sets

Utilities

void clear(): Removes all of the elements from this list.
Object clone(): Returns a shallow copy of this ArrayList instance.
boolean	contains(Object o): Returns true if this list contains the specified element.
void forEach(Consumer<? super E> action): Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.
int	indexOf(Object o): Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
Object[] toArray(): Returns an array containing all of the elements in this list in proper sequence (from first to last element).

“only arrayList”

boolean	isEmpty(): Returns true if this list contains no elements.
int	size(): Returns the number of elements in this list.
void sort(Comparator<? super E> c): Sorts this list according to the order induced by the specified Comparator.
void trimToSize(): Trims the capacity of this ArrayList instance to be the list's current size.
void ensureCapacity(int minCapacity): Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument.

ArrayList 和 LinkedList的区别

insert and delete

  • ArrayList: O(n), 因为要将目标位置之后的元素向前移位(delete)或者向后移位(insert),
    如果超出capacity则需要扩容会增加时间复杂度
  • LinkedList: O(n), 需要遍历linkedlist找到node, 然后进行操作: O(1)

set and get

  • ArrayList: O(1), 通过下标直接操作
  • LinkedList: O(n) 需要遍历linkedlist找到node, 然后进行操作

“space”

  • ArrayList: 只需数组的空间
  • LinkedList: 有overhead, 比如next,pre指针

Summary

  • 很多场景下ArrayList更受欢迎

Queues and Deques

  • Queue: 在尾部加入元素, 从头部删除元素
  • Deque (double-ended queue): 可以从头部或者尾部加入删除元素
  • 可以用LinkedList替代(LinkedList提供了Queue和Deque功能)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Priority Queues

在这里插入图片描述

package priorityQueue;
import java.util.*;
import java.time.*;
/**
 * This program demonstrates the use of a priority queue.
 * @version 1.02 2015-06-20
 * @author Cay Horstmann
 */
public class PriorityQueueTest
{
	public static void main(String[] args) {
		PriorityQueue<LocalDate> pq = new PriorityQueue<>();
		pq.add(LocalDate.of(1906, 12, 9)); // G. Hopper
		pq.add(LocalDate.of(1815, 12, 10)); // A. Lovelace
		pq.add(LocalDate.of(1903, 12, 3)); // J. von Neumann
		pq.add(LocalDate.of(1910, 6, 22)); // K. Zuse
		System.out.println("Iterating over elements...");
		for (LocalDate date : pq)
   			System.out.println(date);
   		System.out.println("Removing elements...");
   		while (!pq.isEmpty())
    		System.out.println(pq.remove());
   }
}

HashSets

  • 无序的set
  • 使用HashTable实现 bucket hashing (Array + LinkedList)
  • 默认bucket大小是 2^16, load factor是0.75

在这里插入图片描述

public class SetTest
{
	public static void main(String[] args) {
		Set<String> words = new HashSet<>(); // HashSet implements Set
		long totalTime = 0;

		try (Scanner in = new Scanner(System.in)) {
			while (in.hasNext()) {
 				String word = in.next();
 				long callTime = System.currentTimeMillis();
 				words.add(word);
 				callTime = System.currentTimeMillis() - callTime;
 				totalTime += callTime;
 			}
 		}
 
 		Iterator<String> iter = words.iterator();
 		for (int i = 1; i <= 20 && iter.hasNext(); i++)
 			System.out.println(iter.next());
 			System.out.println(". . .");
 			System.out.println(words.size() + " distinct words. " + totalTime + " milliseconds.");
 		}
}

LinkedHashSet

是HashSet的一个子类, 元素按照加入顺序排序

TreeSets

  • 有序的Set
  • 使用红黑树实现
  • TreeSet的插入复杂度要比HashSet快, 但是检查重复要比HashSet快(LogN)
  • 因为是有序的所以必须重新compareTo 否则会报错, String等非自定义类型已经重写了compareTo方法
  • 如果数据不要求排序最好使用HashSet

在这里插入图片描述
在这里插入图片描述

public class TreeSetTest {
	public static void main(String[] args) {
		SortedSet<Item> parts = new TreeSet<>();
		parts.add(new Item("Toaster", 1234));
		parts.add(new Item("Widget", 4562));
		parts.add(new Item("Modem", 9912));
		System.out.println(parts);
		NavigableSet<Item> sortByDescription = new TreeSet<>(
		Comparator.comparing(Item::getDescription)); 
		sortByDescription.addAll(parts);
		System.out.println(sortByDescription);
	}
}

EnumSet

  • element是enum类型
  • Since an enumerated type has a finite number of instances, the EnumSet is internally implemented simply as a sequence of bits.
  • A bit is turned on if the corresponding value is present in the set.
enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };
EnumSet<Weekday> always = EnumSet.allOf(Weekday.class);
EnumSet<Weekday> never = EnumSet.noneOf(Weekday.class);
EnumSet<Weekday> workday = EnumSet.range(Weekday.MONDAY, Weekday.FRIDAY);
EnumSet<Weekday> mwf = EnumSet.of(Weekday.MONDAY, Weekday.WEDNESDAY, Weekday.FRIDAY);

Map

  • Map没有继承Collection接口
  • AbstractMap和AbstractCollection是平级关系
    在这里插入图片描述

Map的基本操作

package map;
import java.util.*;
/**
 * This program demonstrates the use of a map with key type String and value type Employee.
 * @version 1.12 2015-06-21
 * @author Cay Horstmann
 */
public class MapTest {
	public static void main(String[] args) {
		Map<String, Employee> staff = new HashMap<>();
		staff.put("144-25-5464", new Employee("Amy Lee"));
		staff.put("567-24-2546", new Employee("Harry Hacker"));
		staff.put("157-62-7935", new Employee("Gary Cooper"));
		staff.put("456-62-5527", new Employee("Francesca Cruz"));
		// print all entries
		System.out.println(staff);
		// remove an entry
		staff.remove("567-24-2546");
		// replace an entry
		staff.put("456-62-5527", new Employee("Francesca Miller"));
		// look up a value
		System.out.println(staff.get("157-62-7935"));
		// iterate through all entries
		staff.forEach((k, v) -> 
		System.out.println("key=" + k + ", value=" + v));
	}
}

如何查看Map

the set of keys: 将所有的key作为一个set返回

Set<K> keySet()
Set<String> keys = map.keySet();
for (String key : keys) {
	do something with key
}

the collection of values (which is not a set): 将所有的value作为一个collection返回

Collection<V> values()
 Map<String,String> map=new HashMap<>();
        map.put("abc","123");
        map.put("efg","456");
        // 使用增强型for遍历循环Map集合
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }

the set of key/value pairs: 得到每一对key value pair

Set<Map.Entry<K, V>> entrySet()
for (Map.Entry<String, Employee> entry : staff.entrySet()) {
	String k = entry.getKey();
	Employee v = entry.getValue();
	do something with k, v
}

Type of HashMap

HashMap

  • Hash table based implementation of the Map interface
  • the default load factor (.75)
  • 有一个子类为LinkedHashMap, 元素按照加入顺序排序

TreeMap

  • A Red-Black tree based NavigableMap implementation.
  • 需要根据compareTo排序

EumerateHashMap

  • A specialized Map implementation for use with enum type keys.
  • All of the keys in an enum map must come from a single enum type that is specified

WeakHashMap

  • Hash table based implementation of the Map interface, with weak keys.
  • An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use

Collection和Array互相转换

Collection To Array

Object[] values = staff.toArray();
  • 但是values的类型是Object并且不能转换类型 String[] values = (String[]) staff.toArray(); // Error!
  • 可以用如下写法: String[] values = staff.toArray(new String[staff.size()]);

Array To Collection

Arrays.asList()
String[] values = . . .;
HashSet<String> staff = new HashSet<>(Arrays.asList(values)); //所有的collection都可以通过另外一个collection初始化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 集合 --- Collection 框架 的相关文章

  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • 为什么 BufferedWriter 不写入文件?

    我有这个代码 String strings Hi You He They Tetrabenzene Caaorine Calorine File file new File G words txt FileWriter fWriter Bu
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav

随机推荐

  • Linux系统启动流程详解

    今天继续给大家介绍Linux相关内容 本文主要内容是Linux系统的启动流程 Linux系统启动流程如下图所示 从上图不难看出 Linux系统启动 一共分为步 1 加载BIOS BIOS是Basic Input Output System
  • selenium(3)----JAVA版本

    动态参数的使用 1 先对我们所修饰的方法加上 ParameterizedTest表示这个方法是多参数的一个类 2 MethodSource 数据来源的方法名称 MethodSource也可以不指定方法名称 会自动去找和测试方法同名的静态方法
  • Python 小技巧

    如果你有一个很长的数字变量 a 3000000000 怎么样让它在代码里看起来舒适 并且一下子就能知道它有多少位数呢 在 Python 中可以这么写 a 3 000 000 000 这样与直接 a 3000000000 是等价的 但是代码中
  • C++智能指针作为函数形参和函数返回值的应用场景

    当智能指针作为函数形参时 在调用此函数时 形参代表的智能指针的引用计数将 1 同时退出此函数时 该形参的引用计数将 1 当形参不是智能指针时 调用该函数和退出该函数时 该形参的引用计数不会变化 当函数的内部创建一个智能指针 并需要在函数外使
  • vulhub靶场搭建与使用

    vulhub靶场搭建与使用 1 前言 2 配置yum源 2 1备份原来的源文件 2 2 配置阿里源 2 3重置yum源 2 4更新yum源 3 安装docket 3 1安装docket 3 2启动docket 3 3设置国内镜像源 3 4重
  • 了解 什么是 22 端口

    一 22 是什么端口 22端口就是ssh应用端口 ssh用于远程连接Linux云服务器 一般Linux云服务器要放通22号端口 Windows云服务器需要放通3389号端口 云服务器用户需要在安全组中开放端口后 才可以使用端口对应的服务 在
  • HackInOS靶机渗透writeup

    HackInOS靶机渗透writeup 0x00准备测试环境 导入下载好的HackInOS ova文件后 将网络设置成桥接模式 并使用DHCP分配IP 成功后打开的靶机图如下 0x01渗透过程 使用nmap扫描确定目标机器IP nmap s
  • IT项目管理第6次作业

    IT项目管理第6次作业 一 教材练习6 a 画出该项目的双代号网络图 把节点的号码标在一个圆圈内 画出节点之间的箭线 在每一条箭线上标注代表活动的字母和活动工期 b 按照图6 8表示每条路径的方法 找出网络图中的所有路径并标出它们的长度 路
  • OA项目软件说明书

    最近写了一个OA项目 主要根据这个软件说明书来编写的 此处省略了封面的一些格式不友好的内容 目 录 1 引言 1 1 目的 1 2 定义 1 3 参考资料 2 软件总体概述 2 1 软件标识 2 1 1 项目名称 2 1 2 产品标识 2
  • 2023校园招聘求职报告

    导读 超四成学生选择就业 近三成学生选择继续深造 近两成的学生计划考公务员 还有6 1 的学生有自主创业的想法 从学生反馈来看大家在毕业后的计划多元化趋势明显 选择就业的人数偏少而深造和考公人数比例达到45 受疫情影响和不少行业的升级调整过
  • 【11】STM32·HAL库开发-STM32CubeMX简介、安装

    目录 1 STM32CubeMX简介 了解 2 STM32CubeMX安装 了解 2 1STM32CubeMX软件获取 2 1 1获取Java软件 2 1 2获取STM32CubeMX软件 2 2搭建Java运行环境 2 3安装STM32C
  • 积分变换->重要知识点总结

    知识点公式总结 Flourier变换总结 Flourier积分表达式 傅里叶变换和傅里叶逆变换 一些常用函数的Fourier变换 变换中可能用到的公式 诱导公式 指数三角转换 和差化积积化和差 函数的相关性质 傅里叶变换的相关性质 能量积分
  • java中的Iterator和Iterable 区别和具体使用{方法(Iterable values)}

    java lang Iterable java util Iterator 来自百度知道 Iterator是迭代器类 而Iterable是接口 好多类都实现了Iterable接口 这样对象就可以调用iterator 方法 一般都是结合着用
  • Java 对象

    Java对象是Java语言中最重要的概念之一 它允许开发人员将数据和方法组合在一起 创建具有自己行为和状态的实体 本文将详细介绍Java对象的概念 特性以及在实际工作中的应用 Java对象的概念和特性 在Java中 对象是类的实例 类是一个
  • QGis二次开发基础 -- 构建图层管理器

    为了回应有些同学对上一篇博文的建议 这篇文章主要关注于QGis二次开发中的 图层管理器 的实现 使用QGis构建独立应用系统 我相信大部分同学应该还是关注于GIS基本功能框架构建上 也就是一些基本的GIS功能 例如 数据的显示 漫游浏览等
  • 徐泽阳:7.19黄金原油行情走势分析,操作思路解读

    黄金消息面与基本面解析 周一 7月19日 现货黄金小幅上涨 上周五 7月16日 金价跌近1 主要因为零售销售意外增长提振美元指数上涨 不过消费者信心指数下跌以及股市下滑限制了金价跌势 黄金守在每盎司1800美元上方 但分析师表示 一个关键驱
  • Altium designer (AD)软件3D视图下怎么让背景色变为白色

    首先切换到PCB文件下 打开3D预览视图 快捷键为数字3 或者依次点击 视图 切换到3维模式 之后点击View configuration 点击System color 将 Workspace in 3D mode 的颜色更改为白色即可
  • en结尾的单词_以en结尾的英语单词

    展开全部 以e68a84e8a2ad62616964757a686964616f31333431353236en结尾的英语单词有很多 比如widen 使 加宽 broaden 使 扩宽 brighten 使 明亮 lighten减轻 点亮
  • 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    更多资讯 请关注 Ai尚研修科研技术动态 公众号 我国高分辨率对地观测系统重大专项已全面启动 高空间 高光谱 高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成 将成为保障国家安全的基础性和战略性资源 随着小卫星星座的普
  • Java 集合 --- Collection 框架

    Java 集合 Collection 框架 Collection Interface Concrete Implementations LinkedList ArrayList ArrayList 和 LinkedList的区别 Queue