集合、List、Set、Map、Collections、queue、deque

概述

相同类型的数据进行统一管理操作,使用数据结构、链表结构,二叉树
分类:Collection、Map、Iterator

集合框架

在这里插入图片描述

List接口

有序的Collection接口,可以对列表中的每一个元u尿素的插入位置进行精确的控制,用户可以根据元素的整数索引访问元素,并搜索列表中的元素
有序,允许多个null元素
常用类:ArrayList、Vector、LinkedList

ArrayList

实现原理:采用动态对象数组实现,默认构造方法构造了一个空数组
第一次添加元素,扩容为10,之后的扩容算法为原来的数组大小+原理啊数组的一半
不适合插入和删除操作
为了防止数组动态扩充太多,建议给你一个初始容量,
线程不安全,适合在单线程使用

Vector

实现原理采用动态数组实现,默认的初始容量为10动态数组
扩容算法:当增量为0时,原来的两倍,当增量大于0时,扩容为原来的大小+增量
不适合插入和删除操作
对于数组扩充太多的建议使用Vector,有初始容量
线程安全,效率低,多线程下使用

LinkedList

底层实现采用双向链表,高效、无序,插入和删除的特性,性能高,

实际开发中如何选择?

1.安全性?Vector
2.是否频繁插入和操作 LinkedList
3.是否存储后遍历 ArrayList

Set接口

一个不包含重复元素的Collection,set不不包含相同元素,并且最多包含一个null元素、无序
HashSet、TreeSet、LinkedHashSet,底层实现与Map关联

HashSet

实现Set类,由哈希表支持,不保证set的迭代顺序,特别时不保证改顺序恒久不变,运行使用null元素
实现原理:基于哈希表(HashMap)实现
不允许重复元素,可以有一个null元素
不保证恒久不变的顺序
添加元素时,把元素作为hashMap的key,value使用一个固定的object对象
排除重复元素使用的时equlas(),如何判断对象是否重复,hashCode()和equals()进行判断
判断两个元素是否相同,先判断两个对象的hashCode是否相同,(如果相同,不一定是同一个对象,不同一定不是同一个对象),相同在比较equals,相同,才相同。
自定义对象哟啊任务属性值都是相同为同一个对象,有这种需求时,重写对象所在类的HashCode和eqals方法
存储结构:数组+链表,数组的元素以链表的形式存储
要把数据存储到哈希表中,首先是计算HashCode的值,再对数组取余,最终决定数据存储的位置

TreeSet

基于TreeMap的NavigableSet实现,让元素的自然顺序进行排序,或者根据创建set提供的Comparator进行排序,取决于构造方法
有序的,基于TreeMap实现(二叉树结构实现),对象需要比较大小,通过比较器来实现,去除重复数,如果自定义的类没有实现比较器结构,将无法添加到treeSet集合中

LinkedHashSet

哈希表和链表的实现
维护着一个运行于所哟条目的双重链表接列表,链表定义迭代顺序,按照元素插入到set的顺序进行迭代

区别:
要排序:TreeSet
不排序,不用保证顺序hashSet
不排序,要顺序LinkedHashSet

Iterator 接口

package com.ty.collectionPackage;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class IteratorDemo {
    public static void main(String[] args) {
        List<Cat> list = new ArrayList<>();
        Cat c1 = new Cat("oo", 2, 1);
        Cat c2 = new Cat("dd", 3, 2);
        Cat c3 = new Cat("uu", 4, 3);
        Cat c4 = new Cat("oo", 2, 4);
        list.add(c1);
        list.add(c2);
        list.add(c3);
        list.add(c4);
        foreachIterator(list);
        System.out.println("==========");
        IteratorDemo(list);
        System.out.println("=========");
        foreachLambda();

    }
    private static void foreachIterator(Collection<Cat> cats){
        for (Cat cat : cats) {
            System.out.println(cat);
        }
        System.out.println("foreach遍历了");
    }
    private static void IteratorDemo(Collection<Cat> cats){
        Iterator<Cat> iterator = cats.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("Iterator 遍历了");
    }

    private static void foreachLambda(){
        List<Cat> list = new ArrayList<>();
        Cat c1 = new Cat("oo", 2, 1);
        Cat c2 = new Cat("dd", 3, 2);
        Cat c3 = new Cat("uu", 4, 3);
        Cat c4 = new Cat("oo", 2, 4);
        list.add(c1);
        list.add(c2);
        list.add(c3);
        list.add(c4);
        list.forEach((Cat cat) ->{
            System.out.println(cat);
        });

       // list.forEach(cat -> System.out.println(cat));
    }
}

jdk8新特性之Stream

是元素的集合,支持顺序和并行的对原Stream进行汇聚操作
Stream当成高版本的iterator,Iterator用户只能一个一个的遍历严肃并对其操作,而Stream只需要给出需要对其包含元素的操作,这些才做如何对应到每个元素上,由Stream完成

Map接口

将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射一个值
Map:键值对的形式存在
key唯一,value可以重复
具体实现类:hashMap、TreeMap、HashTable、LinkedHashMap

HashMap

基于哈希表的Map接口,提供可选的映射操作,运行使用null值和null键,不保证映射的顺序,特别不保证该顺序恒久不变。

package com.ty.collectionPackage;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo {
    public static void main(String[] args) {
        HashMapDemo();
    }
    private static void HashMapDemo(){
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"tt");
        map.put(2,"yy");
        map.put(3,"zz");
        map.put(4,"cc");
        map.put(5,"pp");
        System.out.println(map.size());
        System.out.println("===========");
        //迭代
        Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
        for (Map.Entry e : entrySet) {
            System.out.print(e.getKey()+"-->"+e.getValue()+" ");
        }
        //迭代
        System.out.println("================");
        Set<Integer> keySet = map.keySet();
        for (Integer i : keySet) {
            String value = map.get(i);
            System.out.print(i+"-->"+value+" ");
        }
        //遍历值
        System.out.println("=============");
        Collection<String> values = map.values();
        for (String value:values){
            System.out.print(value+" ");
        }
        //foreach
        System.out.println("==========");
        map.forEach((key,value)->{
            System.out.print(key+"-->"+value +" ");
        });
    }
}

1.实现原理:基于哈希表(数组+链表+二叉树(红黑树))
2.默认加载因子0.75,默认数组是16
3.把对象存储到哈希表中,把key对象通过hash()方法计算hash值,然后用hash值对数组取余数(默认是16),来决定该key在数组存储的位置,当有多个值时,以链表的形式存储,在jdk8后,当链表大于8时,链表转为红黑树,为了取值更快,存储的数据量越大,性能的表现越明显
4.扩容原理:当数组的容量大于0.75,扩充算法:当前数组容量 << 1(相当于*2,)扩大1倍,扩充次数过多,会影响性能,重新散列,每次扩充代表哈希表散列(重新计算每个hash值的存储位置),开发中尽量减少扩充次数。
5.线程不安全,适合单线程

Hashtable

实现一个哈希表,映射到相应的值,任何非null对象都可以作为键值对,为了成功在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法。
1.jdk1开始使用
2.基于哈希表实现(数组+链表)
3.默认数组大小11,加载因子0.75
4.扩容方式原数组大小<<1 (*2)+1
5.线程安全,用在多线程

**** HasMap和Hashtable区别???

LinkedHashMap

哈希表和链接列表实现,可预知的迭代顺序,保证顺序。
是HashMap的子类,由于HashMap无法保证顺序,此类使用双重列表保证元素顺序。

jdk8中map的新方法

在这里插入图片描述

Conllections类

大量针对Collection和Map操作,分为四类,都是静态方法
1.排序操作,针对List接口
在这里插入图片描述

队列Queue

是一种特殊的线性表,先进先出的数据结构,只允许在表的前端front进行删除操作,在表的后端进行删除操作,进行插入操作的叫队尾,删除操作的端叫队头,队列中没有元素时,称为空队列
在这里插入图片描述
LinkedList实现了Queue接口
请求队列,雄安锡队列、任务

Deque

一个线性collection,支持在两端插入和移除元素。支持有容量限制的双端对了,支持没有固定限制的双端队列
接口定义在双端对了两端访问元素的方法,提供插入、移除、查询 Stack 堆栈:先进后出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2 基础面试题

v-show 和 v-if 区别 v-show 通过 CSS display 控制显示和隐藏v-if 通过判断组件真实渲染和销毁&#xff0c;而不是显示和隐藏频繁切换显示状态用 v-show&#xff0c;否则用 v-if v-if 当 v-if 与 v-for 一起使用时&#xff0c;v-for 具有比 v-if 更高的优先级&#xff0c;意…

DT DAY3 信号和槽

作业&#xff1a; 1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 btn3 new QPushButton("按钮3",this);btn3->resize(ui->btn2->width(),ui->b…

有名管道的大小

管道&#xff1a;有名管道、无名管道 通信&#xff1a; 单工通信&#xff1a;固定的读端和写端 -- 广播 半双工通信&#xff1a;同一时刻&#xff0c;只有有一方写&#xff0c;另外一方读:对讲机 全双工通信&#xff1a;随时两方都能读写 -- 电话 特点&#xff1a; 管道属…

Cosmos收益协议Hover以800%的超额认购结束公开销售

Hover&#xff0c;建立在Cosmos的Kava EVM上的可持续收益生态系统&#xff0c;在其公开销售中积累了超过800万美元的存款。 Hover&#xff0c;Kava EVM上新推出的收益生态系统&#xff0c;已经在顶级加密货币Launchpad DAO Maker上结束了其公开销售。通证销售旨在筹集100万美元…

Shell 脚本系列 | xsync同步脚本的使用

xsync是一个同步脚本&#xff0c;它实际上是对rsync脚本的二次封装&#xff0c;可以简化在多个节点之间同步文件的过程。以下是使用xsync工具的基本步骤&#xff1a; 1.确保已安装rsync。如果没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; yum -y install rsync…

GB28181 —— Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台(连接带云台摄像机)

最终效果 简介 GB28181协议是视频监控领域的国家标准。该标准规定了公共安全视频监控联网系统的互联结构&#xff0c; 传输、交换、控制的基本要求和安全性要求&#xff0c; 以及控制、传输流程和协议接口等技术要求&#xff0c;是视频监控领域的国家标准。GB28181协议信令层面…

umi - react web端 集成腾讯即时通信IM,实现自定义翻译功能

项目使用umi - react 框架 在集成腾讯的IM的时候需要用到自定义翻译功能,调用自己的翻译服务 , 于是进行更改,发现按照官网提示的集成含UI的IM是直接下载依赖,然后引入组件包直接用,在官网上没看到有哪里配置自定义翻译的文档 , 于是咨询客服 最初的思路是在消息的更多选项中…

【Linux网络】网络编程套接字(TCP)

目录 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 关于inet_ntoa 简单的单执行流TCP网络程序 TCP socket API 详解及封装TCP socket 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端处理请求 客户端创建套接字 客户端连接服务器 客户端…

ubuntu20配置protobuf 2.5.0

python安装protobuf包 sudo pip2 install protobuf2.5.0github克隆获取安装包 wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz解压并进入该目录 tar -zxvf Protobuf-2.5.0.tar.gz cd protobuf-2.5.0配置安装环境 sudo …

【Vuforia+Unity】AR03-圆柱体物体识别(Cylinder Targets)

1.创建数据库模型 这个是让我们把生活中类似圆柱体和圆锥体的物体进行AR识别所选择的模型 Bottom Diameter:底部直径 Top Diameter:顶部直径 Side Length:圆柱侧面长度 请注意&#xff0c;您不必上传所有三个部分的图片&#xff0c;但您需要先为侧面曲面关联一个图像&#…

Atcoder ABC340 A-D题解

比赛链接:ABC340 话不多说&#xff0c;看题。 Problem A: 签到。 #include <bits/stdc.h> using namespace std; int main(){int a,b,d;cin>>a>>b>>d;for(int ia;i<b;id)cout<<i<<endl;return 0; } Problem B: 还是签到题。一个v…

张宇2025基础三十讲高等数学笔记(数二)

本次主要是根据书课包视频的进程&#xff0c;第1讲的01和02&#xff0c;分为基础知识和书上的例题加上经典1000题对应的相关的知识点 1.基础知识 1&#xff09;函数 2&#xff09;反函数 3&#xff09;复合函数 2.书上例题1000题 1&#xff09;函数 2&#xff09;反函数 3&a…

【Git】:远程仓库操作

远程仓库操作 一.理解版本控制系统二.远程仓库1.克隆2.Push操作3.fetch操作4. .gitnore文件 一.理解版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者计…

杂题——1097: 蛇行矩阵

题目描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 输入格式 本题有多组数据&#xff0c;每组数据由一个正整数N组成。&#xff08;N不大于100&#xff09; 输出格式 对于每一组数据&#xff0c;输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角…

猜字谜|构建生成式 AI 应用实践(一)

在 2023 亚马逊云科技 re:Invent 之后&#xff0c;细心的开发者们也许已经发现有一个很有趣的动手实验&#xff1a;开发一款可部署的基于大语言模型的字谜游戏&#xff1a; 该款游戏使用了文生图模型为玩家提供一个未知的提示词&#xff0c;玩家需要根据模型生成的图像来猜测该…

Covalent Network(CQT)与 Movement Labs 达成合作,重新定义 M2 系统区块链数据可用性与性能

Covalent Network&#xff08;CQT&#xff09;是行业领先的多链索引器&#xff0c;正在与 Movement Labs 的 M2 展开具有突破性意义的合作。M2 是以太坊上的首个 Move-EVM&#xff08;MEVM&#xff09;ZK rollup 。这一战略合作标志着先进的实时数据索引和部署工具&#xff0c;…

如何实现H5和小程序之间相互跳转

嗨&#xff0c;各位小伙伴们&#xff0c;我是你们的好朋友咕噜铁蛋&#xff01;今天&#xff0c;我要和大家分享一下关于如何实现H5和小程序之间相互跳转的话题。随着移动互联网的发展&#xff0c;H5网页和小程序已经成为了我们日常生活中不可或缺的一部分。那么&#xff0c;如…

SD-WAN组网:打造跨国企业无缝网络连接体验

在数字化转型的时代&#xff0c;越来越多的企业迈向国际化&#xff0c;然而&#xff0c;由于自建网络架构的限制和跨域网络的复杂性&#xff0c;企业在不同地理位置的站点之间难以实现高效的数据互通和协作。这就是为什么SD-WAN成为跨国企业组网的理想选择的原因。 跨国企业常见…

vue中使用wangEditor富文本编辑器

jsd-2306-vue-01: 教学项目教学项目教学项目教学项目教学项目 2306-vue-baking-teacher: 教学项目教学项目教学项目教学项目 一、脚手架工程中使用富文本编辑器wangEditor 1.通过以下命令 安装wangEditor npm i wangeditor -S 2.在main.js文件中添加以下配置信息 //引入wa…

python 打包 apk

转换之前python代码需要使用指定的框架才能转换&#xff0c;列如&#xff1a;kivy from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Buttonimport time import pyautogui import threadingstatus False# 这是一个将被线程执…
最新文章