Java中的Collection

.NET适配HarmonyOS进展 1. 前言 目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。 阅读详情

简单说明

Java中的集合类包括Collection和Map两大分支,这篇文章简单的描述下我们在写代码过程中常用的Collection。

从上图可以知道,Collection派生了三大子分支,分别是Set、List、Queue。这三个分支的区别如下:
1、List:必须保持元素特定的顺序
2、Set:不能有重复元素
3、Queue:保持一个队列(先进先出)的顺序

层次关系

Iterable

由上图可以知道,Collection的父类是一个迭代器,所以Collection的实现类都能进行foreach遍历(具有可遍历性),Iterable唯一实现的接口是iterator(),当然我们可以通过查看Iterable源码可发现有两个以实现的方法:forEach()/spliterator(),Java为何在一个接口中具有两个实现的方法,我们留在以后讲解。

Collection

上面也说了Collection派上了三个分支(List/Set/Queue),这三个分支也有不同的使用场合。

Collection之Set

Set集合类似于一个罐子,”丢进”Set集合里的多个对象之间没有明显的顺序。Set继承自Collection接口,不能包含有重复元素(记住,这是整个Set类层次的共有属性)。

Set判断两个对象相同不是使用”==”运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。因为Set的这个制约,

在使用Set集合的时候,应该注意两点:
1) 为Set集合里的元素的实现类实现一个有效的equals(Object)方法。
2) 对Set的构造函数,传入的Collection参数不能包含重复的元素。

下面我们通过源码分析以下HashSet,它其实通过一个HashMap(Hash算法存储)的key来控制的一个数据结构。

    public HashSet() {
        map = new HashMap<>();
    }

通过他的构造方法来创建一个map值

    private static final Object PRESENT = new Object();

他的remove/clear方法亦是如此。
下面我们看看他实现的迭代器的iterator()方法

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

关于HashMap的内容我们下一个章节详细讲述下。

Collection之List

List是编程过程中最常用的数据结构,它必须按照指定的顺序规则来进行,例如ArrayList是按照数据存储的位置来存储的(有序的),而LinkedList是一种链表,按照指针索引来提取数据的(无序的)

下面简单的说一说ArrayList和LinkedList

1、ArrayList

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
transient Object[] elementData;

通过ArrayList的构造方法,我们可以发现,在ArrayList初始化的过程中,他创建了一个有指定大小的不参与序列化(transient)的elementData数组或者大小的0的空数组。

通过他的add方法一步步的走下去我们可以看到他的grow方法

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

我们可以发现grow其实就是给elementData对象扩容的方法。他的remove方法就是add的逆过程,将指定位置(index)或者指定的Object移除。

1、LinkedList

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用,是一个无序的数据结构

LinkedList 他有两个重要的Node对象,通过他们来实现LinkedList作为List的基本操作。

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

下面是他的add方法

    public void addLast(E e) {
        linkLast(e);
    }
   public void addFirst(E e) {
        linkFirst(e);
    }
    /**
     * Links e as last element.
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }
/**
 * Links e as first element.
 */
private void linkFirst(E e) {
    final Node<E> f = first;
    final Node<E> newNode = new Node<>(null, e, f);
    first = newNode;
    if (f == null)
        last = newNode;
    else
        f.prev = newNode;
    size++;
    modCount++;
}

通过上面代码可以发现linkFirst 和linkLast分别对first/last两个节点进行了操作.

    public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }
  Node<E> node(int index) {
        // assert isElementIndex(index);

        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

上面代码是获取指定位置对象的方法,有node方法可以看出,双向链表可以快速的查询到结果,当index小于总大小一半的时候,采用first节点查找,反之采用last查找。

说了这么多ArrayList和LinkedList,那么他们到底有什么区别?

1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

3.LinkedList不支持高效的随机元素访问。

4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了

Collection之Queue

Queue在java中的使用率可能没有前面两种那么高,但是作为Collection一份子,它也有他存在的价值。

Queue,顾名思义就是队列(先进先出的数据结构),队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

因为LinkedList也实现了Queue,那么我们依然从LinkedList来说说Queue。首先Queue自身除了继承了Collection方法外,另外也有自己方法。

offer: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

poll:和Collectio的remove方法相似,但是remove方法抛出异常, poll() 方法在用空集合调用时不是抛出异常,只是返回 nul

peek/element:element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

  public boolean offer(E e) {
        return add(e);
    }

这是linkedList的offer方法,可以看出他就是调用了add方法。

    public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
   private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

从上面可以,poll()方法把first的第一条记录提取出来(最先进去的)并返回。

另外Queue还有两个重量级的实现类,这两个留着大家自己看看吧:
BlockingQueue (阻塞算法)
ConcurrentLinkedQueue(非阻塞算法)

好吧,Collection暂时说到这些,更加深度的留在以后再细说

开源低场MRI系统构建:从原理到三天实现 磁共振成像(MRI)作为现代医学影像的核心技术,其高场强系统存在成本和技术门槛问题。低场MRI通过开源硬件和模块化设计实现技术民主化,采用永磁体替代超导磁体可大幅降低系统复杂度。本文以H型永磁体设计为例,结合MaRCoS开源控制库和PyPulseq脉冲序列工具,展示了如何快速构建教育级MRI系统。关键技术包括遗传算法优化的匀场方案、CNC加工的梯度线圈,以及基于Red Pitaya的SDR控制架构。这种轻量化方案特别适合医学物理教学和脉冲序列开发验证,为MRI技术在资源有限地区的普及提供了新思路。 阅读详情

相关推荐

【MATLAB+VScode】VScode调试MATLAB代码的终极指南

本文详细介绍了在VScode中调试MATLAB代码的完整方案。通过配置MATLAB Engine for Python作为桥梁,实现在VScode中设置断点、单步执行、查看变量等交互式调试功能,有效结合了VScode的现代化编辑体验与MATLAB的强大计算内核,显著提升开发效率。

weixin_29161719的博客 412

java之Collection

主要内容 Collection集合 迭代器 增强for List集合 Set集合 学习目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 能够说出集合的使用细节 能够使用集合存储自定义类型 能够使用foreach循环遍历集合 能够说出List集合和Set集合的区别 能够说出List集合各种实现类的区别 能够说出Set集合各种实现类的区别 能够说出Collection和Map集合的区别 说出Map集合的常用功能 能够遍历Map集

m0_46191714的博客 2万+

从零玩转GD32单片机CAN总线:手把手实战配置与源码解析

本文提供了一份基于GD32单片机的CAN总线实战入门指南。从硬件连接(GD32F103C8T6与TJA1050收发器)到软件配置,详细解析了CAN初始化、波特率计算、过滤器设置及中断收发等核心源码。通过手把手的回环测试示例与常见问题排查,帮助开发者快速掌握CAN总线通信的关键配置与调试技巧。

g5h6i7j的博客 481

Java——Collection集合

java中Collection集合详解

程序员阿龙的博客 7282

Super4PCS文章阅读笔记

Super4PCS阅读笔记 Super4PCS阅读笔记 前言 前言 今天给大家分享一下点云配准四点法4PCS0的变种——Super4PCS。此算法的原文在:Super4PCS: Fast Global Pointcloud Registration via Smart Indexing。稍微我也会写一篇关于如何使用这篇文章的里所提供的代码进行点云粗配准。关于四点法...

Vodake的博客 4540

UWB学习——day4

总的来说,BPM-BPSK调制方案是一种利用脉冲位置和相位来编码信息的高效数字调制技术,特别适用于UWB通信系统,以实现高速数据传输和频谱效率。这种方式将时间和相位综合使用,从而提高了数据传输的容量。总之,超外差结构是一种接收器设计,通过将不同频率的信号转换到一个共同的中间频率来提高信号选择性和抗干扰性。超外差结构是一种用于接收器的电子电路设计,它的目标是从无线信号中提取有用的信息,比如音频、数据或图像。该芯片的接收机是超外差结构,所谓超外差结构一种基于频率转换的接收器架构,旨在提高信号选择性和抗干扰性。

许帅的博客 2557

JAVA集合Collection常用方法详解

提到集合就不得不提一下数组,好多集合底层都是依赖于数组的实现。数组一旦初始化后,长度就确定了,存储数据对象不能达到动态扩展,其次数组存储元素不便于对数组进行添加、修改、删除操作,而且数组可以存储重复元素。这个时候集合对作用显现出来了。集合分为Collection和Map两种体系。下面先介绍Collection的集合类的继承树如下图所示:单列集合只能一次添加一个数据双列集合可以一次添加2个数据。

weixin_65752158的博客 3716

一文看懂分布式存储架构

目录一、集中存储结构二、分布式存储1 、分布式存储的兴起2 、分布式存储的重要性3 、分布式存储的种类和比较三、分布式理论浅析1 、一致性和可用性2 、数据分布3 、复制4 、分布式协议5、跨机房部署四、分布式文件系统1、 Google 文件系统( GFS )2、 Taobao 文件系统( TFS )3、 Fackbook Haystack 文件系统4、 CDN 内容分发网络五、分布式键值系统1、 Amazon Dynamo2、 Taobao Tiar3、 ETCD4 、产品选型比较( Etcd , Zoo

weixin_70730532的博客 2万+

【Java 基础篇】Java Collection详解

Collection是Java集合框架的根接口,它定义了一些基本的操作和行为,如添加、删除、遍历等。List和Set。List是一个有序的集合,可以包含重复元素。它提供了按索引访问、插入、删除等操作。常见的实现类有ArrayListLinkedList和Vector。Set是一个不允许包含重复元素的集合。它提供了高效的元素查找和去重。常见的实现类有HashSetTreeSet和。此外,Map接口也是Collection框架的一部分,它提供了键值对的存储和操作。Map中的键是唯一的,值可以重复。

繁依Fanyi的博客 7281

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1090

Xilinx Vitis HLS教程1--Vitis HLS概述[01/12]

Xilinx Vitis HLS教程[01/10]前言1. Vitis HLS简介1.1 软件工程师的设计原则1.1.1 简介1.1.2 吞吐量和性能1.2.3 架构问题1.2.4 FPGA编程的3大范式1.2.4.1 生产者-消费者范式1.2.4.2 流式数据范式1.2.4.3 流水线范式1.2.5 3种范式结合 前言 项目中使用到Xilinx Zynq UltraScale+ MPSoC ZCU102 开发板,领导指示研究"xilinx软件自带的c语言综合器"。对于一个硬件一窍不通的我来说,甚至不知道

B10030607的博客 5241

Java基础之Collection

Java基础之Collection

qq_45344586的博客 4772

Gbase 8a GDCA考试真题100%

本文整理一些Gbase 8a中非常易错得考试真题及答案,而且都是不好搜的。加粗的是正确答案。

打工之路,一路生花 4306

Java中的Collection介绍

https://docs.oracle.com/javase/tutorial/collections/interfaces/index.html Collection可以说是把多个元素组合在一起的一种对象。Java中的collection分为5大类。对于这6类分别有对应的interface:set/list/queue/deque/map interfaces。These interfaces...

我的学习成长日记 3964

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java集合之——Collection接口

前言 老师在教我们学习集合的时候,大多都是以数组为砖,列举了对象数组有那些问题?比如普通的对象数组的最大问题在于数组中的元素个数是固定的,不能动态的扩充大小,所以最早的时候可以通过链表实现一个动态对象数组。但是这样做毕竟太复杂了,所以在 Java 中为了方便用户操作各个数据结构,所以引入了类集的概念,有时候就可以把类集称为 java 对数据结构的实现。 在整个类集中的,这个概念是从 JDK 1.2(Java 2)之后才正式引入的,最早也提供了很多的操作类,但是并没有完整的提出类集的完整概念。 类集中最大的几

you do ,you win 4310

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Java】集合之Collection概述

目录 一、前言 二、常见的集合概览图 三、Collection集合 1.Collection集合常用方法 2.Collection集合之迭代器 迭代器介绍 迭代器常用方法: 一、前言 集合在Java中的作用是显而易见的,他可以存储我们的信息,可以实现增删减改的 操作,相当于一个模拟的"数据库"。 二、常见的集合概览图 集合都是在java.util包下的,所以在使用时先导包。 三、Collection集合 public interface Collection&.

weixin_60719453的博客 2437

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA Collection类

JAVA Collection类 1.基本使用 import java.util.ArrayList; import java.util.Collection; public class myCollection { public static void main(String[] args) { //创建Collection集合的对象 //Collection本身是一个接口,无法实例化,故此通过其List子接口的ArrayList实现类来实例化(多态)

Cassie的博客 2161

java new collection_Java中的集合Collection

集合是什么?Java集合类存放于 java.util 包中,是一个用来存放对象的容器。注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。③、集合可以存放不同类型,不限数量的数据类型。Collection的功能概述:1:添加功能b...

weixin_32999557的博客 1550

new collection java_Java集合-Collection

原文链接 作者:Jakob Jenkov 译者:祖强Collection接口是 (java.util.Collection)是Java集合类的顶级接口之一。所以不能直接实例化一个Collection,但是可以实例化它的一个子类,你或许经常把这些子类作为一个Collection统一探讨。在这篇文章中,你将看到如何处理。下面是本文的一个主题列表:Collection子类增加和移除元素检测一个Co...

weixin_34008445的博客 898

Java中的Collection接口

前言 上世纪七十年代,面向对象编程的思想提出,simula 67语言横空出世——这得益于计算机算力的进步,计算机作用得以体现,计算机不再是小领域研究和高端知识分子独有的宝物,在新的应用前景下,传统的编程模式体现出庞大的重复劳动,且难以被一般知识水平的人掌握和使用的缺点,这时,面向对象编程应运而生了。并在后面六十年的发展中,逐渐产生了今天广泛应用的Java,C++,Python等一系列应用广泛的语言。 对于初步接触Java的人来说,影响最深的便是它方便的数据结构,以致用多了Java后,在回到C等语言,会感到强

weixin_44160014的博客 537

java collection图_图解Java之一——Collection

图解Java之一——Collection图解Java之一——CollectionJDK1.2引入了一套设计优良的类集框架——Collection,这些接口提供了批量管理对象的API,并可以通过这些API实现队列、栈、字典和线程安全的集合等,大大方便了开发。本文首先从该类集框架的整体结构进行分析。1. Collection继承结构Collection框架定义的所有类和结构都放在JDK的java.ut...

weixin_39647471的博客 866

Java中的Collection集合

JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。 集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map本文主要讲Collection集合,后续再补充Map集合。

write less , do more 3444

Java Collection的使用

注意:Collection 是一个接口不能直接创建对象,下面使用实现类的对象ArrayList来测试创建Collection对象。

HUAIJIUdada的博客 2389

Java中Collection和Collections的区别

根本区别 1.Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供最大化的统一操作方式。 以下接口实现了Collection接口: map、set、list、vector 2.Collections是一个包装类。它包含各种有关集合操作的静态多态方法。此类不能...

Hello World 9976

java容器之Collection

java容器之Collection

weixin_43417394的博客 215
上一篇: 说说String
下一篇: 讲讲ArrayList
码农驿站
博客等级 码龄10年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值