Day29 集合的常用类

Day29 集合的常用类

文章目录

  • Day29 集合的常用类
    • 一、Collections
    • 二、 ConcurrentHashMap
    • 三、HashMap vs LinkedHashMap vs Hashtable vs ConcurrentHashMap
    • 四、LinkedHashMap
    • 五、Properties

一、Collections

1、概念:

java.util.Collections是Java集合框架中的一个实用类,提供了一系列静态方法,用于对集合进行各种操作,如排序、查找、同步等。

2、理解:集合的工具类,

3、功能:

  1. 集合排序
    • sort(List list):对列表进行排序,要求列表中的元素必须实现Comparable接口。
    • sort(List list, Comparator c):使用指定的比较器对列表进行排序。
  2. 查找和替换
    • binarySearch(List list, T key):对列表进行二分查找,要求列表已经按照自然顺序排序。
    • binarySearch(List list, T key, Comparator c):使用指定的比较器对列表进行二分查找。
    • replaceAll(List list, T oldVal, T newVal):将列表中所有等于oldVal的元素替换为newVal。
  3. 同步控制
    • synchronizedCollection(Collection c):返回指定集合的同步(线程安全)视图。
    • synchronizedList(List list):返回指定列表的同步(线程安全)视图。
    • synchronizedMap(Map m):返回指定映射的同步(线程安全)视图。
  4. 不可变集合
    • unmodifiableCollection(Collection c):返回指定集合的不可修改视图。
    • unmodifiableList(List list):返回指定列表的不可修改视图。
    • unmodifiableMap(Map m):返回指定映射的不可修改视图。
  5. 其他
    • reverse(List list):反转列表中元素的顺序。
    • shuffle(List list):随机重排列表中的元素。

4、举例:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();//批量添加Collections.addAll(list, 4,7,5,1,9,2,8,3,6);//获取最小值 -- 利用元素的内置比较器Integer min = Collections.min(list);System.out.println("获取最小值:" + min);//获取最大值 -- 利用元素的内置比较器Integer max = Collections.max(list);System.out.println("获取最大值:" + max);//排序 -- 利用元素的内置比较器Collections.sort(list);//查找 -- 使用二叉搜索算法,意味着在此调用之前必须排序int index = Collections.binarySearch(list, 9);System.out.println("查找到对应元素的下标:" + index);//排序 -- 利用外置比较器Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {//return o2-o1;return Integer.compare(o2, o1);}});//将list封装成线程安全的ListList<Integer> synchronizedList = Collections.synchronizedList(list);System.out.println(synchronizedList);}

二、 ConcurrentHashMap

1、概念:

ConcurrentHashMap是Java集合框架中的一个线程安全的哈希表实现类,用于在多线程环境下进行并发访问。与传统的HashMap相比,ConcurrentHashMap提供了更好的并发性能和线程安全性。

2、特点:(无序+key去重+线程安全)

  1. 线程安全ConcurrentHashMap内部使用分段锁(Segment)来保证线程安全,不会对整个数据结构加锁,不同段的数据可以并发访问。
  2. 高并发性:支持高并发的读操作和一定程度的并发写操作,适合在多线程环境下使用。
  3. 扩容机制:相较于传统的HashMapConcurrentHashMap的扩容机制更加高效,不会导致整个数据结构被锁定。
  4. 允许空键值:与HashMap类似,ConcurrentHashMap允许使用null作为键或值。

3、应用场景:

ConcurrentHashMap适用于需要在多线程环境下进行并发访问的场景,如并发编程、多线程数据共享等。它提供了高效的并发性能和线程安全的特性,可以减少在多线程环境下出现的竞态条件和线程安全问题。

4、基本用法:

ConcurrentHashMap<KeyType, ValueType> map = new ConcurrentHashMap<>();
// 添加元素
map.put(key1, value1);
map.put(key2, value2);
// 获取元素
ValueType value = map.get(key);
// 删除元素
map.remove(key);
// 遍历元素
for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {KeyType key = entry.getKey();ValueType value = entry.getValue();// 处理键值对
}

5、举例:

public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();//添加元素map.put("小希", 27);map.put("小空", 23);map.put("小丽", 28);map.put("小光", 36);map.put("小奈", 32);map.put("小阳", 28);map.put("小衣", 28);//将newMap中所有的元素添加到map集合中ConcurrentHashMap<String, Integer> newMap = new ConcurrentHashMap<>();newMap.put("aaa", 10);newMap.put("bbb", 20);newMap.put("ccc", 30);newMap.put("ddd", 40);map.putAll(newMap);//如果key存在就获取value值,如果不存在就添加Integer putIfAbsent = map.putIfAbsent("小希111", 28);System.out.println("putIfAbsent:" + putIfAbsent);//通过Key获取到对应的ValueInteger integer1 = map.get("小丽");System.out.println("通过Key获取对应的value:" + integer1);//28//通过Key获取对应的value,如果key不存在则返回默认值Integer integer2 = map.getOrDefault("小希111", 888);System.out.println("通过Key获取对应的value:" + integer2);//888//清空集合中的元素//map.clear();System.out.println("判断集合中是否有指定的key:" + map.containsKey("小希"));//trueSystem.out.println("判断集合中是否有指定的value:" + map.containsValue(27));//trueSystem.out.println("判断集合中是否没有元素:" + map.isEmpty());//false//通过key删除映射关系(key+value)map.remove("aaa");//通过key+value删除映射关系(key+value)map.remove("bbb", 20);//通过key替换valuemap.replace("小希", 30);//通过key+value替换valuemap.replace("小空", 23, 25);//获取映射关系的个数(映射关系内包含了key和value)int size = map.size();System.out.println("获取映射关系的个数:" + size);//10//获取map中所有的valueCollection<Integer> values = map.values();System.out.println(Arrays.toString(values.toArray()));//将集合转换为数组,再将数组转换为字符串System.out.println("-----------------------");//遍历 -- keySet()//思路:获取map集合中所有的key放在一个Set集合中,遍历Set集合获取出key,再通过key获取到Map集合中对应的valueSet<String> keySet = map.keySet();for (String key : keySet) {Integer value = map.get(key);System.out.println(key + " -- " + value);}System.out.println("-----------------------");//遍历 -- entrySet()//思路:获取map集合中所有的映射关系对象放在一个Set集合中,遍历Set集合获取出映射关系对象(Key+Value)Set<Entry<String,Integer>> entrySet = map.entrySet();for (Entry<String, Integer> entry : entrySet) {String key = entry.getKey();Integer value = entry.getValue();System.out.println(key + " -- " + value);}}

三、HashMap vs LinkedHashMap vs Hashtable vs ConcurrentHashMap

1、区别一:

区别一:存储null 键的情况

​ HashMap允许存储null键

HashMap<Object,Object> hashMap = new HashMap<>();hashMap.put(null, null);	

​ LinkedHashMap允许存储null键

		LinkedHashMap<Object,Object> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put(null, null);		

​ Hashtable不允许存储null键

Hashtable<Object, Object> hashtable = new Hashtable<>();hashtable.put(null, null);

​ ConcurrentHashMap不允许存储null键j

		ConcurrentHashMap<Object,Object> concurrentHashMap = new ConcurrentHashMap<>();concurrentHashMap.put(null, null);

2、区别二:
应用场景的区别
HashMap:无序+key去重
LinkedHashMap:有序+key去重
Hashtable:无序+key去重+线程安全(在方法上加锁,效率低,已弃用)
ConcurrentHashMap:无序+key去重+线程安全(局部加锁+CAS实现线程安全,效率高,多线程下使用ConcurrentHashMap)

四、LinkedHashMap

1、概念:

LinkedHashMap是Java集合框架中的一个实现类,它继承自HashMap,并且使用双向链表维护插入顺序或者访问顺序。与HashMap不同的是,LinkedHashMap可以保持元素的插入顺序或者访问顺序,因此在遍历时可以按照插入顺序或者访问顺序进行遍历。

2、特点:(有序+key去重)

  1. 保持顺序LinkedHashMap可以保持元素的插入顺序或者访问顺序,因此在遍历时可以按照插入顺序或者访问顺序进行遍历。
  2. 性能:与HashMap相比,LinkedHashMap在维护顺序的同时会略微降低插入、删除和查找的性能。
  3. 线程不安全LinkedHashMap不是线程安全的,如果需要在多线程环境中使用,需要进行适当的同步处理。

3、基本用法:( 注意:LinkedHashMap是HashMap的子类,HashMap如何使用,LinkedHashMap就怎么使用!!!)

// 创建一个按照插入顺序排序的LinkedHashMap
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
// 添加元素
linkedHashMap.put("A", 1);
linkedHashMap.put("B", 2);
linkedHashMap.put("C", 3);
// 遍历元素(按照插入顺序)
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());
}

4、举例:

public static void main(String[] args) {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();//添加元素map.put("小希", 27);map.put("小空", 23);map.put("小丽", 28);map.put("小光", 36);map.put("小奈", 32);map.put("小阳", 28);map.put("小衣", 28);//将newMap中所有的元素添加到map集合中LinkedHashMap<String, Integer> newMap = new LinkedHashMap<>();newMap.put("aaa", 10);newMap.put("bbb", 20);newMap.put("ccc", 30);newMap.put("ddd", 40);map.putAll(newMap);//如果key存在就获取value值,如果不存在就添加Integer putIfAbsent = map.putIfAbsent("小希111", 28);System.out.println("putIfAbsent:" + putIfAbsent);//通过Key获取到对应的ValueInteger integer1 = map.get("小丽");System.out.println("通过Key获取对应的value:" + integer1);//28//通过Key获取对应的value,如果key不存在则返回默认值Integer integer2 = map.getOrDefault("小希111", 888);System.out.println("通过Key获取对应的value:" + integer2);//888//清空集合中的元素//map.clear();System.out.println("判断集合中是否有指定的key:" + map.containsKey("小希"));//trueSystem.out.println("判断集合中是否有指定的value:" + map.containsValue(27));//trueSystem.out.println("判断集合中是否没有元素:" + map.isEmpty());//false//通过key删除映射关系(key+value)map.remove("aaa");//通过key+value删除映射关系(key+value)map.remove("bbb", 20);//通过key替换valuemap.replace("小希", 30);//通过key+value替换valuemap.replace("小空", 23, 25);//获取映射关系的个数(映射关系内包含了key和value)int size = map.size();System.out.println("获取映射关系的个数:" + size);//10//获取map中所有的valueCollection<Integer> values = map.values();System.out.println(Arrays.toString(values.toArray()));//将集合转换为数组,再将数组转换为字符串System.out.println("-----------------------");//遍历 -- keySet()//思路:获取map集合中所有的key放在一个Set集合中,遍历Set集合获取出key,再通过key获取到Map集合中对应的valueSet<String> keySet = map.keySet();for (String key : keySet) {Integer value = map.get(key);System.out.println(key + " -- " + value);}System.out.println("-----------------------");//遍历 -- entrySet()//思路:获取map集合中所有的映射关系对象放在一个Set集合中,遍历Set集合获取出映射关系对象(Key+Value)Set<Entry<String,Integer>> entrySet = map.entrySet();for (Entry<String, Integer> entry : entrySet) {String key = entry.getKey();Integer value = entry.getValue();System.out.println(key + " -- " + value);}}

五、Properties

1、概念:

Properties是Java中用于处理属性文件的一个类,它继承自Hashtable,并且通常用于处理应用程序的配置信息,如键值对形式的配置文件。Properties类提供了读取和写入属性文件的方法,以及方便的操作属性的功能。

2、应用场景:配置文件

3、主要特点和用法:

  1. 读取属性文件

    • 使用load(InputStream in)方法可以从输入流中加载属性文件。
    Properties prop = new Properties();
    prop.load(new FileInputStream("config.properties"));
    
  2. 获取属性值

    • 使用getProperty(String key)方法可以获取指定键对应的值。
    String value = prop.getProperty("key");
    
  3. 设置属性值

    • 使用setProperty(String key, String value)方法可以设置指定键对应的值。
    prop.setProperty("key", "value");
    
  4. 持久化属性文件

    • 使用store(OutputStream out, String comments)方法可以将属性存储到输出流中。
    prop.store(new FileOutputStream("config.properties"), "This is a properties file.");
    
  5. 默认值

    • 可以使用getProperty(String key, String defaultValue)方法获取属性值,如果属性不存在则返回默认值。

4、代码理解:

public static void main(String[] args) throws IOException {//创建配置文件对象Properties p = new Properties();/** 将配置文件加载到配置文件对象中* * 底层实现:* 		1.将配置文件中的数据读取出* 		2.将键值对写入父类对象(Hashtable) -- super.put(key,value)*/p.load(Test01.class.getClassLoader().getResourceAsStream("dbconfig.properties"));//获取配置文件里的数据//底层实现:利用父类对象(Hashtable).get(key) String username = p.getProperty("username");String password = p.getProperty("password");System.out.println(username + " -- " + password);//注意1:如果key不存在,返回的为nullString name = p.getProperty("name");System.out.println(name);//注意2:如果key不存在,就返回默认值String url = p.getProperty("url", "默认值");System.out.println(url);//将键值对写入到父类对象中(Hashtable),并不是写入配置文件中p.setProperty("author", "何老师");String author = p.getProperty("author");System.out.println(author);}

集合框架图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用C++ 20协程实现Raft共识算法

本文描述了如何在不使用任何额外库的情况下在c 20中实现Raft Server共识模块。文章分为三个主要部分: Raft算法的全面概述关于Raft服务器开发的详细说明对基于协程的自定义网络库的描述 该实现利用了C 20的强大功能&#xff0c;特别是协同程序&#xff0c;为构建分布式系统的…

RecyclerView 调用 notifyItemInserted 自动滚动到底部的问题

项目中发现一个奇怪的现象 RecyclerView 加载完数据以后&#xff0c;调用 notifyItemInserted 方法&#xff0c;RecyclerView 会滑动到底部。 简化后的效果图&#xff1a; 因为这个 RecyclerView 的适配器有一个 FootViewHolder&#xff0c;所以怀疑是 FootViewHolder 的问题…

车载以太网AVB交换机 gptp透明时钟 5口 全千兆 SW1500

全千兆车载以太网交换机 一、产品简要分析 5端口千兆车载以太网交换机&#xff0c;包含4个通道的1000BASE-T1接口使用罗森博格H-MTD和泰科MATEnet双接口&#xff0c;1个通道1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现车载以太网多通道交换&#xff0c;千兆和百兆车载…

GPT-1原理-Improving Language Understanding by Generative Pre-Training

文章目录 前言提出动机模型猜想模型提出模型结构模型参数 模型预训练训练的目标训练方式训练参数预训练数据集预训练疑问点 模型微调模型输入范式模型训练微调建议微调疑问点 实验结果分析 前言 首先想感慨一波 这是当下最流行的大模型的的开篇之作&#xff0c;由OpenAI提出。…

蓝桥杯-卡片换位

solution 有一个测试点没有空格&#xff0c;要特别处理&#xff0c;否则会有一个测试点运行错误&#xff01; 还有输入数据的规模在变&#xff0c;小心顺手敲错了边界条件 #include<iostream> #include<string> #include<queue> #include<map> #incl…

持续集成流程主要系统构成介绍(CI)

目录 一、概述 二、版本控制系统 2.1 概述 2.2 版本控制系统使用流程示意图 2.3 版本控制软件划分 2.3.1 集中式版本控制软件 2.3.2 分布式版本控制软件 2.3.3 总结 2.4 常用版本控制软件介绍 三、编译构建系统 3.1 概述 3.2 编译构建流程示意图 3.3 列举Java 源码…

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

回文数个数-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第43讲。 回文数个数&#…

macOS Sonoma如何查看隐藏文件

在使用Git进行项目版本控制时&#xff0c;我们可能会遇到一些隐藏文件&#xff0c;比如.gitkeep文件。它通常出现在Git项目的子目录中&#xff0c;主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时&#xff0c;使用Terminal命令来显示隐藏文件 default…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深&#xff0c;制药行业作为国民经济的重要支柱之一&#xff0c;也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来&#xff0c;制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

C# OpenCv Haar、LBP 人脸检测

目录 效果 代码 下载 效果 代码 using OpenCvSharp;namespace OPenCVDemo {class Program{static void Main(string[] args){// Load the cascadesvar haarCascade new CascadeClassifier("haarcascade_frontalface_default.xml");var lbpCascade new Casca…

CSS(六)

一、精灵图 1.1 为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效…

国外的Java面试题和国内的相比谁更卷

前言 有很多朋友很好奇国外的Java面试题长啥样&#xff0c;今天我们就去找5道国外的面试来和国内的对比一下看看谁难一些&#xff01; 面试题分享 1. Is Java Platform Independent if then how?&#xff08; Java平台是独立的吗&#xff1f;&#xff09; Yes, Java is a…

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写&#xff0c;发表于2002年。研究团队通过第一性原理计算&#xff0c;探讨了位错对氮化镓&#xff08;GaN&#xff09;电子能量损失谱&#xff08;EEL&#xff09;…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

librdkafka的简单使用

文章目录 摘要kafka是什么安装环境librdkafka的简单使用生产者消费者 摘要 本文是Getting Started with Apache Kafka and C/C的中文版&#xff0c; kafka的hello world程序。 本文完整代码见仓库&#xff0c;这里只列出producer/consumer的代码 kafka是什么 本节来源&#…

Python图像处理——计算机视觉中常用的图像预处理

概述 在计算机视觉项目中&#xff0c;使用样本时经常会遇到图像样本不统一的问题&#xff0c;比如图像质量&#xff0c;并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前&#xff0c;通常需要对图像进行预处理&#xff0c;以确保获得最佳的结果。图像预处理…

StarRocks实战——多点大数据数仓构建

目录 前言 一、背景介绍 二、原有架构的痛点 2.1 技术成本 2.2 开发成本 2.2.1 离线 T1 更新的分析场景 2.2.2 实时更新分析场景 2.2.3 固定维度分析场景 2.2.4 运维成本 三、选择StarRocks的原因 3.1 引擎收敛 3.2 “大宽表”模型替换 3.3 简化Lambda架构 3.4 模…

jmeter总结之:Regular Expression Extractor元件

Regular Expression Extractor是一个后处理器元件&#xff0c;使用正则从服务器的响应中提取数据&#xff0c;并将这些数据保存到JMeter变量中&#xff0c;以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…

Git,GitHub,Gitee,GitLab 四者有什么区别?

目录 1. Git 2. GitHub 3. Gitee 4. GitLab 5. 总结概括 1. Git Git 是一个版本管理工具&#xff0c;常应用于本地代码的管理&#xff0c;下载完毕之后&#xff0c;我们可以使用此工具对本地的资料&#xff0c;代码进行版本管理。 下载链接&#xff1a; Git - Downlo…