java常用集合

news2024/11/25 13:26:19

java集合又是一个新世界了,从前在我刚接触java的时候,一直在纠结 集合这东西到底有啥用,后来代码写的多了。才开始学习集合


图片.png

集合也叫容器。顾名思意 就是存放对象的器皿。

主要是由两大接口派生而来
:一个是 Collecton接口,主要用于存放单一元素;对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。

另一个是 Map 接口,主要用于存放键值对。


它们四个的基本区别;javaguide里写的很好

List(对付顺序的好帮手): 存储的元素是有序的、可重复的。

Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。

Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。

Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),“x” 代表 key,“y” 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。

**

List

**
list接口下定义了操作对象的常用方法 像我们平时经常用的添加add 获取get 删除remove 等等 如果需要遍历那么在Collecton下提供了一个Iterator, 它有两个主要方法 在遍历中经常用:
hasnext 这是一个boolean 就是判断是否存在另一个可访问的元素。(经常做循环遍历的判断条件)
next()完整的含义应该是getnext 就是获取下一个对象。你可以把它丢尽while循环中用hasnext做判断 遍历出所有list的值。
···
public class ListTest {
public static void main(String[] args) {
List linkedlist = new LinkedList();
List arraylist = new ArrayList();
for (int i=0;i<10;i++) {
Integer integer =i;
linkedlist.add(integer);
arraylist.add(integer);
}
//两种方式遍历linkedlist arraylist同理
Iterator linkedlsitIterator = linkedlist.iterator();
while (linkedlsitIterator.hasNext()){
System.out.println(linkedlsitIterator.next());
}
for (Integer integer:linkedlist){
System.out.println(integer);
}}}

···
最常用的list实现就是:Arraylist 与 LinkedList 它们的内部方法很相似 但是底层实现不同-进而导致-性能不同

##List底层数据结构:
Arraylist 底层使用的是 Object 数组;
LinkedList 底层使用的是 双向链表 数据结构
(JDK1.6 之前为循环链表,JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!)

A查询快 插入删除慢:
图片.png
这是底层的数组结构 你可以理解为A的元素都是有序紧挨着的(形象的说就是: 当我寻找第n个元素的时候,我直接可以算出第n个元素在哪里)所以查的快。 插入/删除慢是因为 这个元素没了/加了。 它后面的所有元素位置都要改变!

L插入删除快 查询慢:
底层是双向链表结构,接触过数据结构的朋友应该之后的,双向链表里面的节点并不是有序紧紧挨着的,它们互相之间能够串联起来是因为每个节点存着 上一个节点和下一个节点的引用。 这就意味着查询的话你就只能一个一个找了 把所有遍历一遍。这就很慢。 而增加你只需要把节点断开 然后和新节点重新“连接”一下,不会影响到其他元素。

–关于list集合元素的排序 通常可以之间调用sort方法,如果你要自定义排序那么看重写比较器comparator接口:
可以看我的这篇博客:(举例实践 自定义Comparator 的用法)

线程安全性:
注意 这俩都不是线程安全的。

Set

set是无序的 (注意这里的无序不代表随机) /不可重复的。
比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同:

HashSet 是 Set 接口的主要实现类 ,HashSet 的底层是 HashMap,线程不安全的,可以存储 null 值;

LinkedHashSet 是 HashSet 的子类,能够按照添加的顺序遍历;

TreeSet 底层使用红黑树,元素是有序的,排序的方式有自然排序和定制排序,不能存null值。

queue

Queue 是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则。
比较重要的是优先队列: PriorityQueue:
PriorityQueue 是在 JDK1.5 中被引入的, 其与 Queue 的区别在于元素出队顺序是与优先级相关的,即总是优先级最高的元素先出队。
PriorityQueue 利用了二叉堆的数据结构来实现的,底层使用可变长的数组来存储数据
PriorityQueue 通过堆元素的上浮和下沉,实现了在 O(logn) 的时间复杂度内插入元素和删除堆顶元素。
PriorityQueue 是非线程安全的,且不支持存储 NULL 和 non-comparable 的对象。
PriorityQueue 默认是小顶堆,但可以接收一个 Comparator 作为构造参数,从而来自定义元素优先级的先后。

就是说它始终保证最优先的那个元素在堆的顶部。其他的元素不是严格排序的。通过这个特效我们可以做很多事,比如循环不停的取出顶端的值,就可以实现排序功能, 或者可以方便的获取第K个优先级元素。

Map

接下来就是重头戏了 - Hashmap
这个集合 你会到处看见 很重要 很复杂 面试必问巴拉巴拉的。看到这些东西正常的新手都会有一层排斥情绪。
你要告诉自己 这东西是个工具! 不是论文!我个人的经验还是先实践后理论,不用太死磕它的底层实现,
基本用法–动手实践项目中多用用–大概看看底层实现和内部原理–再实践–再回来仔细研究它的理论–再实践。
额外:与它相关的HashTable已经被淘汰了 忘记它吧。
##线程安全:
HashMap 是非线程安全的。

##对 Null key 和 Null value 的支持:
HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;

##初始容量大小和每次扩充容量大小:
HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。 基本的数学描述就是它的扩容每次都是:使用 2 的幂作为哈希表的大小。 为什么这样做?
Hash 值的范围值-2147483648 到 2147483647,前后加起来大概 40 亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个 40 亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash

我们首先可能会想到采用%取余的操作来实现。但是,重点来了:“取余(%)操作中如果除数是 2 的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是 2 的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是 2 的幂次方。

##底层结构:数组+链表+红黑树
同一个链表的hash值是相同的,当链表的长度>8时, 链表会转换为红黑树结构 这样查询更方便。
图片.png

图片.png

遍历

他的遍历方式很多 我知道的就有7种:
图片.png
(不用死记硬背,需要的时候查一下就好了)
个人经常用的比如:

public class HashMapTest {
   public static void main(String[] args) {
       // 创建并赋值 HashMap
       Map<Integer, String> map = new HashMap();
       map.put(1, "Java");
       map.put(2, "JDK");
       map.put(3, "Spring Framework");
       map.put(4, "MyBatis framework");
       map.put(5, "Java中文社群");
       // 遍历
       Iterator<Integer> iterator = map.keySet().iterator();
       while (iterator.hasNext()) {
           Integer key = iterator.next();
           System.out.println(key);
           System.out.println(map.get(key));
       }
   }
}

···
public class HashMapTest {
public static void main(String[] args) {
// 创建并赋值 HashMap
Map<Integer, String> map = new HashMap();
map.put(1, “Java”);
map.put(2, “JDK”);
map.put(3, “Spring Framework”);
map.put(4, “MyBatis framework”);
map.put(5, “Java中文社群”);
// 遍历
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
}
···

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

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

相关文章

LeetCode高频算法刷题记录2

文章目录 1. 最大子数组和【简单】1.1 题目描述1.2 解题思路1.3 代码实现 2. 合并两个有序链表【简单】2.1 题目描述2.2 解题思路2.3 代码实现 3. 两数之和【简单】3.1 题目描述3.2 解题思路3.3 代码实现 4. 二叉树的层序遍历【中等】4.1 题目描述4.2 解题思路4.3 代码实现 5. …

代码随想录算法训练营第四十二天 | 背包问题

背包问题 理论 基础&#xff1a;二维 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩…

Revit SDK:ErrorHandling

前言 本文介绍 Revit 的错误处理机制。 内容 程序员对错误处理的定义和理解 程序的错误处理机制可以分为两种类型&#xff1a;错误返回码和异常捕捉。 错误返回码是指在程序中遇到错误时&#xff0c;通过函数返回值来表明错误的类型和信息。错误返回码可以在程序中被预测和…

MySQL数据落盘原理(data page、redo log、undo log、binlog、xa-2pc等源码分析)

文章目录 前言一、Innodb如何作为MySQL插件的二、page cleaner thread三、Update操作源码梳理1、生成undo log2、更新数据3、生成redo log 四、MTR与将脏页添加到Flush List1、MTR2、脏页添加到Flush List 五、事务提交1、xa-prepare2、xa-commit2.1、process_flush_stage_queu…

概率统计与计算机技术的联系及在生活当中的应用研究

title: 概率统计与计算机技术的联系及在生活当中的应用研究 date: 2023-05-16 11:42:26 tags: 题目&#xff1a;概率统计与计算机技术的联系及在生活当中的应用研究 摘 要 概率论与数理统计是研究随机现象统计规律性的一门学科&#xff0c;是理工科各专业的一门重要的基础课程…

shell免交互

shell免交互 Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。 是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个“文件”并用作“命令”的…

Python 爬虫(四):Selenium 框架

Selenium 是一个用于测试 Web 应用程序的框架&#xff0c;该框架测试直接在浏览器中运行&#xff0c;就像真实用户操作一样。它支持多种平台&#xff1a;Windows、Linux、Mac&#xff0c;支持多种语言&#xff1a;Python、Perl、PHP、C# 等&#xff0c;支持多种浏览器&#xff…

Android中的IPC方式

Android中的IPC方式 1.Bundle 其中Intent就是用Bundle进行传播 四大组件间的进程间通信 2.使用文件共享 2.1文件共享的缺点 无并发&#xff0c;适用于交换简单的数据实时性不高的情景 使用文件共享容易出&#xff1a; 内容不一致&#xff1a;如果多个线程同时写入文件&…

【JavaWeb】-- Request和Response、JSP、会话技术

文章目录 Request和Response1.概述2.Request对象2.1 Request继承体系2.2Request获取请求数据2.3 IDEA创建Servlet2.4 请求参数中文乱码问题POST请求解决方案GET请求解决方案 2.5 Request请求转发 3.Response对象3.1 Response设置响应数据功能介绍3.2 Response请求重定向3.3 路径…

RabbitMQ养成记 (8. 消费者接受消息可靠性 consumer Ack)

Consumer Ack ack 指的是acknowledge 确认&#xff0c; 指的是消费端收到消息后的确认方式。 有三种确认方式&#xff1a; 自动确认手动确认 &#xff08;根据业务情况 手动确认是否成功发送&#xff09;根据异常情况确认 我们在消费端用代码实践一下&#xff1a; 首先我们定…

不会还有人不知道软件测试报告模板怎么写吧?

在测试岗位上&#xff0c;写报告是一项非常重要的软技能&#xff0c;写得好可以加分&#xff0c;写不好必然减分。 但在测试岗位上&#xff0c;提测“通过”和提测“不通过"的软件测试报告所包含的内容是不一样的&#xff08;这是个坑&#xff09;。但很多测试新人可能并…

LIO-SAM UBUNTU16.04.7 ROS-KINETIC 环境 编译 安装

简单记录一下 VMWARE workstation15UBUNTU16.04.7ros-kineticgtsam4.0.0 &#xff08;默认16.04比较老旧&#xff0c;不好用&#xff0c;vmtools也都没有&#xff0c;选了一个.7&#xff09; 选16.04版本的理由也简单&#xff0c;只是为了参考一个博客&#xff0c;单独建的环…

C语言-易错点汇总

易错点汇总 指针数组和数组指针(*p).astruct stdent和typedef struct stdentF5和CtrlF5const的位置全局变量和局部变量两个相同的常量字符串数组名和&数组名数组指针定义的解读int (*arr[10])[5]数组传参(* (void (*)())0)();关于数组名是否表示整个数组和数组首元素的地址…

Java位运算

Java >>和>>>的区别 | 或&#xff1a; 有1得1&#xff0c; 全0得0 int temp a|c;System.out.println(Integer.toBinaryString(a));System.out.println(Integer.toBinaryString(c));System.out.println(Integer.toBinaryString(temp));/*** 结果输出* * 01* …

对比SQL学Python:筛选|条件判断

SQL里筛选数据主要用到了where、and、in等语句。而在Python里实现筛选的方式比较多样&#xff0c;用到了 与&或|非~ 逻辑运算符&#xff0c;和isin()函数等。我们感受一下二者的区别吧&#xff1a; 汇总&#xff1a; 类型Python语句参考单条件筛选 data[data[shop_type]A…

Python复制目录及其子目录下的所有文件到指定新目录并重命名

Python复制目录及其子目录下的所有文件到指定新目录并重命名 前言前提条件相关介绍实验环境Python复制目录及其子目录下的所有文件到指定新目录并重命名代码实现输出结果 前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#x…

最常用的界线矢量数据大合集(文末有附下载方法)

最近收集了挺多比较常用的矢量界线数据&#xff0c;例如地理分区、气候分区等界线数据&#xff0c;在日常制图、学习、科研等方面使用频率比较高。废话不多说&#xff0c;这里给大家分享一下&#xff01;&#xff01; 1、中国农业熟制区划矢量数据 2、黄土高原空间范围矢量数据…

【Leetcode -509.斐波那契数 -520.检测大写字母】

Leetcode Leetcode - 509.斐波那契数Leetcode - 520.检测大写字母 Leetcode - 509.斐波那契数 题目&#xff1a;斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。 该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。…

node笔记_koa框架是什么?

文章目录 ⭐前言⭐ koa框架是如何发展而来的&#xff1f;⭐ koa框架的基本使用&#x1f496; 安装 koa&#x1f496; koa的Middleware示例&#x1f496; 支持xml ⭐ 结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文介绍node的一个web框架koa。 往期文章 node_window…

第三章: Mybatis-Plus 的通用CRUD API 练习使用

目录 1. Insert 操作 -> Create 1.1: TableId 的 id策略 1.2: TableField 2. Update 操作 -> Update 2.1: 根据 ID 更新 2.2: 根据条件更新 3. Delete 操作 -> Delete 3.1: deleteById 3.2: deleteByMap 3.3: delete 3.4: deleteBatchIds 4. Select 操作 -&g…