集合体系java

news2024/11/16 13:47:55

Collection:单列集合:每个元素只包含一个值

Collection集合存储的是地址

Collection的三种遍历方法如下

//迭代器是用来遍历集合的专用方式(数组没有迭代器),在java中迭代器的代表是Iterator
//boolean hasNext():询问当前位置是否有元素存在
//E next():获取当前位置的元素,并同时将迭代器指向下一个元素处
public class CollectionTest3 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("java1");
        c.add("java2");
        c.add("java3");


        //从集合对象获取迭代器对象
        Iterator<String> iterator = c.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //增强For循环:可以遍历数组或集合,本质就是迭代器遍历集合的简便写法
        /*
        for(元素的数据类型 变量名:数组或者集合)
         */
        for(String s:c){
            System.out.println(s);
        }

        //使用Lambda表达式遍历
        c.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        c.forEach((String s) -> {
                System.out.println(s);
        });

        c.forEach( s -> {
            System.out.println(s);
        });

        c.forEach( s -> System.out.println(s));

        c.forEach(System.out::println);
    }
}

1. List系列集合:添加的元素是有序,可重复,有索引。

List集合存储的是内容

四种遍历方式如下

public class ListTest1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("java1");
        list.add("java2");
        list.add("java2");
        //        System.out.println(list);

        //for循环遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        //迭代器遍历
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //增强for循环
        for (String s : list) {
            System.out.println(s);
        }

        //Lambda表达式遍历
        list.forEach( System.out::println);

    }
}
a. ArrayList:有序,可重复,有索引( 基于数组实现 )

查询快,增删慢

  • 查询速度快(是根据索引查询数据快)
  • 删除效率低:可能需要把后边很多数据进行前移
  • 添加数据效率极低:可能需要把后边很多数据后移,再添加元素;或者也可能进行数组的扩容

底层原理:(1)利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组

(2)添加第一个元素时,底层会创建一个新的长度为10的数组

(3)存满时,会扩容1.5倍

(4)如果一次添加多个元素,1.5倍还放不下,则创建数组的长度以实际为准

b. LinkedList:有序,可重复,有索引(基于双向链表实现)

适合用作 队列,栈

  • 查询慢,增删相对较快,但对首尾进行增删改查的速度是极快的

(API中有 在头部增加删除元素,在尾部增加删除元素 方法)

2. Set系列集合:添加的元素是无序,不重复,无索引.

a. HashSet : 无序,不重复,无索引(基于哈希表实现,底层基于Map实现的,只是只要键数据,不要值数据)

增删改查性能都较好

哈希值:java中每个对象都有一个哈希值,是一个int类型的数据

哈希表:数组+链表+红黑树

底层原理:(1)创建一个默认长度16的数组,默认加载因子为0.75,数组名为table

(2)使用元素的哈希值对数组长度求余计算出应存入的位置

(3)判断当前位置是否为null,如果是null直接存入

(4)如果不为null,表示有元素,则调用equals方法比较

相等,则不存;不相等,则存入数组

(数组占满后,扩容16*0.75=12个)

JDK8之前,新元素存入数组,占老元素位置,老元素挂在下面(链表)

JDK8之后,新元素挂在老元素下面(链表),当链表长度超过8,且数组长度
>=64时,自动将链表转成红黑树

如果Set集合认为两个内容一样的对象是重复的,必须重写对象的HashCode()方法和equals()方法

b. LinkedHashSet : 有序,不重复,无索引(基于哈希表实现,底层基于LinkedHashMap实现)

每个元素都额外多了一个双链表的机制记录它前后元素的位置

c. TreeSet : 按照大小默认升序排序,不重复,无索引(基于红黑树实现)

存储自定义的对象时,必须制定规则排序,支持如下两种方法(见 对象排序的两种方法)

Map:双列集合,每个元素包含两个值(键值对)

键不可以重复,值可以重复

在做购物车时,商品与购买数量是一对数据等等

把Map集合变成Set集合(把一个键值对看成一个元素)

Set<Map.Entry<String, Integer>> entries = map.entrySet();

map集合三种遍历方式如下

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public class MapTest1 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("张三",20);
        map.put("张三",21);
        map.put("李四",19);
        map.put("王五",20);

        System.out.println(map);


        //键找值
        //获取map集合的全部键
        Set<String> keys = map.keySet();
        System.out.println(keys);
        //遍历全部的键,获得值
        for (String key : keys) {
            Integer i = map.get(key);
            System.out.println(key+"==>"+i);
        }

        //把键值对看成一个整体进行遍历
        //1.调用map集合提供的entrySet方法,把map集合转换成键值对类型的set集合
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        //entires = {(张三=21),(李四=19),(王五=20)}
        for (Map.Entry<String, Integer> entry:entries) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"==>"+value);
        }

        //lambda表达式遍历
        map.forEach((k,v) -> {
            System.out.println(k+"==>"+v);
        });
        //即
        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String k, Integer i) {
                System.out.println(k+"==>"+i);
            }
        });

    }
}

1.HashMap(由键决定特点):无序,不重复,无索引(基于哈希表实现)

键相同时,后边的内容会覆盖前边的

public class MapTest1 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("手表",2);
        map.put("手表",15);
        map.put("手机",5);
        map.put(null,null);
        System.out.println(map);
        //{null=null, 手表=15, 手机=5}
    }
}
  • HashMap集合是一种增删改查数据,性能都较好的集合
  • 但是他是无序的,不能重复,没有索引支持的(由键决定的特点)
  • HashMap的键依赖HashCode方法和equals方法保证键的唯一
  • 如果存储的是自定义类型的对象,可以通过重写通过 HashCode方法和equals方法,这样可以保证多

个对象内容一样时,HashMap集合就能认为是重复的

a.LinkedHashMap:有序,不重复,无索引

底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)

2.TreeMap:按照大小默认升序排序,不重复,无索引

集合的并发修改异常

  • 使用迭代器遍历时,又同时在删除集合中的数据,程序就会出现并发修改异常
  • 使用 增强for循环,lambda表达式 遍历集合并删除数据,没有办法解决bug

解决办法

  List<String> list = new ArrayList<>();
        list.add("java1");
        list.add("java2");
        list.add("java2");
        list.add("java21");
        list.add("java3");
        list.add("java11");
        //迭代器遍历
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String name = iterator.next();
            if (name.contains("1")){
//                list.remove(name);//会出现并发错误,会漏删
                iterator.remove();//删除迭代器当前遍历到的数据,每删除一个数据后,相当于在底层做了i--
            }
        }

        //for循环遍历
        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i);
            if (name.contains("1")){
                list.remove(name);
                i--;
            }
        }

可变参数

  • 就是一种特殊形参,定义在方法,构造器的形参列表里,格式是:数据类型,参数名称
特点和好处
  • 好处:可以不传数据给他;可以同时传一个或者同时传多个数据给他;也可以传一个数组给她
  • 好处:常常用来灵活的接收数据
注意:
  • 一个形参列表中,只能有一个可变参数
  • 可变参数必须放到形参列表的最后边
public class ParamTest {
    public static void main(String[] args) {
        test();
        test(1);
        test(1,2);
        test(new int[]{1,2,3});
    }

    //一个形参列表中,只能有一个可变参数
    //可变参数必须放到形参列表的最后边
    public static void test(int...nums){
        //可变参数在方法内部,本质就是一个数组
        System.out.println(nums.length);
        System.out.println(Arrays.toString(nums));
        System.out.println("----------------");

    }
}

Collections是一个用来操作集合的工具类

集合的嵌套:集合中的元素又是另外一个集合

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

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

相关文章

9【原型模式】复制一个已存在的对象来创建新的对象

你好&#xff0c;我是程序员雪球。 今天我们来学习23种设计模式之原型模式&#xff0c;在平时开发过程中比较少见。我带你了解什么是原型模式&#xff0c;使用场景有哪些&#xff1f;有什么注意事项&#xff1f;深拷贝与浅拷贝的区别&#xff0c;最后用代码实现一个简单的示例…

机器学习-随机森林温度预测模型优化

文章目录 前言旧模型训练新模型训练参数查看组合参数训练学习模型评估 前言 在机器学习-随机森林算法预测温度一文中&#xff0c;通过增大模型训练数据集和训练特征的方式去优化模型的性能&#xff0c;本文将记录第三方种优化方式&#xff0c;通过调整随机森林创建模型参数的方…

专业照片编辑软件ON1 Photo RAW 2024 mac/win

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面&#xff0c;即便对于摄影新手&#xff0c;也能快速上手。软件支持RAW格式照片处理&#xff0c;能够完整保留照片原始信息&#xff0c;让后期调整更加灵活。 在功能方面&#…

[Linux][基础IO][一][系统文件IO][文件描述符fd]详细解读

目录 0.预备知识1.系统文件I/O1.open2.write/read/close/lseek 2.文件描述符fd1.[0 & 1 & 2]2.什么是文件描述符&#xff1f;3.文件描述符的分配规则4.重定向5.使用dup2系统调用 -- 完成重定向6.FILE 0.预备知识 什么叫做文件呢&#xff1f; 站在系统的角度&#xff0…

【全网独家】oceanbase容器重启时报obshell failed错误,无法正常启动的问题处理

正常运行的oceanbase容器&#xff0c;重新启动该容器却启动不了&#xff0c;重启服务器也无法恢复&#xff0c;报obshell failed错误&#xff0c;无法正常启动&#xff0c;本文记录了问题处理过程。 一、问题现象 1、正常运行的oceanbase容器&#xff0c;重启却启动不了 2、运…

CSS中:root伪类的说明和使用

定义和用法 :root选择器用匹配文档的根元素。在HTML中根元素始终是HTML元素&#xff0c;所以也可以把:root理解为html根元素选择器&#xff0c;但是比html根元素的优先级高&#xff0c;:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。CSS :root 选择器 | …

Win11 WSL2 install Ubuntu20.04 and Seismic Unix

Win11系统&#xff0c;先启用或关闭Windows功能&#xff0c;勾选“适用于Linux的Windows子系统”和“虚拟机平台”两项 设置wsl默认版本为wsl2&#xff0c;并更新 wsl --list --verbose # 查看安装版本及内容 wsl --set-default-version 2 # 设置wsl默认版本为wsl2 # 已安装…

Go微服务: go-micro集成consul的注册中心和配置中心

微服务与注册中心的关系图 这个图很好说明了微服务之间的关系&#xff0c;以及consul注册中心的重要性 环境准备 1 &#xff09;consul 集群 假设consul 集群已经搭建&#xff0c;已有5台server和2台client这里2台client被nginx做负载均衡&#xff0c;假设最终本地的访问地址…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

蓝桥杯:握手问题和小球反弹问题

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#xff08;且仅有一次&#x…

Hadoop概述及集群搭建

文章目录 一、Hadoop介绍二、Hadoop发展简史三、Hadoop核心组件四、Hadoop架构变迁1、Hadoop 1.02、Hadoop 2.03、Hadoop 3.0 五、Hadoop集群简介六、Hadoop部署模式七、Hadoop 集群搭建第一步&#xff1a;创建虚拟机第二步&#xff1a;安装Linux镜像第三步&#xff1a;网络配置…

Spring Cloud 集成 RabbitMQ

目录 前言步骤引入相关maven依赖添加相关配置 使用方法配置消息序列化创建第一个消息队列和交换机使用方法 总结 前言 在当今的微服务架构盛行的时代&#xff0c;消息队列作为一种重要的通信机制&#xff0c;在分布式系统中扮演着不可或缺的角色。RabbitMQ&#xff0c;作为一款…

(七)C++自制植物大战僵尸游戏关卡数据加载代码讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 打开LevelData.h和LevelData.cpp文件。文件位置如下图所示。 LevelData.h 此头文件中定义了两个类&#xff0c;分别是OpenLevelData、LevelData&#xff0c;其中OpenLevelData用于加载文件数据。LevelData解析数据…

ansible创建用户账户和更新ansible库的密钥

1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表&#xff0c;并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook &#xff0c;从⽽…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…

解决方案ImportError: cannot import name ‘BertTokenizerFast‘ from ‘transformers‘

文章目录 一、现象二、解决方案 一、现象 从transformers 库调用该包的时候 from transformers import BertTokenizer, AdamW, BertTokenizerFast报错显示 ImportError: cannot import name ‘BertTokenizerFast’ from ‘transformers’ 二、解决方案 追溯查看transforme…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、QT5 存在一些问题四、PyQt5 存在一些问题五、OpenGL的析构问题 一、说明 应用QT做程序界面&#xff0c;在程序退出的时候&#xff0c;需要调用析构函数释放资源&#xff0c;这个操作在Pytho…

跟TED演讲学英文:Why AI is incredibly smart and shockingly stupid by Yejin Choi

Why AI is incredibly smart and shockingly stupid Link: https://www.ted.com/talks/yejin_choi_why_ai_is_incredibly_smart_and_shockingly_stupid Speaker: Yejin Choi Date: April 2023 文章目录 Why AI is incredibly smart and shockingly stupidIntroductionVocabul…

通过调用Vcenter-Api获取Vcenter中服务器信息

通过调用Vcenter-Api获取Vcenter中服务器信息 文章目录 通过调用Vcenter-Api获取Vcenter中服务器信息1. 获取Vmware API帮助文档2. 获取访问凭证3. 获取服务器清单4. 获取服务器更多信息5. 获取虚机更多信息6. 获取磁盘信息7. 获取操作系统相关 1. 获取Vmware API帮助文档 htt…

面试八股——Spring——AOP与事务

AOP的定义 事务的实现 事务的失效场景 异常捕获处理 下图中由于②导致异常&#xff1a; 原因&#xff1a; 解决办法&#xff1a;自己抛出一个非检查异常&#xff08;具体原因看“抛出检查异常”&#xff09;。 抛出检查异常 由于①出错&#xff0c;导致抛出了检查异常 原因&…