Java详解:单列 | 双列集合 | Collections类
○ 前言:
- 在开发实践中,我们需要一些能够动态增长长度的容器来保存我们的数据,java中为了解决数据存储单一的情况,java中就提供了不同结构的集合类,可以让我们根据不同的场景进行数据存储的选择,如Java中提供了 数组实现的集合,链表实现的集合,哈希结构,树结构等。
体系图
○ Java中的集合体系如图:
○ 集合的分类:
• 集合可以分为单列集合和双列集合.
单列集合
● Collection接口定义了单列集合共有的方法,其子接口Set和List分别定义了存储方式。
● List接口继承了Collection接口,有三个实现的类,分别是:ArrayList (数组列表) | LinkedList
(链表列表) | Vector 数组列表 (且线程安全).
● Set接口继承了Collection接口,有两个实现的类,分别是:HashSet | TreeSet .
○ 区别:
• List:可以有重复元素 • Set:不可以有重复元素
List 接口的实现类
● ArrayList
• 底层有一个数组,可以动态扩展数组长度 ; 查询快,在中间增加 / 删除慢.(特点)
• 常用方法:
ArrayList<String> s=new ArrayList<>();s.add("a");s.add("b");s.add("c");s.add("d");System.out.println(s.get(2));//根据索引得到指定位置的元素s.remove(0);//删除并返回指定位置的元素System.out.println(s);s.set(0,"X");//替换指定元素并返回数组System.out.println(s);s.size();System.out.println(s.size());//返回实际元素个数s.addFirst("X");s.addLast("X");
● LinkedList
• 底层是一个链表结构 ; 查询慢,但增加 / 删除元素快(特点)
○ 我们发现ArrayList和LinkedList的特点正好相反,原因如图:
● Vector
• 和ArrayList一样,底层也是数组实现,不同的是Vector的方法默认加了锁,线程是安全的。
Set 接口及实现类
○ 特点:
• Set中所储存的元素是不重复的,无序的,且Set中的元素没有索引。
• 由于Set中元素无索引,所有其实现类中没有get() [通过索引获取指定位置元素] 并且不能通过for 循环进行遍历。
● HashSet
• HashSet 是一个不允许有重复元素的集合,是无序的,不是线程安全的。
public static void main(String[] args) {HashSet set =new HashSet<>();set.add("a");set.add("a");set.add("b");set.add("c"); //元素是不重复的System.out.println(set);//输出:[a,b,c]HashSet set1 =new HashSet<>();set1.add("c");set1.add("s");set1.add("x");set1.add("d"); //元素是无序的System.out.println(set1);//输出:[c,s,d,x]}
★ HashSet在添加元素时,是如何判断元素重复的? (面试高频题)
- 在底层会先调用hashCode(),注意,Object中的hashCode()返回的是对象的地址,此时并不会调用;此时调用的是类中重写的hashCode(),返回的是根据内容计算的哈希值,遍历时,会用哈希值先比较是否相等,会提高比较的效率;但哈希值会存在问题:内容不同,哈希值相同;这种情况下再调equals比较内容,这样既保证效率又确保安全。
● TreeSet
• TreeSet可以根据值进行排序,底层使用了树形结构,树结构本身就是有序的。
TreeSet<Integer> treeSet =new TreeSet<>();treeSet.add(2);treeSet.add(1);treeSet.add(4);treeSet.add(4);treeSet.add(3);System.out.println(treeSet);//输出[1,2,3,4]
★ 向树形结构中添加元素时,如何判断元素大小以及元素是否重复?
• 向TreeSet中添加的元素类型必须实现Comparable接口,重写compareTo() ; 每次添加元素时,调 用compareTo()进行元素大小判断 (小于0放左子结点,等于0表示重复,大于0放右子节点)
○ TreeSet集合的遍历只能通过 增强for循环 和 迭代器(Iterator) 遍历. (元素没有索引)
双列集合
特点:
○ 数据存储是以 ( 键,值 ) 形式存储
○ 键不能重复,值可以重复。
○ 通过键找到值,一个键只能映射到一个值。
○ 键和值被称为键值对,java中叫Entry对象
Map接口的实现类
● HashMap
○ HashMap中的键是无序的
//可以存储两组值(键K,值V)HashMap<String,String> map =new HashMap<>();map.put("a","aa"); //put() 向map中添加一组键 值对map.put("w","ww");map.put("c","cc");map.put("s","ss");map.put("a","aaa"); /* 替代之前的键a */System.out.println(map); //键是无序的
输出:{a=aaa, c=cc, s=ss, w=ww}
○ 常用方法:
○ 代码实现:
//常用方法HashMap<String,String> map =new HashMap<>();map.put("a","aa"); //put() 向map中添加一组键 值对map.remove("a"); //删除指的的键,返回对应的值map.clear(); //清空键值对map.isEmpty(); //判断键值对的个数是否为空map.containsKey("a"); //是否含对应键map.containsValue("aaa");//是否含对应值map.get("s"); //传键返值map.size(); //有几组键值对
★ HashMap底层存储数据的结构 : (面试高频题)
○ 底层使用了一个长度默认为16的哈希数组,用来确定元素的位置,每次用key计算出哈希值,再 用哈希值%数组长度确定元素位置,将元素放在哈希表中指定的位置。
○ 后来继续添加元素,如果出现位置相同且不重复的元素,那么将后来元素添加到之前元素的next 节点。
○ 当链表长度等于8且哈希数组的长度大于64时链表会自动转为红黑树。
补充: 哈希表负载因子为0.75 , 当哈希表使用数组的0.75倍时会自动扩容为原来数组长的2倍。
● TreeMap
○ 底层使用树形结构存储键值
○ 键可以排序
○ 键元素类型必须实现Comparable接口,重写compareTo()
注意: TreeMap和TreeSet一样,底层都是红黑树结构
● Hashtable
○ 底层实现也是用到key的哈希值计算位置判断元素是否重复。
○ 方法上都添加了synchronized,线程是安全的。
HashMap和Hashtable的区别:
● Hashtable中不能存储为null的键和为null值,但HashMap中可以。
HashMap<Integer,String> map =new HashMap<>();map.put(1,"a");map.put(2,null);map.put(null,null);System.out.println(map); //输出:{null=null, 1=a, 2=null}Hashtable<String,String> table =new Hashtable<>();table.put(null,"a"); //报错 System.out.println(table);
Collections类
概述:Collections是集合类的工具类,与数组的工具类Arrays类似.
常用方法:
1. sort(Comparator<? super E>):void List
对集合中的元素排序。
2.reverse(List<?>):void
反转集合中的元素。
3.shuffle(List<?>):void
打乱元素中的元素。
4.fill(List<? super T>,T):void
用T元素替换掉集合中的所有的元素。
5.copy(List<? super T>,List<? extend T>):void
复制并覆盖相应索引的元素
6.swap(List<?>,int,int):void
交换集合中指定元素索引的位置.
7.replaceAll(List,T,T):boolean
替换成指定的元素。
代码演示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class collections {public static void main(String[] args) {ArrayList<Integer> list =new ArrayList<>();list.add(1);list.add(2);/* addAll(Collection<? super T> c, T... elements); */Collections.addAll(list,3,4,5,6);//将指定的可变长度参数添加到指定集合中System.out.println(list);Collections.sort(list); //排序(默认升序)System.out.println("升序:"+list);//Collections.binarySearch() 二分查找System.out.println(Collections.binarySearch(list,5));//二分查找//创建了一个实现Comparator接口的匿名内部类对象,省去了创建一个类简化语法Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.intValue()- o1.intValue(); //降序}});System.out.println("降序:"+list);ArrayList<Integer> list1 =new ArrayList<>();Collections.addAll(list1,1,2,3,4);Collections.fill(list1,5);System.out.println(list1);Collections.replaceAll(list1,5,6);// Collections.swap(list,0,1);//交换指定位置上元素//System.out.println(list); // 2134//copy(list2,list1) 集合复制 目标集合size > 原集合size//fill(list,v)用指定的值填充集合//max / min//replaceAll//reverse 逆序//Collections.shuffle(list); 随机排序}
}
相关文章:

Java详解:单列 | 双列集合 | Collections类
○ 前言: 在开发实践中,我们需要一些能够动态增长长度的容器来保存我们的数据,java中为了解决数据存储单一的情况,java中就提供了不同结构的集合类,可以让我们根据不同的场景进行数据存储的选择,如Java中提…...
Centos7 使用docker来部署mondb
参考官方手册: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-community-with-docker/#std-label-docker-mongodb-community-install 使用脚本快速安装docker curl -fsSL https://get.docker.com -o get-docker.sh | bash get-docker.sh使用 Doc…...
Java SE入门及基础(35)
接口 1. 概念 在软件工程中,软件与软件的交互很重要,这就需要一个约定。每个程序员都应该能够编写实现这样的约定。接口就是对约定的描述。 In the Java programming language, an interface is a reference type, similar to a class, that can con…...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的常见车型识别系统(Python+PySide6界面+训练代码)
摘要:本文深入探讨了如何应用深度学习技术开发一个先进的常见车型识别系统。该系统核心采用最新的YOLOv8算法,并与早期的YOLOv7、YOLOv6、YOLOv5等版本进行性能比较,主要评估指标包括mAP和F1 Score等。详细解析了YOLOv8的工作机制,…...
Sqoop 学习
参考视频 大数据Sqoop教程丨从零开始讲解大数据业务及数据采集和迁移需求_哔哩哔哩_bilibili 介绍 Sqoop是Hadoop生态体系和RDBMS(关系型数据库)体系之间传送数据的一种工具 Hadop生态系统:HDFS,Hbase,Hive等 RDBMS包…...

Ollama 只安装 Ollama,本地快速部署谷歌开源大模型Gemma(基于Ollama)
参考:本地快速部署谷歌开源大模型Gemma(基于Ollama) - 知乎 确保系统更新: Bash sudo apt update && sudo apt upgrade 需要先下载Ollama,版本要求0.1.26及以上 运行curl -fsSL https://ollama.com/install.sh | sh 监听 Ollama API 接…...

一条 sql 语句可能导致的表锁和行锁以及死锁检测
锁 MDL 当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁 ALTER TABLE tbl_name NOWAIT add column ... ALTER TABLE tbl_name WAIT N add column ... …...

prometheus 原理(架构,promql表达式,描点原理)
大家好,我是蓝胖子,提到监控指标,不得不说prometheus,今天这篇文章我会对prometheus 的架构设计,promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…...
Linux的目录结构(介绍主要的)
/:根目录,文件系统的起点,包含了所有目录和文件 /bin:存放基本的可执行命令,如ls,cp,rm /lib:主要存放动态链接库 /opt:供第三方软件安装的目录,通常将软件…...

推房子游戏c++
这段代码是一个推箱子游戏的实现。游戏中有一个地图,地图上有墙壁、人、箱子和目标位置。玩家通过键盘输入WASD或方向键来控制人物的移动,目标是将所有的箱子推到相应的目标位置上。 代码中的dt数组表示地图,每个位置上的字符表示对应的元素…...

docker学习入门篇
1、docker简介 docker官网: www.docker.com dockerhub官网: hub.docker.com docker文档官网:docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是:Build, Ship and Run Any App, Anywhere(构建&…...
【Spring Boot 3】动态注入和移除Bean
【Spring Boot 3】动态注入和移除Bean 背景介绍开发环境开发步骤及源码工程目录结构总结动态注入Bean的方法动态移除Bean的方法注意事项背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个…...

555经典电路
1、555介绍: 555 定时器是一种模拟和数字功能相结合的中规模集成器件。一般用双极性工艺制作的称为 555,用 CMOS 工艺制作的称为 7555,除单定时器外,还有对应的双定时器 556/7556。555 定时器的电源电压范围宽,可在 4…...

vue 下载的插件从哪里上传?npm发布插件详细记录
文章参考: 参考文章一: 封装vue插件并发布到npm详细步骤_vue-cli 封装插件-CSDN博客 参考文章二: npm发布vue插件步骤、组件、package、adduser、publish、getElementsByClassName、important、export、default、target、dest_export default…...

吴恩达机器学习笔记 十七 通过偏差与方差诊断性能 正则化 偏差 方差
高偏差(欠拟合):在训练集上表现得也不好 高方差(过拟合):J_cv要远大于J_train 刚刚好:J_cv和J_train都小 J_cv和J_train与拟合多项式阶数的关系 从一阶到四阶,训练集的误差越来越小…...
Java高频面试之SSM篇
有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 Java高频面试之总纲篇 Java高频面试之集合篇 Java高频面试之异常篇 Java高频面试之并发篇 Java高频面试之SSM篇 Java高频面试之Mysql篇 Java高频面试之Redis篇 Java高频面试之消息队列与分布式篇…...
【软件工程】介绍
软件工程 软件工程是一门应用计算机科学、数学和工程原则来设计、开发、维护和测试软件的学科。软件工程着重于创建质量高效、可靠、可使用、可维护和快速开发的系统。这个领域从20世纪60年代初开始蓬勃发展,主要是为了解决软件危机,即随着计算机和软件…...

考研复习C语言初阶(4)+标记和BFS展开的扫雷游戏
目录 1. 一维数组的创建和初始化。 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3. 数组越界 4. 冒泡…...

在 Python 中从键盘读取用户输入
文章目录 如何在 Python 中从键盘读取用户输入input 函数使用input读取键盘输入使用input读取特定类型的数据处理错误从用户输入中读取多个值 getpass 模块使用 PyInputPlus 自动执行用户输入评估总结 如何在 Python 中从键盘读取用户输入 原文《How to Read User Input From t…...

linux设置systemctl启动
linux设置nginx systemctl启动 生成nginx.pid文件 #验证nginx的配置,并生成nginx.pid文件 /usr/local/nginx/sbin/nginx -t #pid文件目录在 /usr/local/nginx/run/nginx.pid 设置systemctl启动nginx #添加之前需要先关闭启动状态的nginx,让nginx是未…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...