java常用集合

这篇具有很好参考价值的文章主要介绍了java常用集合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


java常用集合

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

主要是由两大接口派生而来
:一个是 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查询快 插入删除慢:
java常用集合
这是底层的数组结构 你可以理解为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时, 链表会转换为红黑树结构 这样查询更方便。
java常用集合

java常用集合

遍历

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

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());
}
}
}
···文章来源地址https://www.toymoban.com/news/detail-447529.html

到了这里,关于java常用集合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Generative AI 新世界 | 大型语言模型(LLMs)概述

    在上一篇《Generative AI 新世界:文本生成领域论文解读》中,我带领大家一起梳理了文本生成领域(Text Generation)的主要几篇论文:InstructGPT,RLHF,PPO,GPT-3,以及 GPT-4。本期文章我将帮助大家一起梳理另一个目前炙手可热的话题: 大型语言模型 (Large Language Models,或简写为

    2024年02月07日
    浏览(46)
  • 探索未来量子计算的新世界:微软Q编译器

    项目地址:https://gitcode.com/microsoft/qsharp-compiler 在计算机科学的前沿,量子计算正逐渐揭开其神秘的面纱,而微软的Q#编译器则是开发者进入这一领域的关键工具。这是一个开源项目,旨在帮助程序员创建、编译和运行量子程序,从而推动量子算法和应用的发展。 Q#编译器是微软

    2024年04月17日
    浏览(54)
  • ChatGPT创造的未来:150+个Prompts助你玩转新世界

    介绍:👉 最常使用的 prompt,用于优化文本的语法、清晰度和简洁度,提高可读性。 指令: 作为一名中文写作改进助理,你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性,同时分解长句,减少重复,并提供改进建议。请只提供文本的更正版本,避免包括

    2023年04月20日
    浏览(42)
  • Generative AI 新世界 | 扩散模型原理的代码实践之采样篇

    本期文章,我们一起来探究生成式 AI 这一火热的新知识领域。 目前计划有三个大方向: 代码深度实践方向。例如用代码完整诠释 Diffusion 模型的工作原理,或者 Transformer 的完整架构等; 模型部署和训练优化方向。例如尝试解读 LMI、DeepSpeed、Accelerate、FlashAttention 等不同模型

    2024年04月10日
    浏览(44)
  • 合作伙伴专题|BreederDAO 和 NEAR 达成合作,探索想象新世界

    BreederDAO 宣布与 NEAR 协议建立了新的合作关系,NEAR 协议是一个经过认证的、气候零负荷、采取了权益证明机制的一层区块链,旨在实现无限的可扩展性、安全性以及帮助用户和开发人员的轻松上手,NEAR 通过其革命性的分片技术实现了这一点。 社区驱动 NEAR 的使命是:开发者

    2024年02月16日
    浏览(55)
  • [下载演讲稿]数字藏品与元宇宙存储—数字新世界的“土壤”

    和上次《【下载】元宇宙存储 演讲稿》相比,增加了: 1、两厅印发的《关于推进实施国家文化数字化战略的意见》,对数字藏品的发展有积极促进作用; 2、NFT和数字藏品的分类(新玩法+高质量体验+守诺) 受朱嘉明老师《朱嘉明:数字经济和非同质时代——NFT,虚拟需求

    2023年04月09日
    浏览(55)
  • Generative AI 新世界 | Falcon 40B 开源大模型的部署方式分析

    在上期文章,我们探讨了如何在自定义数据集上来微调(fine-tuned)模型。本期文章,我们将重新回到文本生成的大模型部署场景,探讨如何在 Amazon SageMaker 上部署具有 400 亿参数的 Falcon 40B 开源大模型。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技

    2024年02月08日
    浏览(50)
  • Amazon Generative AI 新世界 | 基于 Amazon 扩散模型原理的代码实践之采样篇

    以前通过论文介绍 Amazon 生成式 AI 和大语言模型(LLMs)的主要原理之外,在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾,希望内容可以更加深入。因此,本文将讲解基于扩散模型原理的代码实践,

    2024年02月06日
    浏览(60)
  • ChatGPT4.0知识问答、DALL-E生成AI图片、Code Copilot辅助编程,打开新世界的大门

    支持在线修改和图片导出。走一个~ (1)画一个会飞的猪 (2)通过选择select,对会飞的猪进行润色 (3)画一个花色翅膀 (4)来一个难的,根据斗罗大陆的设定,添加一个十万年魂环,哈哈 我记得金色魂环是百万年的了,哈哈。不过还可以理解。 (5)根据斗罗大陆的设计

    2024年04月29日
    浏览(54)
  • 二分查找结果总是不对?一文帮你解决二分查找的边界问题&&数组移除元素太耗时间,双指针法为你打开新世界的大门,降时间复杂度为O(n)

      可能有粗心写的不正确的地方,或者因为技术有限写得不好的地方,欢迎大家批评指正,文章中给出的代码是本人自己写的leetcode中的代码,是代码的核心部分,如果放到本地编译器中,可能要加入mian()函数等内容。 LeetCode704二分查找    二分查找的思路非常简单,也就

    2024年02月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包