当前位置: 首页 > news >正文

JavaSE之集合篇

文章目录

  • 前言
  • 一、集合概述
    • 集合继承结构图
  • 二、Collection接口中常用方法
    • 2.1Collection中存放什么元素?
    • 2.2常用方法
    • 2.3迭代器
  • 三、List接口中常用的方法
  • 四、ArrayList初始化容量及扩容
  • 五、Vector
  • 六、Map接口常用方法
  • 七、Properties


前言

由于在刷题过程中,经常遇到map的使用,顺便一起回忆一波


一、集合概述

数组其实就是一个集合,
集合不能直接存储基本数据类型,另外集合也不能直接存储Java对象,集合中存储的都是Java对象的内存地址。(或者说集合中存储的是引用)

在Java中每一个不同的集合,底层会对应不同的数据结构。往不同的集合中存储数据元素,等于将数据放到了不同的数据结构当中。

集合在Java JDK中哪个包下?
java.util.* 所有的集合类和集合接口都在java.util包下

集合继承结构图

在Java中集合分为两大类:

  • 一类是单个方式存储元素:这一类集合中超级父接口 java.util.Collection
    在这里插入图片描述

Collection下有主要的两大类:List和Set【常用的】
list集合的特点:有序可重复,存储的元素有下标【有序实际上是说存进去是这个顺序,取出来还是这个顺序,不是按照大小顺序排序】,有序是因为list集合都有下标,下标从0开始 以1递增

ArrayList、LinkedList、Vector【常用的】
ArrayList底层采用了数组这种数据结构【非线程安全的】
LinkedList底层采用了双向链表数据结构
Vector底层采用了数组这种数据结构【线程安全的,所有的方法都有synchronized关键词修饰,但是效率较低。现在保证线程安全有别的方案,因此使用较少】

Set集合存储元素的特点:无序,表示存进去是这个顺序,取出来就不一定是这个顺序了,不可重复,没有下标。

HashSet:实际上HashSet在new的时候底层实际创建了一个HashMap集合。向HashSet集合中存储元素实际上是存储到HashMap集合中了。HashMap集合是一个哈希表数据结构
TreeSet的父接口:SortedSet 【SortedSet的父接口Set】,TreeSet集合底层实际上是TreeMap,new TreeSet集合实际上是new了一个TreeMap集合,TreeMap底层采用了二叉树的数据结构

  • 一类是以键值对的方式存储元素:java.util.Map

1、Map集合和Collection没有关系
2、Map集合以key和value的方式存储
3、key和value豆豆hi存储Java对象的内存地址
4、所有map集合的key都是无序不可重复的
map集合的key和set集合存储元素特点相同【给set集合添加元素实际上是加到了map集合的key部分】

HashMap:【非线程安全的】底层是哈希表数据结构,无序不可重复
HashTable:【线程安全的】底层是哈希表数据结构,效率较低,现在使用较少
Properties【属性类】继承了HashTable,线程安全的
SortedMap【接口】无需不可重复,另外放在SortedMap key部分的元素会自动按照大小排序,称为可排序的集合---->TreeMap是它的实现类,TreeMap集合底层的数据结构是一个二叉树

总结(所有的实现类):
ArrayList:底层是数组
LinkedList:底层是双向链表
Vector:底层是数组,线程安全的,效率较低,使用较少。
HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合key部分了
TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合key部分了
HashMap:底层是哈希表
Hashtable:底层是哈希表,线程安全的,效率较低,使用较少
Properties:线程安全的,key和value只能存储字符串
TreeMap:底层是二叉树,TreeMap集合的key可以自动按照大小排序

List集合存储元素的特点:有序(有下标)可重复(存进去的元素和取出的元素顺序相同)
Set(Map)集合存储元素的特点:无序不可重复
SortedSet(SortedMap)集合存储元素的特点:无序不可重复,但是SortedSet集合中的元素的可排序(可以按照大小顺序排列)的。

二、Collection接口中常用方法

2.1Collection中存放什么元素?

没有使用“泛型”之前,Collection中可以存放Object的所有子类型
使用泛型之后,Collection中只能存储某个具体类型

2.2常用方法

创建一个集合对象
【多态,父类型引用指向子类型对象】

Collection<> c = new ArrayList<>();

向集合中添加元素

c.add(1200)//自动装箱 实际上是放进去了一个对象的内存地址。
c.add(3.14)
c.add("hello")
c.add(new Object());
c.add(true)

获取集合中的元素个数

c.size();//5

清空集合

c.clear();

判断集中中是否包含某个元素o

注意:在没有重写equals之前 会比较内存地址 结果是false

底层调用的是 equals() 方法【比较的是内容不是内存地址】

存放在集合中的类型,一定要重写equals方法

c.contains("hello")
public static void main(){Collection c = new ArrayList();User u1 = new User("jack");c.add(u1);User u2 = new USer("jack");//注意:在没有重写equals之前 会比较内存地址 结果是falsec.contains(u2);
}Class User{private String name;public User(){};public User(String name){this.name = name;}
}

删除集合中某个元素
remove底层也调用了equals方法

c.remove()
String s1 = "hello";
Strign s2 = "hello";
c.add(s1);
c.add(s2);
c.remove(s2);//会不会把s1也删除掉? --->会

判断集合是否为空

c.isEmpty();

把集合转化为数组

c.toArray();

2.3迭代器

迭代器是所有Collection通用的一种方式,在Map集合中不能用,在所有的Collection以及子类中使用

一定要注意:集合结构只要发生改变【添加一个元素或者删除元素】迭代器都必须重新获取,如果没有重新获取迭代器就会出现异常,根本原因在于:集合中元素删除了,但是没有更新迭代器
迭代器去删除时,会自动更新迭代器,并且更新集合 【删除集合中元素】

	Collection c = new ArrayList();c.add("hello");c.add("bwy");c.add(100);c.add(new Object());Iterator it = c.iterator();while(it.hasNext()){Object o = it.next();}

三、List接口中常用的方法

list:有序可重复

1、创建list类型的集合

List list = new ArrayList();

2、添加元素

默认都是向集合末尾添加元素

list.add("A"); //默认都是向集合末尾添加元素
list.add(1,"bwy") //在指定位置插入指定元素 使用不多,效率比较低

3、根据下标获取元素
因为有下标,因此list集合有自己比较特殊的遍历方式

Object 0 = list.get(0);
//遍历方式
for(int i=0;i<list.size();i++){Object o = list.get(i); 
}

4、获取指定对象第一次以及最后一次出现处的索引

int index1 = list.indexOf("A");
int index2 = list.lastIndexOf("A");

5、根据下标删除元素

list.remove(0);

6、修改指定位置元素

list.set(2,"soft");

四、ArrayList初始化容量及扩容

ArrayList初始化容量是10;
list.size()是10还是0呢?----->0 集合中的size()方法是获取当前集合中元素的个数
容量和size两回事
ArrayList集合底层是一个Object[]数组

在这里插入图片描述

五、Vector

底层是一个数组,初始容量10
将不安全的ArrayList变为线程安全的:

List list = new ArrayList();
Collections.synchronizedList(list);

六、Map接口常用方法

1、map和Collection没有继承关系
2、Map集合以key和value的方式存储数据
key和value都是引用数据类型
key和value都是存储对象的内存地址

void clear();清空Map集合
boolean containsKey(Object key); 判断Map中是否包含某个key
boolean containsValue(Object value);判断Map中是否包含某个value
V get(Object key); 通过key获取value
boolean isEmpty(); 判断Map集合中元素个数是否为0
V put(K key,V value); 向Map集合总添加键值对
V remove(Object key) 通过key删除键值对
int size(); 获取Map集合中键值对的个数
Collection< V> values(); 获取Map集合中所有的value,返回一个Collection
Set<Map.Entry<K,V>> entrySet();将Map集合转换为set集合

Map集合的遍历【重要】

  • 方式一:获取所有的key,通过遍历key,来获取所有的value
Map<Integer,String> map = new HashMap<>();map.put(1,"abc");map.put(2,"bwy");map.put(3,"ccc");//遍历map集合//获取所有的key 所有的key是一个set集合Set<Integer> set = map.keySet();//遍历key//方法1:迭代器Iterator it = set.iterator();while(it.hasNext()){Integer k = (Integer) it.next();String value = map.get(k);System.out.println(k+"="+value);}//方法2:foreachfor(Integer key:set){String value = map.get(key);System.out.println(key+"="+value);}

在这里插入图片描述

  • 方式二:Set<Map.Entry<K,V>> entrySet();【将map集合全部转换为set集合】
    在这里插入图片描述
 Map<Integer,String> map = new HashMap<>();map.put(1,"abc");map.put(2,"bwy");map.put(3,"abc");//遍历map集合//Set<Map.Entry<Integer, String>> set = map.entrySet();Set<Map.Entry<Integer, String>> set = map.entrySet();//foreach遍历for(Map.Entry<Integer,String> m : set){int k = m.getKey();String value = m.getValue();System.out.println("foreach遍历"+k+"="+value);}//迭代器遍历Iterator<Map.Entry<Integer, String>> it = set.iterator();while(it.hasNext()){Map.Entry<Integer, String> next = it.next();int k = next.getKey();String value = next.getValue();System.out.println("迭代器遍历"+k+"="+value);}

在这里插入图片描述

map.put(k,v)实现原理
第一步:先将k,v封装到Node对象当中
第二部:底层会调用hashCode()方法得出hash值,然后通过哈希函数,将哈希值转换为数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上了,如果下标对应的位置上有链表,此时会拿着k和链表上每一个结点中的k进行equals,如果所有的equals方法都是返回false,那么这个新节点将会被添加到链表的末尾,如果有其中一个返回true,那么这个节点的value将会被覆盖

v = map.get(k)实现原理
先调用k的hashCode()方法得出的哈希值,通过哈希算法转换成数组下标,通过数组下标快速定位到某个位置上,如果这个位置上什么也没有,返回null,如果这个节点上有单向链表,那么会拿着参数k和单向链表上每个结点的k进行equals,如果所有的equals方法都返回false,那么get方法返回null,只要其中一个结点的k和参数k equals的时候返回true,那么此时这个结点value就是我们要找的value,get方法最终返回这个value

为什么哈希表的随机增删,以及查询效率都很高
1、增删是在链表上完成的
2、查询不需要都扫描,只需要部分扫描

重点
HashMap集合的key会先后调用两个方法,一个方法是hashCode(),一个方法是equals(),那么这两个方法都需要重写。

在JDK8之后,如果哈希表单向链表中元素超过8个,单向链表这种数据结构就会变成红黑树数据结构,当红黑树上的节点小于6会重新变成单向链表

HashMap和Hashtable的区别
HashMap集合key部分允许为空,且只允许有一个。putVal()中有对null的处理
在这里插入图片描述
Hasttable集合key部分不允许为空,value也不允许为空。【空指针异常】

七、Properties

创建一个Properties对象

Properties pro = new Properties()

存:

pro.setProperty("username","root");
pro.setProperty("password","123456");

取:

pro.getPropertry(username);//root
pro.getPropertry(password);//123456

相关文章:

JavaSE之集合篇

文章目录前言一、集合概述集合继承结构图二、Collection接口中常用方法2.1Collection中存放什么元素&#xff1f;2.2常用方法2.3迭代器三、List接口中常用的方法四、ArrayList初始化容量及扩容五、Vector六、Map接口常用方法七、Properties前言 由于在刷题过程中&#xff0c;经…...

LeetCode分类刷题-----贪心算法

贪心算法贪心455.分发饼干376.摆动序列53.最大子序和122.买卖股票的最佳时机||55.跳跃游戏45.跳跃游戏||1005.K次取反后最大化的数组和134.加油站135.分发糖果860.柠檬水找零406.根据身高重建队列452.用最少数量的箭引爆气球![在这里插入图片描述](https://img-blog.csdnimg.cn…...

SiteWhere开源物联网平台支持意大利都灵智能计量

这篇简短的文章描述了一个基于 SiteWhere 开源物联网平台的智慧城市用例。 SiteWhere总部位于佐治亚州亚特兰大&#xff0c;是一个开源物联网应用程序支持平台 (AEP)&#xff0c;提供两种解决方案。首先&#xff0c;SiteWhere 的社区版 (CE) 是在 CPAL 许可下提供的。对于此解…...

【unity】rts engine 6 放置并建造建筑;

一 放置并建造建筑 GameManager -> Essential -> BuildingExtension 查看 building placement building position y offset Y轴偏移&#xff0c;建筑离地距离&#xff0c;可0.1 terrain max distance 放置建筑与允许地形的最大距离&#xff0c;可1 placable terrain …...

华为OD机试题 - 任务调度(JavaScript)| 含思路

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解: 任务调度题目输入输出描述示例一输入输出Code解题思路华为OD其…...

《Spring源码深度分析》第4章 自定义标签的解析

目录标题前言一、自定义标签使用二、自定义标签解析1、代码入口2、parseCustomElement【BeanDefinitionParserDelegate】2.1 resolve【DefaultNamespaceHandlerResolver】3、parse【NamespaceHandlerSupport】4、parse【AbstractBeanDefinitionParser】4.1 parseInternal【Abst…...

MATLAB绘制椭圆形相关系矩阵图

数据/代码准备 数据及代码下载&#xff1a; 下载专区-《MATLAB统计分析与应用&#xff1a;40个案例分析》程序与数据 绘图函数&#xff1a; matrixplot(data, PARAM1,val1, PARAM2,val2, ...) 案例 数据如下&#xff1a; MATLAB代码如下&#xff1a; clc close all clear …...

「SQL面试题库」 No_1 员工薪水中位数

&#x1f345; 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起&#xff0c;全员免费参与的SQL学习活动。我每天发布1道SQL面试真题&#xff0c;从简单到困难&#xff0c;涵盖所有SQL知识点&#xff0c;我敢保证只要做完这100道题&#xff0c;不仅能轻松搞定面试&#xff…...

Python机器学习17——极限学习机(ELM)

本系列基本不讲数学原理&#xff0c;只从代码角度去让读者们利用最简洁的Python代码实现机器学习方法。 背景&#xff1a; 极限学习机(ELM)也是学术界常用的一种机器学习算法&#xff0c;严格来说它应该属于神经网络&#xff0c;应该属于深度学习栏目&#xff0c;但是我这里把它…...

二分查找与判定树

二分查找的算法思想二分查找也称“折半查找”&#xff0c;要求查找表为采用顺序存储结构的有序表。本例一律采用升序排列。二分查找每一次都会比较给定值与序列[low,high]的中间元素&#xff0c;该元素的下标为mid (lowhigh)/2,若两者相等&#xff0c;则返回元素的下标为mid;如…...

反转链表(精美图示详解哦)

全文目录引言反转链表题目描述与思路实现总结引言 在学习了单链表的相关知识后&#xff0c;尝试实现一些题目可以帮助我们更好的理解单链表的结构以及对其的使用。 从这篇文章开始&#xff0c;将会介绍一些编程题来帮助我们更好的掌握单链表&#xff1a; 分别是反转链表、链表…...

深入理解多线程

一、线程基本概念 1、概述 线程是允许应用程序并发的一种机制。线程共享进程内的所有资源。 线程是调度的基本单位。 每个线程都有自己的 errno。 所有 pthread 函数均以返回 0 表示成功&#xff0c;返回一个正值表示失败。 编译 pthread 程序需要添加链接库&#xff08;…...

华为OD机试题 - 英文输入法(JavaScript)

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解: 英文输入法题目输入输出示例一输入输出说明示例一输入输出Code…...

64 云原生容器化

文章目录 一、什么是rancher二、为什么使用rancher三、 Rancher与[k8s](https://so.csdn.net/so/search?q=k8s&spm=1001.2101.3001.7020)的关系及区别1、Rancher具有的优势三、rancher安装1、细部介绍四、图形化操作1、执行2、图形化操作1、进行客户机登录rancher2、Ranch…...

IronXL for .NET 2023.2.5 Crack

关于适用于 .NET 的 IronXL 在 C# 中阅读和编辑 Excel 电子表格&#xff0c;无需 MS Office 或 Excel Interop。 IronXL for .NET 允许开发人员在 .NET 应用程序和网站中读取、生成和编辑 Excel&#xff08;和其他电子表格文件&#xff09;。您可以读取和编辑 XLS/XLSX/CSV/TS…...

计算机组成原理|第一章(笔记)

目录第一章 计算机系统概论1.1 计算机系统简介1.1.1 计算机的软硬件概念1.1.2 计算机系统的层次结构1.1.3 计算机组成和计算机体系结构1.2 计算机的基本组成1.2.1 冯 诺伊曼计算机的特点1.2.2 计算机的硬件框图1.2.3 计算机的工作过程1.3 计算机硬件的主要技术指标1.3.1 机器字…...

[ vulnhub靶机通关篇 ] Empire Breakout 通关详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

IP定位离线库有什么作用?

IP离线是什么意思&#xff1f;我们以丢失手机为例来寻找它&#xff0c;现在手机都有IP定位功能&#xff0c;只要手机开通了IP定位&#xff0c;就能找到手机。iPhone定位显示离线一般是iPhone手机关机了或者iPhone手机中“查找我的iPhone”功能关闭了。如果手机在手中的话可以打…...

[C++]vector模拟实现

目录 前言&#xff1a; 1. vector结构 2. 默认成员函数 2.1 构造函数 无参构造&#xff1a; 有参构造&#xff1a; 有参构造重载&#xff1a; 2.2 赋值运算符重载、拷贝构造&#xff08;难点&#xff09; 2.3 析构函数&#xff1a; 3. 扩容 3.1 reserve 3.2 resize…...

DevOps实战50讲-(2)Jenkins配置

1. Docker镜像方式安装拉取Jenkins镜像docker pull jenkins/jenkins编写docker-compose.ymlversion: "3.1" services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- 8080:8080- 50000:50000volumes:- ./data/:/var/jenkins_home/首次启动会因为数据…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...