Java-集合框架

news2024/11/18 6:42:19

文章目录

    • 摘要
    • Collection
      • Collection集合遍历
        • Iterator迭代器
        • 增强for循环
      • 排序
    • List
      • ArrayList
      • LinkedList
      • Vector
    • Set
      • HashSet
    • Map
    • 小结

摘要

Java的集合框架提供了一组用于存储、管理和操作数据的类和接口。这个框架提供了各种数据结构,如列表、集合、队列和映射,以满足不同的数据处理需求。
根据实现接口可以分为:CollectionMap两大类

Collection

在这里插入图片描述

Collection集合遍历

Collection所有的实现子类集合都可以通过以下两种方式进行元素遍历:

  1. Iterator迭代器
  2. 增强for循环

详细的介绍如下:

Iterator迭代器
  1. Iterator称为迭代器,主要用于遍历Collection集合中的元素;
  2. 所有实现了Collection接口的集合子类都有一个Iterator()方法,返回Iterator对象,即迭代器;

执行原理
在这里插入图片描述
Code

Iterator iterator=[Collection].iterator();         //创建一个迭代器
while(iterator.hasNext()){                         //循环,直到集合中没有元素为止
	System.out.println(iterator.next());           //获取下一个元素并打印出来
}
  1. iterator() :方法用于获取集合的迭代器对象,这个迭代器对象用于遍历集合中的元素。
  2. iterator.hasNext():它会不断检查迭代器是否有下一个元素。如果有下一个元素,则循环会继续执行。
  3. iterator.next():返回下一个元素,并将迭代器的位置移动到下一个元素。
  4. 遍历完成后,next指针指向最后一个位置。

如果想要充值next指针,可以执行一下代码:

iterator=[Collection].iterator();

此时next指针就会指向第一位。

增强for循环
  1. 增强for循环底层任然是Iterator迭代器;
  2. 可以理解为简化版的Iterator。

Code

List list=new ArrayList();
。。。
//增强for循环
for(Object str:list){
	System.out.println(str);
}

排序

Comparable 接口和 Comparator 接口都是 Java 中用于排序的接口,它们在实现类对象之间比较大小排序等方面发挥了重要作用:

  1. Comparable接口有一个CompareTo(Object obj)方法用来排序;
    • 用于比较当前对象和传入对象的顺序
    • -1表示当前对象小于,0表示等于,1表示大于。
public  class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    /**
     * T重写compareTo方法实现按年龄来排序
     */
    @Override
    public int compareTo(Person o) {
        if (this.age > o.getAge()) {
            return 1;
        }
        if (this.age < o.getAge()) {
            return -1;
        }
        return 0;
    }
}

public static void main(String[] args) {
        TreeMap<Person, String> pdata = new TreeMap<Person, String>();
        pdata.put(new Person("张三", 30), "zhangsan");
        pdata.put(new Person("李四", 20), "lisi");
        pdata.put(new Person("王五", 10), "wangwu");
        pdata.put(new Person("小红", 5), "xiaohong");
        // 得到key的值的同时得到key所对应的值
        Set<Person> keys = pdata.keySet();
        for (Person key : keys) {
            System.out.println(key.getAge() + "-" + key.getName());

        }
    }
输出:
5-小红
10-王五
20-李四
30-张三
  1. Comparator接口有一个**Compare(Object obj1,Object obj2)**方法用来排序;

    • 用于比较两个对象;
    • -1表示当前对象小于,0表示等于,1表示大于。
    ArrayList<Integer> arrayList = new ArrayList<Integer>();
    arrayList.add(-1);
    arrayList.add(3);
    arrayList.add(3);
    arrayList.add(-5);
    arrayList.add(7);
    arrayList.add(4);
    arrayList.add(-9);
    arrayList.add(-7);
    // 定制排序的用法
    Collections.sort(arrayList, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2.compareTo(o1);
        }
    });
    System.out.println("定制排序后:");
    System.out.println(arrayList);
    

List

在这里插入图片描述
特点

  1. List集合类中元素是有序的(按插入顺序排序),且可以重复的(null也可以);
  2. 每个元素多有对应的索引
子类描述效率
ArrayList基于动态数组的有序集合。
LinkedList基于双向链表的有序集合。
Vector与 ArrayList 类似,但是线程安全。

常见方法:

方法说明
add(E element)向列表末尾添加一个元素。
add(int index, E element)在指定位置插入一个元素。
get(int index)获取指定索引位置的元素。
set(int index, E element)替换指定索引位置的元素。
remove(int index)移除指定索引位置的元素。
size()获取列表的大小。
contains(Object obj)检查列表是否包含指定的元素。
indexOf(Object obj)获取指定元素在列表中的第一个出现位置的索引。
clear()清空列表中的所有元素。
toArray()将列表转换为数组。
addAll(Collection<? extends E> c)将另一个集合的所有元素添加到当前列表中。

ArrayList

数据结构:
ArrayList的数据结构由数组实现数据存储,如下图所示:
在这里插入图片描述
特点:

  1. 线程不安全(执行效率高),在多线程的情况下不建议使用。

源码分析:

  1. ArrayList中维护了一个Object类型的数组elementData[],存储元素。

    transient Object[] elementData;   // transient,表示该变量不会被序列化
    
  2. 创建ArrayList对象
    默认使用的无参构造,则初始化容量为elementData=0,第一次添加元素,则扩容elementData=10,如果还需要扩容,则扩容elementData为1.5倍。

       List list=new ArrayList();
    

    源码如下:
    在这里插入图片描述

  3. 添加元素

       list.add(元素);
    

    源码如下:
    在这里插入图片描述

LinkedList

数据结构

  1. LinkedList底层实现了双向链表、双端队列特点。

特点:

  1. 可以添加任意元素(可以重复),包括null;
  2. 线程不安全,没有实现线程同步

Vector

数据结构:

  1. Vector底层是一个对象数组,
    	protected Object[] elementData;
    

特点:

  1. Vector是线程同步的,即线程安全,操作方法带有synchronized(支持线程同步和互斥);
    public synchronized void addElement(E obj) {
            modCount++;
            ensureCapacityHelper(elementCount + 1);
            elementData[elementCount++] = obj;
        }
    

Set

在这里插入图片描述
特点:

  1. 无序(添加的顺序和访问的顺序不一致)、没有索引
  2. 不允许重读元素,最多包含一个null;

HashSet

数据结构:
HashSet的底层实际上是HashMapHashMap的底层是(数组+链表+红黑树
图片描述

图片描述 1. **元素存储到Key**;

HashSet 中每个元素都被存储为键-值对,但值部分被设置为一个固定的常量PRESENT(通常是**Object**类型的占位符),而不是实际的值。

```java
HashSet<String> set = new HashSet<>();
set.add("test");
```
底层键值对=`<test,PRESENT>`

扩容机制:
HashSet默认数组长度=11,每次扩充为原来的2n+1。

  1. 添加元素

    1. 当HashSet添加元素时,首先会计算元素的哈希码hashCode,并根据哈希码确定元素在哈希表中的位置;
    //计算hashCode
    static final int hash(Object key) {
          int h;
          // key.hashCode():返回散列值也就是hashcode
          // ^:按位异或
          // >>>:无符号右移,忽略符号位,空位都以0补齐
          return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
      }
    
  2. 判断链表是否有相同元素:对于多个对象来说hashCode可能相同,所以使用equals()方法来判断对象是否相同

    1. 不相同:直接添加;
    2. 相同:不添加。
  3. 如果有链表长度>8,且table的长度>64,先进行扩容,然后将链表转为红黑树
    图片描述

Map

小结

Java集合框架为开发人员提供了强大的工具,以满足各种数据处理需求。了解不同集合类型的特性和适用场景对于编写高效和可维护的Java应用程序至关重要。通过选择合适的数据结构和算法,开发人员可以更轻松地解决各种问题。

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

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

相关文章

sqoop 脚本密码管理

1&#xff1a;背景 生产上很多sqoop脚本的密码都是铭文&#xff0c;很不安全&#xff0c;找了一些帖子&#xff0c;自己尝试了下&#xff0c;记录下细节&#xff0c;使用的方式是将密码存在hdfs上然后在脚本里用别名来替代。 2&#xff1a;正文 第一步&#xff1a;创建密码对…

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输…

小迈物联网网关对接串口服务器[Modbus RTU]

很多工控现场&#xff0c;方案中会使用串口服务器采集Modbus RTU的设备&#xff0c;这种情况下一般会在PC机上装上串口服务器厂家的软件来进行数据采集。如果现场不需要PC机&#xff0c;而是通过网关将数据传输到软件平台&#xff0c;如何实现呢&#xff1f; 本文简要介绍小迈网…

记录用命令行将项目打包成war包

记录用命令行将项目打包成war包 找到项目的pom.xml 在当前路径下进入cmd 输入命令 mvn clean package 发现报错了 Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project MMS: Error assembling WAR: webxml attribute is req…

编程助手成为编程高手,帮您正则调试

官方下载地址&#xff1a;安果移动 视频演示地址&#xff1a;编程助手-正则调试与面试题&#xff0c;升职加薪不是梦_哔哩哔哩_bilibili 编程助手成为编程高手&#xff0c;帮您正则调试 软件介绍版本号 1.0.2更新日期 2023-10-11 找工作不敢谈薪资&#xff1f;总觉得公司欠我…

【JVM】初步认识Java虚拟机

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 一、初识JVM1.1 什么是JVM1.2 JVM的功能…

C之fopen/fclose/fread/fwrite/flseek

一、C中文件操作简介 c中的文件操作大致和linux的文件操作类似&#xff0c;但是毕竟是不同的API&#xff0c;所以会有些差异。部分差异会在下面的案例中体验 二、fopen open的参数有两个一个是文件名&#xff0c;一个是模式选择&#xff0c;不同open函数&#xff0c;open中的模…

python - 第15章 GUI的最终选择 Tkinter

文章目录 tk1tk2tk3 添加图片tk4 图片作背景 tk1 import tkinter as tkapptk.Tk() app.title("这是标题") # 显示标题theLabeltk.Label(app,text窗口程序!) # 显示文本,图片,图标 theLabel.pack() # 自动调节组件尺寸app.mainloop()tk2 import tkinter as tkclas…

各省份12.5m地形数据

手机整理了全国各省份12.5m的地形数据&#xff0c;ALOS的。 另外也有全国30m的地形数据&#xff0c;可以去我的博客目录找&#xff0c;以及各种模型数据均可在下面链接下载。 传送门&#xff1a;数据共享中心

017-第三代软件开发环境搭建

第三代软件开发环境搭建 文章目录 第三代软件开发环境搭建项目介绍实体机安装Ubuntu系统安装Qt安装GCC & G安装 OPen GL安装Git配置用户名和邮箱生成 SSH 安装VS Code安装Chrome安装搜狗输入法安装字体查看字体拷贝字体到目标机拷贝字体到目标机字体目录安装字体重启设备 安…

Unity基础课程之物理引擎2-碰撞检测案例-吃金币并加分

业务逻辑&#x1f4bc;&#xff1a; 这个脚本的主要功能是让主角在场景中吃到金币&#x1f4b0;&#xff0c;每吃到一个金币&#xff0c;主角的分数就会增加 10 分&#x1f389;&#xff0c;同时销毁金币。这样&#xff0c;玩家就可以通过吃金币来增加分数&#xff0c;挑战更高…

redis 哨兵 sentinel(二) 哨兵原理

主观下线 subjectively down SDown 客观下线 Oubjectively down ODown 多个sentinel要超过一半认为&#xff0c;master 主观下线了&#xff0c;才能认为主机是客观下线&#xff08;死掉&#xff0c;宕机了&#xff09; 通过Raft算法&#xff0c;选举一个兵王&#xff08;在所有…

AWS SAP-C02教程2--存储资源

存储资源在架构设计中是一个少不了的环节,而在AWS中有不同类型的存储资源,对应会有不同用途不同价格,SAP考试中考察各种存储是少不了,以下是涉及到的存储 目录 1 非结构化存储1.1 EBS(块存储)1.1.1 基本限制1.1.2 类型1.1.3 RAID 配置选项1.1.4 Snapshot1.2 Local Insta…

酷开系统 | 酷开科技助推大屏营销价值提升

随着人口红利的不断减退&#xff0c;移动互联网流量逐渐见顶。寻找新的流量洼地已经被越来越多的品牌方提上日程。而OTT正是这样一个为数不多仍在高速增长的媒介&#xff0c;也成为了构建品牌势能、塑造品牌价值的核心媒介之一。 OTT行业发展至今&#xff0c;伴随着消费者内容…

MTK平台闪光灯相关信息

&#xff08;1&#xff09;概念 MTK打闪一般分为预闪、主闪两个阶段。相应的执行一次拍照会有预闪、主闪两次开灯。预闪可以用来防红眼(red-eye reduction)。闪光时使环境发生变化&#xff0c;会按新的光线条件&#xff08;有闪光时&#xff09;重新测光&#xff0c;来实现更精…

2、vscode c++ 项目配置调试及运行

文章目录 1、项目布局2、多项目管理2.1 先是一个总的CMakeLists.txt2.2 每个项目2.3 多版本OPENCV 3、调试和运行 接上一篇文章&#xff0c;vscode和cmake的c环境配置好以后&#xff0c;我们要写项目&#xff0c;再写对应的CMakeLists.txt 1、项目布局 . ├── bin ├── bu…

【Vuex】入门使用---详细介绍

一&#xff0c;Vuex入门 1.1 什么是Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理库。它用于管理应用程序中的共享状态&#xff0c;它采用集中式存储管理应用的所有组件的状态&#xff0c;使得状态的管理变得简单和可预测 官方解释&#xff1a;Vuex 是一个专为 Vue.js 应…

前端本地存储方案-localForage-vue3中使用

前言 前端有多种本地存储方案可供选择&#xff0c;常见的有&#xff1a; Cookie&#xff1a;小型的文本文件&#xff0c;存储少量数据Web Storage &#xff1a;包括&#xff1a;localStorage和sessionStorage&#xff0c;存储数据有上限&#xff08;5M&#xff09;左右Indexe…

JVM面试题:(三)GC和垃圾回收算法

GC: 垃圾回收算法&#xff1a; GC最基础的算法有三种&#xff1a; 标记 -清除算法、复制算法、标记-压缩算法&#xff0c;我们常用的垃圾回收器一般 都采用分代收集算法。 标记 -清除算法&#xff0c;“标记-清除”&#xff08;Mark-Sweep&#xff09;算法&#xff0c;如它的…

优化|一类二元二次规划的凸重构和外近似

论文解读者&#xff1a;范若岭 1. 文章优化问题&#xff1a; 对于下列问题&#xff0c;$ \mathbb{B} {0, 1}, \mathbb{R} 是实数集合。 是实数集合。 是实数集合。Q 是由实数组成的 是由实数组成的 是由实数组成的n \times n 对称矩阵。 对称矩阵。 对称矩阵。A 是由实数组成…