【JAVA】集合与背后的逻辑框架,包装类,List,Map,Set,静态内部类
❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:
文章目录
- collection
- Collection创建
- collection使用泛型
- collection方法
- Map 接口
- Map的存储结构
- HashMap和TreeMap的有序和无序
- 包装类
- 装箱与拆箱(装包与拆包)
- LIst
- List使用
- List的多种输出方式
- 直接通过字符串输出
- 通过for循环打印
- 通过foreach输出
- 通过迭代器打印
- List的API
- add
- 通过增加一个参数index的add方法
- 把一个 List 放在另一个 List 后面
- 删除某个值
- 获取某个下标的值
- 更改某个位置的值
- 清空List
- Map的API
- put
- get
- getOrDefault
- remove
- Set的API
- set 自动去重
- contains是否包含
- remove删除
- isEmpty()判空
- clear()清空
- 静态内部类
collection
Collection 接口,在 Java 当中,Collection 也是重要的数据结构。
Collection创建
在创建 Collection 的时候,要通过 new 关键字来使用。但是查看 Collection 源码的时候,发现 Collecting 是一个接口:
**因为接口是不能实例化的,所以 new 的时候,要用一个具体的类。**这里用ArrayList来举例:
Collection collection = new ArrayList();
collection使用泛型
使用泛型就是加上 <> 里面写元素类型,要注意的是,这里的类型全是包装类。字符串的包装类是:String 整形的包装类是:Integer 。写了包装类的话,add 的时候就只能添加这一类型:
public static void main(String[] args) {Collection<String> collection = new ArrayList<String>();collection.add("hello");collection.add("word");System.out.println(collection);
}
Collection 后面的 String 可以不写,因为不写的话,编译器会通过前面的 String 来推导出相应的类型。如果这里 add 非字符类型的话,就会报错。运行结果如下:
collection方法
Collection 里面有很多自带的方法:
使用代码测试:
public static void main(String[] args) {Collection<String> collection = new ArrayList<>();collection.add("hello");collection.add("word");System.out.println(collection);System.out.println(collection.size());System.out.println(collection.isEmpty());collection.remove("word");System.out.println(collection);Object[] objects = collection.toArray();System.out.println(Arrays.toString(objects));System.out.println(objects);
}
Map 接口
Map 是在 util 包下的接口。Map 有两个参数 <key,val> ,而且这两个参数必须是字符串。实现 Map 的方法 有HashMap 和 TreeMap 。Map 的基本功能如下
public static void main(String[] args) {Map<String,String> map = new HashMap<>();map.put("Lockey","鲁班锁");map.put("及时雨","宋江");String ret = map.get("及时雨");String tmp = map.getOrDefault("及时雨1","FM850");System.out.println(ret);System.out.println(tmp);boolean flag = map.containsKey("Lockey");System.out.println(flag);
}
Map的存储结构
- map在存储的时候,并不是顺序存储的,而是通过映射去存储的。代码示例:
public static void main(String[] args) {Map<String,String> map = new HashMap<>();map.put("及时雨","宋江");map.put("Lockey","鲁班锁");System.out.println(map);
}
先输出 “Lockey” 然后才是 “及时雨” 。
HashMap和TreeMap的有序和无序
- HashMap存储的时候是根据key值排序的,是有序的。
- TreeMap放入的时候没有进行比较,没有排序。
public static void main(String[] args) {Map<Integer,String> map = new HashMap<>();map.put(10,"宋江");map.put(3,"鲁班锁");System.out.println(map);Map<String,String> map2 = new HashMap<>();map2.put("efg","宋江");map2.put("abc","鲁班锁");System.out.println(map2);Map<String,String> map3 = new TreeMap<>();map3.put("及时雨","宋江");map3.put("国民女神","鲁班锁");System.out.println(map3);Map<String,String> map4 = new HashMap<>();map4.put("及时雨","宋江");map4.put("国民女神","鲁班锁");System.out.println(map4);
}
包装类
包装类是根据基本类型出现的,八大基本类型对应着八种包装类:
要注意的是:String 不是包装类。**包装类的好处在于:可以完成对数据的操作。**例如:把字符串变为整形:
public static void main(String[] args) {String str = "123";int ret = Integer.valueOf(str);System.out.println(ret+1);
}
装箱与拆箱(装包与拆包)
装箱:把简单数据类型变为包装类类型
拆箱:把包装类类型变为简单数据类型
代码示例,这里是隐式的:
public static void main(String[] args) {//装箱Integer a = 123;//拆箱int b = a;//隐式的:因为把 Integer 变为 int 了System.out.println(a+" "+b);
}
下面我们通过 powershell 窗口来看编译的过程:
可以看到,画圈的部分就是两次过程。第一次是通过 Integer 的 valueOf 来把 123 变成 Integer 类。第二次则是通过 Integer 的 intValue 来变成 int 类型。下面的就是字符串的拼接了。
显式拆包:
通过直接将方法写出来,一看就明白了的方法就是显式的:
public static void main(String[] args) {//这里就是显式的装包Integer a2 = Integer.valueOf(123);Integer a3 = new Integer(123);//显式的拆包int b2 = a2.intValue();double d = a2.doubleValue();
}
LIst
List使用
在使用 List 的时候,后面括号可以加参数,也可以不加参数,加的参数是表示容量大小:
public static void main(String[] args) {List<String> list1 = new ArrayList<>(20);List<String> list2 = new ArrayList<>();
}
List 是一个很大的类,这里用它下层的 ArrayList :
public static void main(String[] args) {ArrayList<String> list2 = new ArrayList<>();list2.add("hello");list2.add("word");list2.add("123");System.out.println(list2);ArrayList<String> list3 = new ArrayList<>(list2);System.out.println(list3);
}
可以使用另外一个 Array List 对 list 初始化:这里的 list3 就是用 list2 来进行初始化。
List的多种输出方式
直接通过字符串输出
public static void main(String[] args) {ArrayList<String> list2 = new ArrayList<>();list2.add("hello");list2.add("word");list2.add("123");System.out.println(list2);
}
通过for循环打印
- 用size()获取长度,用add()添加,用get(int)获取
public static void main(String[] args) {ArrayList<String> list2 = new ArrayList<>();list2.add("hello");list2.add("word");list2.add("123");for (int i = 0; i < list2.size(); i++){System.out.println(list2.get(i));}
}
通过foreach输出
public static void main(String[] args) {ArrayList<String> list2 = new ArrayList<>();list2.add("hello");list2.add("word");list2.add("123");for (String s:list2) {System.out.println(s);}
}
通过迭代器打印
- 通过使用List的方法:iterator()来完成输出
public static void main(String[] args) {ArrayList<String> list2 = new ArrayList<>();list2.add("hello");list2.add("word");list2.add("123");System.out.println("迭代器打印");Iterator<String> i = list2.iterator();while (i.hasNext()) {System.out.println(i.next());}
}
List的API
add
List 当中的 add 方法,默认是放在最后一个位置的:
public static void main(String[] args) {//add 方法 默认是放到数组的最后一个位置的ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");System.out.println(list);
}
通过增加一个参数index的add方法
通过在 add 方法放第一次参数,将元素放到某个位置下面:
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");System.out.println(list);list.add(0,"Lockey");System.out.println(list);
}
把一个 List 放在另一个 List 后面
通过 List 的方法 addALL 来完成,代码如下:
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");System.out.println(list);ArrayList<String> list1 = new ArrayList<>();list1.add("qwe");list1.add("rty");list1.addAll(list);System.out.println(list1);
}
删除某个值
通过 remove 方法来完成删除:
public static void main9(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");System.out.println(list);boolean flag = list.remove("a");System.out.println(flag);System.out.println(list);
}
获取某个下标的值
通过 get 方法来完成获取:
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");String ret = list.get(1);System.out.println(ret);
}
更改某个位置的值
通过 set 方法来完成:
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.set(1,"d");System.out.println(list);
}
清空List
通过 clear 方法来完成:
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.clear();System.out.println(list);
}
Map的API
map 和 set 是一种专门用来搜索和查询的容器或数据结构,效率很高。是为了解决在 “增删查改” 情况下使用的数据结构。
HashMap 在存储元素的时候,是根据一个函数进行存储的,具体存储到哪里,由函数来确定。这个函数就是哈希函数。所以输出的时候,并不是按照存储顺序进行输出的。Map是一个接口类,没有继承自Collection,类中存储的是 <K,V> 结构的键值对,并且 K 一定是唯一的,不能重复。在遇到相同的 K 的时候,V 是可以改变的。
put
在 map 当中,put 是放入元素的意思,有两个参数,第一个是 key ,第二个是 value ,代码如下:
public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("abc",3);map.put("word",2);map.put("hello",4);System.out.println(map);
}
输出的时候按照key值从大到小输出。
put 如果存储元素的时候,如果 key 值相同的话,val 值会覆盖。代码如下:
public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("abc",3);map.put("word",2);map.put("hello",4);map.put("abc",5);System.out.println(map);
}
get
使用 get 通过 key 来获取对应的 value 的值。代码如下:
public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("abc",3);map.put("word",2);map.put("hello",4);int ret = map.get("abc");System.out.println(ret);
}
getOrDefault
getOrDefault 方法有两个参数,一个是 key ,如果没有 key 的话,就返回设置的默认值。如果有 key 的话,就返回 key 的 value 。代码如下:
public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("abc",3);map.put("word",2);map.put("hello",4);System.out.println(map.getOrDefault("abc",98));
}
因为 abc 存在,所以返回 abc 的 value 。就是 3 。
remove
remove 方法有一个参数,参数是输入的 key ,返回对应的 value 。如果没有 key 的话,就返回 null 。代码如下:
public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("abc",3);map.put("word",2);map.put("hello",4);Integer ret2 = map.remove("abc");System.out.println(ret2);
}
Set的API
set 是一个集合,存入里面的数据会自动去重。Set 是继承自 Collection 的接口类,Set 中只存储了 Key 。
set 自动去重
放入 set 的数据会自动去重,代码如下:
public static void main4(String[] args) {Set<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(3);set.add(1);System.out.println(set);
}
contains是否包含
remove删除
isEmpty()判空
clear()清空
静态内部类
1.外部类可通过内部类的对象调用内部类的私有成员变量或方法。
2.静态内部类访问外部类的静态成员变量或方法必须是静态的。
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章
相关文章:

【JAVA】集合与背后的逻辑框架,包装类,List,Map,Set,静态内部类
❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 collectionCollection创建collection使用泛型collection方法 Map 接口Map的存储结构HashMap和Tr…...

mac电脑版数字图像处理软件:ACDSee Photo Studio 9最新 for Mac
ACDSee Photo Studio 9是一款由ACD Systems开发的功能强大的照片管理和编辑软件,专为Mac用户提供一站式解决方案,方便用户轻松浏览、管理和编辑照片。该软件提供了许多实用的工具和功能,包括高效的导入和排序工具、强大的编辑工具、智能组织和…...

酷开系统 | 酷开科技让你放肆嗨唱,聆听内心最真实的声音
在这个喧嚣的城市里,每个人都像是一座孤岛,漂浮在茫茫人海之中,我们总是忙于奔波在各种琐事之间,渐渐忘记了内心深处的声音,我们压抑自己的情感,害怕被误解、被批评,然而真正的我们,…...

PC电脑 VMware安装的linux CentOs7如何扩容磁盘?
一、VM中进行扩容设置 必须要关闭当前CentOS,不然扩展按钮是灰色的。 输入值必须大于当前磁盘容量。然后点击扩展,等待扩展完成会提示一个弹框,点击确定,继续确定。 二、操作CentOS扩容——磁盘分区 第一步设置完成。那就启动 …...
redis极速的奥秘
文章目录 1.基于内存存储实现2.高效的数据结构3.合理的数据编码4.合理的线程模型5. 虚拟内存机制实现原理 1.基于内存存储实现 内存读写是比在磁盘快很多的,Redis 基于内存存储实现的数据库,相对于数据存在磁盘的 MySQL 数据库,省去磁盘 I/O…...
three.js之初识three.js
什么是three.js Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装) 什么是WebGL? WebGL(英语:Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和Open…...

二维码智慧门牌管理系统:地址管理的现代革命
文章目录 前言一、标准地址的革新二、广泛的应用前景 前言 在科技不断发展和社会进步的背景下,高效、精准、智能的管理系统已经成为当今社会的迫切需求。传统的门牌管理系统在应对这一需求方面已显得力不从心,因此,二维码智慧门牌管理系统的…...

BricsCAD 23 for Mac:轻松驾驭CAD建模的强大工具
如果你正在寻找一款功能强大、操作简便的CAD建模软件,那么BricsCAD 23 for Mac绝对值得你考虑。这款软件将为你提供一套完整的2D和3D设计解决方案,让你在Mac上轻松创建、编辑和修改图形。 一、BricsCAD 23的功能特点 高效的2D和3D建模:Bric…...

如何利用Web应用防火墙应对未知威胁
网络安全是一个永恒的话题,尤其是在未知威胁不断涌现的情况下。Web应用防火墙(WAF)是企业网络安全防线的重要组成部分,能够帮助企业在面对未知威胁时采取有效的防护措施。本文将探讨如何利用Web应用防火墙应对未知的网络威胁。 一…...

四、多线程服务器
1.进程的缺陷和线程的优点 1.进程的缺陷 创建进程(复制)的工作本身会给操作系统带来相当沉重的负担。 而且,每个进程具有独立的内存空间,所以进程间通信的实现难度也会随之提高。 同时,上下文切换(Cont…...

基于vue实现滑块动画效果
主要实现:通过鼠标移移动、触摸元素、鼠标释放、离开元素事件来进行触发 创建了一个滑动盒子,其中包含一个滑块图片。通过鼠标按下或触摸开始事件,开始跟踪滑块的位置和鼠标/触摸位置之间的偏移量。然后,通过计算偏移量和起始时的…...

探寻蓝牙的未来:从蓝牙1.0到蓝牙5.4,如何引领无线连接革命?
►►►蓝牙名字的来源 这要源于一个小故事,公元940-985年,哈洛德布美塔特(Harald Blatand),后人称Harald Bluetooth,统一了整个丹麦。他的名字“Blatand”可能取自两个古老的丹麦词语。“bla”意思是黑皮肤的,而“tan…...

openssl 之 RSA加密数据设置OAEP SHA256填充方式
背景 如题 环境 openssl 1.1.1l c centos7.9 代码 /** 思路:填充方式自己写,不需要使用库提供的,然后加密时选择不填充的方式加密 关键代码 */ int padding_result RSA_padding_add_PKCS1_OAEP_mgf1(buf, padding_len, (unsigned char*…...
js将带标签的内容转为纯文本
背景:现需要将富文本的所有 html 标签全部删除得到纯文本 思路:创建临时DOM元素并获取其中的文本 创建一个临时 DOM 并给他赋值,然后我们使用 DOM 对象方法提取文本。 代码如下: convertToPlain( html){//新创建一个 divvar di…...

如何通过内网穿透实现远程连接NAS群晖drive并挂载电脑硬盘?
文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...
4.2 抽象类
1. 抽象类概念 定义一个类时,常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如,Animal类中的shout()方法用于描述动物的叫声,但是不同的动物,叫声也不相同,因此…...

ITextRenderer将PDF转换为HTML详细教程
引入依赖 <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.18</version></dependency> 问题一:输出中文字体 下载字体simsun.ttc 下载链接&am…...

c#设计模式-行为型模式 之 备忘录模式
🚀简介 备忘录模式(Memento Pattern)是一种行为型设计模式,它保存一个对象的某个状态,以便在适当的时候恢复对象。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象…...

ffmpeg+安卓+yolo+RK3399部署
一次满足多项需求. 首先, 思路是, 使用ffmpeg解码本地mp4文件, 在无需任何其他改动的情况下, 就可以直接播放rtsp流, 这个是使用ffmpeg的好处. ffmpeg本身是c语言的, 所以需要编译成jni的库, https://note.youdao.com/s/6XeYftc 具体过程在这里, 用windows/macOS, Ubuntu应该都…...

发电机教程:小白必学的柴油发电机技巧
柴油发电机监控是关键的能源管理和维护工具,它用于确保持续的电力供应,提高能源效率,并延长发电机的寿命。 随着科技的不断发展,监控系统变得更加智能和高效,使用户能够远程监测和管理柴油发电机的运行状态。 客户案例…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...