java中常用集合(边补充)

java中开发常用集合(边补充)

  • 一、单列集合Collection
    • 1.1List接口
      • 1.1.1 ArrayList
      • 1.1.2 LinkedList
      • 1.1.3 Vector(线程安全)
      • 1.1.4 CopyOnWriteArrayList(线程安全)
    • 1.2 Set接口
      • 1.2.1 HashSet
      • 1.2.2 LinkedHashSet
      • 1.2.3 CopyOnWriteArraySet
  • 二、双列集合Map
    • 2.1 hashMap
    • 2.2 hashTable(线程安全)
    • 2.3 LinkedHashMap
    • 2.4 ConcurrentHashMap(线程安全)
    • 2.5 TreeMap

一、单列集合Collection

主要使用的是List和Set集合

1.1List接口

主要包括ArrayList、LinkedList、Vector(线程安全)、CopyOnWriteArrayList(线程安全)

1.1.1 ArrayList

ArrayList是线程不安全的,底层数据结构是可变数组,查询快,增删慢。
如果有参数扩容1.5倍;如果没参数第一次扩容为10,第二次满了扩容为1.5倍 扩容使用的是Arrays.copyOf()

1.1.2 LinkedList

LinkedList底层维护了一个双向链表,没有实现同步是线程不安全的底层数据结构是链表,查询慢,增删快。

1.1.3 Vector(线程安全)

Vector是线程同步的,即线程安全的,该类方法带有synchronized,类似ArrayList,效率不如ArrayList
如果是无参 第一次扩容为10,第二次满了扩容为2倍;如果指定大小,则每次按照两倍扩容
Stack继承Vector,也是线程安全的,支持push、pop、peek等操作

1.1.4 CopyOnWriteArrayList(线程安全)

(1)首先CopyOnWriteArrayList内部也是通过数组来实现的,在向CopyOnWriteArrayList中添加元素时,会复制一个新的数组,写操作在新数组上进行,读操作在原数组上进行
(2)并且,写操作会加锁,防止出现并发写入丢失数据的问题
(3)写操作结束后会把原数组指向新数组
(4)CopyOnWriteArrayList允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,但是CopyOnWriteArrayList会比较占用内存,同时可能读到的数据不是实时最新的数据,所以不适合实时性要求很高的场景

应用场景 (1)读多写少的场景:CopyOnWriteArrayList的读操作不需要加锁,因此非常适合在读多写少的场景中使用
(2)不需要实时更新的数据:CopyOnWriteArrayList读取的数据可能不是最新的,因此他适合于不需要实时更新的数据

1.2 Set接口

主要包括HashSet、LinkedHashSet、CopyOnWriteArraySet
主要特点:
1)无序(添加和取出的顺序不一致),取出的顺序虽然不是添加的顺序,但是它的顺序是固定的。
2)不允许有重复元素;可以存放null,最多包含一个null,重复add返回false
3)没有索引,故不能使用索引的方法来获取元素

1.2.1 HashSet

实现了set接口,本质上底层是一个HashMap
主要是hashCode和equals方法

HashSet底层数据结构是哈希表,因此具有很好的存取和查找性能。
哈希表:一个元素为链表的数组,综合了链表(存储速度快)和数组(查询速度快)的优点。
1)使用HashSet添加一个元素时,会先得到hash值,然后转成—>索引值
2)找到存储数据表table,看这个索引位置是否已经存放的有元素。
3)没有则直接加入,如果有,则调用equals方法进行比较
4)在Java8中,如果一条链表的元素个数达到TREEIFY_THRESHOLD (默认是8),并且table的大小 >= MIN_TREEIFY_CAPACITY (默认是64),就会进行树化(红黑树),这样又大大提高了查找的效率。

1.2.2 LinkedHashSet

1)在LinkedHashSet中维护了一个hash表和双向链表(LinkedHashSet有head和tail)
2)每一个节点有before和after属性,这样可以形成双向链表
3)在添加一个元素时,先求hash值,再求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表
4)遍历LinkedHashSet,插入顺序和遍历顺序一致

1.2.3 CopyOnWriteArraySet

每次调用CopyOnWriteArraySet的add方法的时候,其底层是基于CopyOnWriteArrayList的addIfAbsent方法的,
每次在addIfAbsent方法中都要对数组进行遍历,所以CopyOnWriteArraySet的性能低于CopyOnWriteArrayList

public class CopyOnWriteArraySet<E> extends AbstractSet<E>
//CopyOnWriteArraySet底层是基于CopyOnWriteArrayList的private final CopyOnWriteArrayList<E> al;
//add方法底层调用的还是CopyOnWriteArrayList的addIfAbsent方法public boolean add(E e) {return al.addIfAbsent(e);}

二、双列集合Map

特点:

键值对映射关系

一个键对应一个值

键不能重复,值可以重复

元素存取无序

集合的遍历(待补充代码)

方法一:
1. 获取所有键的集合。用keySet()方法实现
2. 遍历键的集合,获取到每一个键。用增强for实现  
3. 根据键去找值。用get(Object key)方法实现方法二:
1. 获取所有键值对对象的集合:Set<Map.Entry<K,V>> entrySet()
2. 遍历键值对对象的集合,得到每一个键值对对象:用增强for实现,得到每一个Map.Entry
3. 根据键值对对象获取键和值:用getKey()得到键;用getValue()得到值

2.1 hashMap

HashMap首先还是会创建一个默认长度为16,默认加载因子为0.75的数组;
然后再利用put方式,就可以添加数据了,put方法的底层会先创建一个Entry对象,Entry对象里面记录的就是要添加的键和值,然后利用键来计算哈希值,跟值无关,然后再计算出元素在数组中应存储的位置的索引,如果该位置为null,直接添加,如果该位置不为null,它会调用equals方法比较键的属性值,如果键的值相同,那么元素就会被覆盖;如果比较完后不一样,则会添加新的Entry对象;
JDK8,如果计算出来的索引相同,且键不一致,那么就会直接挂在当前值的下面;
此外,当链表长度超过8,且数组长度大于等于64的时候,链表就会自动转成红黑树
如果键存储的是自定义对象需要重写hashCode和equals方法,值存储不需要重写

2.2 hashTable(线程安全)

HashTable线程安全 (他的每一个方法都加了锁,适用于多线程并发的环境)
HashTable默认的初始大小为11 每次扩充为2n+1 加载因子0.75

2.3 LinkedHashMap

双向链表
由键决定:
有序、不重复、无素引。
有序:保证存储和取出的顺序一致
原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序

2.4 ConcurrentHashMap(线程安全)

可以理解为hashMap的升级版本,在ConcurrentHashMap中,无论是读操作还是写操作都能保证很高的性能:在进行读操作时(几乎)不需要加锁,而在写操作时通过锁分段技术只对所操作的段加锁而不影响客户端对其它段的访问。特别地,在理想状态下,ConcurrentHashMap 可以支持 16 个线程执行并发写操作(如果并发级别设为16),及任意数量线程的读操作。
通过锁分段技术保证并发环境下的写操作;
通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;
通过不加锁和加锁两种方案控制跨段操作的的安全性。

2.5 TreeMap

TreeMap底层是红黑树结构 增删改查性能较好
不重复 无索引 可排序
依赖自然排序或者比较器排序,对键进行排序
如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则

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

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

相关文章

用户订单管理API:轻松管理,购物无忧

在当今数字化时代&#xff0c;电子商务已经成为人们购物的首选方式。与传统的实体店相比&#xff0c;电商的优势在于便捷、快速、多样化等特点&#xff0c;使得更多的消费者选择了通过网络购物。而作为电商平台&#xff0c;如何提供更好的购物体验&#xff0c;是每个平台都需要…

企业工程项目管理系统源码:Java版源码解析

一、项目概述 鸿鹄工程项目管理系统是基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;采用前后端分离架构构建的工程管理软件。它旨在应对企业快速发展中的管理挑战&#xff0c;提升工程管理效率&#xff0c;减轻工作负担&#xff0c;加速信息处理…

一次关于k8s的node节点NotReady的故障排查

master现象 分析 kubectl get nodes -A 看了下pod的状态&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址&#xff0c;登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务&#xff…

基于SpringBoot的藏区特产销售平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架 工具&#xff1a; MyEclipse 系统展示 首页 个人中心 特产信息管理 订单管…

华宽通中标长沙市政务共性能力建设项目,助力智慧政务建设新飞跃

在数字化浪潮的推动下&#xff0c;长沙市政府正积极拥抱智慧城市建设&#xff0c;以科技力量提升政务服务效能。华宽通凭借其卓越的技术实力与丰富的项目经验&#xff0c;成功中标长沙市政务共性能力建设项目&#xff0c;这无疑是对华宽通在智慧城市领域实力的高度认可。 华宽…

huggingface_hub 设置国内镜像

要设置HuggingFace Hub的国内镜像&#xff0c;你可以按照以下步骤进行操作&#xff0c;以确保从国内镜像站点下载Hugging Face模型和数据集。 1. 安装依赖 首先&#xff0c;确保你已经安装了huggingface_hub库。如果没有&#xff0c;可以通过pip进行安装&#xff1a; bash复制…

背部筋膜炎最有效的治疗方法

背部筋膜炎的引起原因可以归结为多个方面&#xff0c;以下是详细的分点表示和归纳&#xff1a; 1、慢性劳损&#xff1a;长时间使用背部&#xff0c;如经常按摩背部&#xff0c;会导致筋膜老化、发炎&#xff0c;进而引发背部筋膜炎。症状可能包括背部疼痛、痉挛、肌肉无力感等…

Python 判断for循环最后一次的6种方法

在Python中&#xff0c;通常我们不会直接判断for循环是否正在执行最后一次迭代&#xff0c;因为Python的for循环是基于可迭代对象的&#xff0c;它不知道也不关心迭代的内部状态&#xff08;比如当前是第几次迭代&#xff09;。但是&#xff0c;我们可以使用一些技巧来间接地实…

uboot环境变量操作命令setenv和saveenv

uboot启动的时候会将环境变量从flash读取到DRAM中,使用命令 setenv修改的是DRAM中环境变量,修改以后要使用saveenv命令将修改 后的环境变量保存到flash中,否则的话uboot下一次重启会继续使用以前的环境变量值.setenv setenv - set environment variables Usage: setenv seten…

LeetCode.295数据流的中位数详解

问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 Medi…

Advantest 93000测试机中CLOCK DOMAIN 详解

爱德万测试&#xff08;Advantest&#xff09;的V93000系列测试系统是一个高度模块化和可扩展的平台&#xff0c;专为复杂和高性能的半导体器件测试而设计&#xff0c;包括系统级芯片&#xff08;SoC&#xff09;、存储器、射频&#xff08;RF&#xff09;和混合信号器件等。在…

剪画小程序:从失业到自媒体:37岁的勇敢转身!

37岁啦&#xff0c;按说这年纪工作该稳稳当当&#xff0c;家庭也和和美美。可谁能想到&#xff0c;我竟然失业了&#xff01;当时啊&#xff0c;心里头那叫一个迷茫、焦虑&#xff0c;感觉天都要塌下来了。 可日子还得过呀&#xff0c;总不能就这么被生活给打倒&#xff01;现在…

白敬亭章若楠甜度报表的难哄大师

#白敬亭章若楠&#xff0c;甜度爆表的难哄大师#&#x1f389;&#x1f389;&#x1f389;各位小伙伴们&#xff0c;你们还记得那个让我们心跳加速、嘴角上扬的CP组合吗&#xff1f;没错&#xff0c;就是白敬亭和章若楠&#xff01;他们可是凭借一部新剧&#xff0c;再次让我们感…

antd中Select大数据分页触底刷新处理优化

平时使用antd中Select的下拉一般就几十几百条&#xff0c;这时候直接使用组件模糊查询就能实现大部分业务场景需求。 今天遇到一个需要模糊查询并且总量上万条的下拉框&#xff0c;如果一次性怼上去上万条&#xff0c;会造成浏览器卡顿。所以这边采用后端分页&#xff0c;前端…

希喂生骨肉冻干值得入手吗?拯救瘦弱、增强抵抗力最强主食测评!

希喂生骨肉冻干值得入手吗&#xff1f;很多小姐妹觉着自家猫咪太瘦了、体质不咋好&#xff0c;换季还敏感、掉毛、不吃东西&#xff0c;听说生骨肉冻干好吸收、营养好&#xff0c;可以改善体质、拯救瘦弱、增强抵抗力&#xff0c;为了图省事&#xff0c;开始盲入生骨肉冻干&…

盲盒小程序:线上盲盒发展机遇

盲盒已经成为了当下年轻人的潮玩首选方式。随着二次元、影视行业的快速发展&#xff0c;给盲盒提供了各种新的发展方向&#xff0c;盲盒商品也在不断创新&#xff0c;种类丰富多样。玩家在拆盲盒时随机获得某一商品&#xff0c;具有惊喜感和刺激性。 目前&#xff0c;随着小程…

194.回溯算法:组合总和||(力扣)

代码解决 class Solution { public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtracing(vector<int>& candidates, int target, int flag, int index, vector<bool>…

怎么优化亚马逊Listing?看这一篇就够了!

运营亚马逊最重要的工作之一就是优化listing&#xff0c;精心优化好亚马逊标题、五点描述、图片和关键词才能提高产品的可见性和吸引力&#xff0c;很多小伙伴对于怎么写出专业的亚马逊listing还是不知道如何下手&#xff0c;今天为大家分享一套实用的亚马逊listing优化指南&am…

java 简单零钱通

目标 面向过程版 代码 package new_pluse;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;public class change_common{public static void main(String arg[]){//定义相关变量Scanner scanner new Scanner(System.in);String key&qu…

【深度学习】机器学习基础

机器学习就是让机器具备找一个函数的能力 带有未知的参数的函数称为模型 通常一个模型的修改&#xff0c;往往来自于对这个问题的理解&#xff0c;即领域知识。 损失函数 平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09; 均方误差&#xff08;Mea…