集合(ArrayList,HashMap,HashSet)详解+ entrySet的应用

集合

  • 例题引入——直线
    • 题意分析
    • 根据下面的参考代码,自己模仿的
    • 参考代码(加一点点我的小tips)
  • ============================================
  • 1.java集合引入
  • 2.为什么要使用集合?
  • 3.List、Set、Queue和Map的区别
  • 4.List
    • List——ArrayList
      • (!!实用!!)ArrayList常用方法
    • List——Vector
    • List——LinkedList
  • 5.Set
  • 6.Map
    • HashMap
    • HashSet
    • entrySet
  • 参考文档

最近总遇到要用 Map 的题
这里写一下我的学习笔记
主要参考来自github–JavaGuide项目(超超超超超级推荐!!!)
(文章最后会附上链接)

例题引入——直线

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。

在这里插入图片描述

题意分析

  • 重点:直线—》怎么确定一条直线?—》直线方程 y = kx +b —》k,b确定一条直线
  • 直线不重复–》想到要用Set集合—》用HashSet(重复的元素根本就不会存进去)
  • 求k,b!!!这我竟然忘了咋求了!!
    在这里插入图片描述

根据下面的参考代码,自己模仿的

import java.util.*;
//import java.util.Map.Entry;//import com.sun.org.apache.bcel.internal.generic.IINC;public class Main{public static void main(String[] args) {//创建 HashSet集合,存放 k,bHashSet<Map<Double, Double>> sets = new HashSet<>();//创建 ArrayList集合 ,存放 点坐标ArrayList<Map<Integer, Integer>> list = new ArrayList<>();for(int i=0;i<20;i++) {for(int j=0;j<21;j++) {Map<Integer, Integer> map = new HashMap<>();map.put(i, j);list.add(map);	//点坐标放到ArrayList中}}//遍历ArrayList,计算其对应的k和bdouble x1 = 0,y1 = 0,x2 = 0,y2 = 0;	//要定义为double类型--》后面要用点坐标 计算k和b的值for(int i=0;i<list.size();i++) {//对于list集合中的每一个点,都去与它后面的所有点连线for(int j=i+1;j<list.size();j++) {//计算两点确定的一条直线的k,b//获取两点坐标for(Map.Entry<Integer, Integer> entry : list.get(i).entrySet()) {x1 = entry.getKey();y1 = entry.getValue();}for(Map.Entry<Integer, Integer> entry : list.get(j).entrySet()) {x2 = entry.getKey();y2 = entry.getValue();}//先不计算平行于x轴和y轴的那些直线if(x1 == x2 || y1 == y2) {continue;}//根据坐标点 计算k,bdouble k = (y1-y2)/(x1-x2);double b = (y1*x2-y2*x1)/(x2-x1);//创建一个临时的map--》打包k,bHashMap<Double,Double> temp = new HashMap<>();temp.put(k, b);//把map放到HashSet集合中---》Set集合天然的不添加重复元素---》最后Set集合的长度就是kb对的长度--》也就是确定唯一直线的个数sets.add(temp);}}System.out.println(sets.size()+20+21);}
}

参考代码(加一点点我的小tips)

代码参考于 蓝桥官网—— “求求你别黑我家哥哥了” 大佬
在这里插入图片描述

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {HashSet<Map<Double,Double>> lines = new HashSet<>();List<Map<Integer,Integer>> list = new ArrayList<>();for (int i = 0; i < 20; i++) {for (int j = 0; j < 21; j++) {//map中存放的kv对是点坐标Map<Integer,Integer> map = new HashMap<>();map.put(i,j);//再把map放到list中。也就是说,现在list中每一个index 存放的都是一个map集合(就是一个kv对表示的坐标点x,y)list.add(map);}}//得到两个直线点double x1=0,x2=0,y1=0,y2=0;//从list.get(0)开始,遍历每一个 index=0 之后的点 (也就是两点连线)for (int i = 0; i < list.size(); i++) {for (int j = i+1; j < list.size(); j++) {//得到i中的map的kv对的值(也就是出发点的坐标k=x,v=y)for (Map.Entry<Integer, Integer> entry : list.get(i).entrySet()) {x1 = entry.getKey();y1 = entry.getValue();}//同理,得到j中的map(k,v)for (Map.Entry<Integer, Integer> entry : list.get(j).entrySet()) {x2 = entry.getKey();y2 = entry.getValue();}//先不计算所有平行于x轴,y轴的直线if (x1 == x2 || y1 == y2) {continue;}//计算出 这两点对应的k,b的值double k = (y2 - y1) / (x2 - x1);double b = (x2 * y1 - x1 * y2) / (x2 - x1);//k,b值存放到一个map集合中Map<Double, Double> temp = new HashMap<>();temp.put(k, b);//把这个map集合放到HashSet集合中--》自动的 重复的k,b只会存进去一次lines.add(temp);}}//最后,lines中有多少个map集合,那就有多少条不重复的直线---》这里需要加上之前刨除的平行于x轴和y轴的那些直线System.out.println(lines.size()+20+21);}
}

基于这段代码,开启这篇文章

============================================

1.java集合引入

java集合,也叫做容器,主要是由两大接口派生而来:
Collection接口,用于存放单一元素;
Map集合,主要存放键值对。

对于Collection接口,下面又有三个主要的子接口:List、Set和Queue

  • java集合框架(概览)如下:
    在这里插入图片描述

2.为什么要使用集合?

当我们需要存储一组类型相同的数据时,数组是最常用且最基本的容器之一。但是,使用数组存储对象存在一些不足之处,因为在实际开发中,存储的数据类型多种多样且数量不确定。这时,Java
集合就派上用场了。与数组相比,Java 集合提供了更灵活、更有效的方法来存储多个数据对象。Java
集合框架中的各种集合类和接口可以存储不同类型和数量的对象,同时还具有多样化的操作方式。相较于数组,Java
集合的优势在于它们的大小可变、支持泛型、具有内建算法等。总的来说,Java
集合提高了数据的存储和处理灵活性,可以更好地适应现代软件开发中多样化的数据需求,并支持高质量的代码编写。

3.List、Set、Queue和Map的区别

简单的说:

  • List:有顺序
  • Set:元素不可重复
  • Queue:排队
  • Map:用key来搜索value
  • List:存储的元素都是有序的、可重复的
  • Set:存储的元素不可重复
  • Queue:按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的
  • Map:使用键值对(key-value)存储,类似于数学上的函数y=f(x),“x”代表key,“y”代表value。key是无序的、不可重复的;value是无序的、可重复的,每个键最多映射到一个值。

4.List

  • ArrayList
  • Vector
  • LinkedList

List——ArrayList

- ArrayList的底层是数组队列,相当于动态数组。
- 与java中的数组相比,它的容量能动态增长。
- 在添加大量元素前,应用程序可以使用ensureCapacity操作来添加ArrayList实例的容量
  • ArrayList 继承于AbstractList,实现了List,RandomAccess,Cloneable,java.io.Serializable这些接口。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
  • ArrayList实现的功能也和这些接口有关
    • List:表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问
    • RandomAccess:这是一个标志接口,表明实现这个接口的List集合是支持快速随机访问的。在ArrayList中,我们既可以通过元素的序号快速获取元素对象,这就是快速随机访问。
    • Cloneable:表明它具有拷贝能力,可以进行深拷贝或浅拷贝操作。
    • Serializable:表明它可以进行序列化操作,也就是可以将对象转换为字节流进行持久化存储或网络传输。

(!!实用!!)ArrayList常用方法

  • add(E element):将指定元素添加到列表的末尾
	ArrayList<Integer> list = new ArrayList<Integer>();list.add(123);list.add(45);list.add(666);System.out.println(list);	//output:[123, 45, 666]ArrayList<String> s = new ArrayList<String>();s.add("hfies");s.add("jeif");s.add("fose");System.out.println(s);	//output:[hfies, jeif, fose]
  • add(int index,E element):在指定位置插入指定元素
	list.add(2, 9999);System.out.println(list);	//output:[123, 45, 9999, 666]
  • get(int index):返回指定位置的元素
	System.out.println(list.get(2));	//output:9999//也可用于循环输出for(int i=0;i<list.size();i++) {System.out.print(list.get(i)+" ");	//output:123 45 9999 666}
  • set(int index,R element):替换指定位置的元素
	list.set(2, 8888);System.out.println(list);//output:[123, 45, 8888, 666]
  • remove(int index):移除指定位置的元素
	list.remove(2);System.out.println(list);//output:[123, 45, 666]
  • size():返回列表中的元素数目
	System.out.println(list.size());//output:3
  • clear():清空列表中的所有元素
	list.clear();System.out.println(list);//output:[]
  • contains(Object o):判断列表是否包含指定元素
	System.out.println(list.contains(666));//output:true
  • indexOf(Object o):返回指定元素在列表中第一次出现的位置
	System.out.println(list.indexOf(45));//output:1
  • isEmpty():判断列表是否为空
	System.out.println(list.isEmpty());//output:false
  • clone():复制数组
	Object o = list.clone();System.out.println(o);//output:[123, 45, 666]
  • 全部代码:
import java.util.*;;public class Main{public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<Integer>();list.add(123);list.add(45);list.add(666);System.out.println(list);	//output:[123, 45, 666]ArrayList<String> s = new ArrayList<String>();s.add("hfies");s.add("jeif");s.add("fose");System.out.println(s);	//output:[hfies, jeif, fose]list.add(2, 9999);System.out.println(list);	//output:[123, 45, 9999, 666]System.out.println(list.get(2));	//output:9999for(int i=0;i<list.size();i++) {System.out.print(list.get(i)+" ");	//output:123 45 9999 666}System.out.println();list.set(2, 8888);System.out.println(list);//output:[123, 45, 8888, 666]list.remove(2);System.out.println(list);//output:[123, 45, 666]System.out.println(list.size());//output:3System.out.println(list.contains(666));//output:trueSystem.out.println(list.indexOf(45));//output:1System.out.println(list.isEmpty());//output:falseObject o = list.clone();System.out.println(o);//output:[123, 45, 666]list.clear();System.out.println(list);//output:[]}
}

//output:
在这里插入图片描述

List——Vector

List——LinkedList

这两个我还没用到过,用到会来补充

5.Set

HashSet:无序,唯一
TreeSet:有序,唯一
LinkedHashSet

  • HashSet:基于HashMap实现的,底层采用HashMap来保存元素。
  • LinkedHashSetLinkedHashSetHashSet的子类,并且其内部是通过LinkedHashMap来实现的。
  • TreeSet:红黑树(自平衡的排序二叉树)

6.Map

HashMap

  • map.put()
	Map<Integer,String> map = new HashMap<>();map.put(1, "1a");map.put(2, "2a");map.put(3, "3a");System.out.println(map);	//output:{1=1a, 2=2a, 3=3a}//当给map中添加元素,会返回key对应的原来的value值;若key没有对应的值,返回nullSystem.out.println(map.put(1, "5"));	//output:1aSystem.out.println(map);	//output:{1=5, 2=2a, 3=3a}
  • map.get()
	//根据指定的key获取对应的valueString s = map.get(2);System.out.println(s);	//output:2a
  • map.remove()
	//根据key删除元素,会返回key对应的value值String value = map.remove(2);System.out.println(value);	//output:2aSystem.out.println(map);	//output:{1=5, 3=3a}

HashSet

HashSet是基于HashMap来实现的,实现了Set接口,同时还实现了序列化和可克隆化。
而集合Set是不允许有重复值的。
所以HashSet是一个没有重复元素的集合但不保证集合的迭代顺序(所以,随着时间改变,元素的顺序可能会改变)
由于HashSet是基于HashMap来实现的,所以允许空值不是线程安全

  • HashSet是基于HashMap实现的,区别就在于HashMap中输入一个键值对,而在HashSet中只输入一个值。

  • 构建HashSet

HashSet<E> hs = new HashSet<E>();
//也可以写成
Set<E> hs = new HashSet<E>();
  • add():因为HashSet不会存在重复元素,所以相同的元素不会存进去
  • 常用方法:
    在这里插入图片描述

entrySet

entrySet就是用来遍历map的一种方法

entrySet是java中键值对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。

  • entrySet实现了Set接口,里面存放的是键值对
Set<Map.Entry<String,String>> entryseSet = map.entrySet();for(Map.Entry<String,String> entry:entryseSet){System.out.println("key= ” + entry.getKey + "," + "value= " + entry.getValue()):
}

参考文档

  • java笔记–Map的用法
  • Java中哈希集(HashSet)概念,实现以及操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24Compact模式启动

Compact模式启动 compact,是压缩的意思.顾名思义,这是一种压缩启动技术. Compact启动模式比wimboot出现得还要晚,是微软在Windows10中才引入的一种启动模式.相比于普通启动和wimboot,compact启动有以下几个优点: 1.减少占用C盘空间:compact把系统文件在C盘内直接进行压缩,从而达…

基于springboot的船舶维保管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Java反序列化JDK动态代理的关系

Java代理模式 为什么要学习代理模式&#xff1f;了解开发原理&#xff0c;才能明白漏洞的产生。这不仅仅是SpringAOP的底层&#xff01; [SpringAOP 和 SpringMVC] 代理模式的分类&#xff1a; 静态代理动态代理 静态代理 角色分析&#xff1a; 抽象角色&#xff1a;一般会…

ElasticSearch、java的四大内置函数式接口、Stream流、parallelStream背后的技术、Optional类

第四周笔记 一、ElasticSearch 1.安装 apt-get install lrzsz adduser -m es 创建用户组&#xff1a; useradd *-m* xiaoming(用户名) *PS&#xff1a;追加参数-m* passwd xiaoming(用户名) passwd xiaoming 输入新的 UNIX 密码&#xff1a; 重新输入新的 UNIX 密码&…

帆软报表踩坑日记

最近公司项目要是使用报表&#xff0c;公司使用的是帆软这个国产软件&#xff0c;自己也是学习使用&#xff0c;在使用的过程中记一下问题以及解决方式 公司使用的是帆软8这个版本&#xff0c;比较老了。 首先是表格中的扩展&#xff0c;就是当我们根据数据库查询数据然后放到表…

Redis入门三(主从复制、Redis哨兵、Redis集群、缓存更新策略、缓存穿透、缓存击穿、缓存雪崩)

文章目录 一、主从复制1.单例redis存在的问题2.主从复制是什么&#xff1f;3.主从复制的原理4.主从搭建1&#xff09;准备工作2&#xff09;方式一3&#xff09;方式二 5.python中操作1&#xff09;原生操作2&#xff09;Django的缓存操作 二、Redis哨兵&#xff08;Redis-Sent…

Nginx负载均衡 ,6种常用方式。(新手必看)

nginx的负载均衡策略有六种&#xff1a; 1、轮询&#xff08;默认策略&#xff0c;nginx自带策略&#xff09;&#xff1a;我上面的例子就是轮询的方式&#xff0c;它是upstream模块默认的负载均衡默认策略。会将每个请求按时间顺序分配到不同的后端服务器。 http {upstream …

腾讯 tendis 替代 redis linux安装使用

下载地址 Tendis存储版 点击下载 linux 解压 tar -zxvf 安装包.tgz cd 解压安装包/scripts 启动 ./start.sh 停止 ./stop.sh 详细配置 修改 /scripts tendisplus.conf # tendisplus configuration for testing # 绑定本机IIP bind 192.168.31.112 port 51002 #设…

【CANN训练营笔记】Atlas 200I DK A2体验手写数字识别模型训练推理

环境介绍 开发板&#xff1a;Huawei Atals 200I DK A2 内存&#xff1a;4G NPU&#xff1a;Ascend 310B4 准备环境 下载编译好的torch_npu wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/wanzutao/torch_npu-2.1.0rc1-cp39-cp39-linux_aarch64.whl pip3 install …

简易TCP服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单TCP服务器通信TCP三次握手和四次挥手三次握手&#xff08;如下图&#xff09;常见问题&#xff1f; 四次挥手 client和server通信写法server端client端 通信双方建立连接到断开连接的状态转换怎么应对多用户连接&#xff1f;缺点 IO多路复用select优缺点 poll…

游戏行业行业竞争越来越激烈,遇到DDoS攻击遭受严重损失该如何解决

近年来&#xff0c;我们见证了数字化的快速发展&#xff0c;随着这样的发展&#xff0c;网络的威胁也逐渐增多&#xff0c;在网络攻击门槛不断降低&#xff0c;行业竞争越来越激烈&#xff0c;游戏行业的DDoS攻击如雨点般密集&#xff0c;在整个DDoS攻击的份额中&#xff0c;游…

前端日期组件layui使用,月模式

初学前端&#xff0c;实战总结 概要 有一个日期组件&#xff0c;我的谷歌浏览器选完日期后&#xff0c;偶尔获取不到最新数据&#xff0c;有一个客户&#xff0c;是经常出不来数据。 日期组件是Wdate&#xff1a;调用的方法是WdatePicker onpicking&#xff0c;代码片段如下…

ubuntu 安装 cloudcompare(两种方法)

方法一 &#xff1a;从 snap 安装 &#xff08;推荐&#xff09; 安装简单&#xff0c;基本上功能都有&#xff08;读写保存las&#xff0c;pcd&#xff0c;标注等&#xff09; 安装&#xff1a; sudo apt-get update sudo apt install snap sudo snap install cloudcompare…

c++使用类的一些注意事项

前言&#xff1a; 本篇内容为前面的补充&#xff0c;介绍了我们使用类时需要注意些什么以及一些编译器的优化&#xff0c;可能有些理解不到位或者错误&#xff0c;请斧正。 目录 前言&#xff1a; 1.再谈构造函数 2.&#xff08;c98&#xff09;隐式类型转换中的编译器的优…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

UI的设计

一、RGB888的显示 即红色&#xff0c;绿色&#xff0c;蓝色都为8位&#xff0c;即通常说的24位色。可以很好显示各种过渡颜色。从硬件上&#xff0c;R、G、B三基色的连接线各需要有8根&#xff0c;即24根数据线&#xff1b;软件上存储的数据量也需要24位&#xff0c;即3个字节&…

环境影响与碳排放生命周期评估应用及案例分析

生命周期分析 (Life Cycle Analysis, LCA) 是评价一个产品系统生命周期整个阶段——从原材料的提取和加工&#xff0c;到产品生产、包装、市场营销、使用、再使用和产品维护&#xff0c;直至再循环和最终废物处置——的环境影响的工具。这种方法被认为是一种“从摇篮到坟墓”的…

哔哩哔哩直播姬有线投屏教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …

07-工作流设计:如何设计合理的多人开发模式?

一个企业级项目是由多人合作完成的&#xff0c;不同开发者在本地开发完代码之后&#xff0c;可能提交到同一个代码仓库&#xff0c;同一个开发者也可能同时开发几个功能特性。这种多人合作开发、多功能并行开发的特性如果处理不好&#xff0c;就会带来诸如丢失代码、合错代码、…

ES6 学习(二)-- 字符串/数组/对象/函数扩展

文章目录 1. 模板字符串1.1 ${} 使用1.2 字符串扩展(1) ! includes() / startsWith() / endsWith()(2) repeat() 2. 数值扩展2.1 二进制 八进制写法2.2 ! Number.isFinite() / Number.isNaN()2.3 inInteger()2.4 ! 极小常量值Number.EPSILON2.5 Math.trunc()2.6 Math.sign() 3.…