Java - 提高(9) - 集合

win10 运行lisflood_8踩过的坑 1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、 阅读详情

集合


参考资料:
http://www.cnblogs.com/chenssy/ 


1. Collection接口

          Collection接口是最基本的集合接口,它不提供直接的实现,如List/Set 都是继承自Collection接口

          Collection所代表的是一种规则,它所包含的元素都必须遵循一条或者多条规则。如有些允许重复有些不允许重复,

          有些必须按照顺序插入而有些则是散列,有些支持排序但是有些不支持排序。


          在Java中所有实现了Collection接口的类都必须提供两个标准构造函数:

          a. 一个无参,用于创建一个空的Collection

          b. 一个带有Collection参数的有参构造函数,用于创建一个新的Collection,这个新的Collection与传入进来的Collection具备相同的元素


2. List接口

          List接口为Collection直接接口。

          List锁代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。

          用户可以对列表中每个元素的插入元素位置进行精确控制,同时可以根据元素的整数索引(用列表中的位置)访问元素,并搜索列表中的元素。

          实现List接口的集合主要有:ArrayList,LinkedList,Vector,Stack


          a. ArrayList

                    ArrayList是一个动态数组。它允许任何符合规则的元素插入包括null。

                    每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中元素不断地增加,容器的大小也会随着增加。

                    在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。

                    所以如果我们 明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

                    ArrayList擅长于随机访问,同时ArrayList是非同步的。


                    注:随机访问的意思:

                    ArrayList对象在底层是以数组的形式存储元素的,数组便于查询,不利于插入、删除、修改


          b. LinkedList

                    同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。

                    所以它除了有ArrayList的基本操作方法外还额外提供了addFirst,addLast,getFirst,getLast操作LinkedListde的首部或尾部。


                    由于实现方式不同,LinkedList不擅长随机访问,它所有的操作都是按照双重链表执行。

                    在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

                    这样的好处是可以通过较低的代价在List中进行插入和删除操作。


          与ArrayList一样,LinkedList也是非同步的。如果多个线程同时访问一个List,则必须自己实现访问同步。

          一种解决方法是在创建List时构造一个同步的List:

          List list = Collections.synchronizedList(new LinkedList(...));


          c. Vector

                    Vector与ArrayList相似,但是Vector是同步的。

                    所以说Vector是线程安全的动态数组。

                    它的操作与ArrayList集合一样。


          d. Stack

                    Stack继承自Vector,实现一个后进先出的堆栈。

                    Stack提供5个额外的方法使得Vector得以被当做堆栈使用。

                    基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。

                    Stack刚创建后是空栈。


3. Set接口

          Set是一种不包括重复元素的Collection。

          它维持它自己的内部排序,所以随机访问没有任何意义。

          与List一样,它同样运行null的存在但是仅有一个。

          由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,同时要注意任何可变对象,如果在对集合中元素进行操作时,

          导致e1.equals(e2)==true,则必定会产生某些问题。

          实现了Set接口的集合有:EnumSet、HashSet、TreeSet。


          a. EnumSet

                    是枚举的专用Set。所有的元素都是枚举类型。


          b. HashSet

                    HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。

                    它内部元素的顺序是由哈希码来决定的,所以它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。


          c. TreeSet

                    基于TreeMap,生成一个总是处于排序状态的set,内部以TreeMap来实现。

                    它是使用元素的自然顺序对元素进行排序,或者根据创建Set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。


4. Map接口

          Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。

          同时它也没有继承Collection。

          在Map中它保证了key与value之间的一一对应关系。

          也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。

          实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。


          a. HashMap

                    以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的.

                    其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,

                    如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。


          b. TreeMap

                    键以某种排序规则排序,内部以red-black(红-黑)树数据结构实现,实现了SortedMap接口


          c. HashTable

                    也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低


5. Queue

          队列,它主要分为两大类,一类是阻塞式队列,队列满了以后再插入元素则会抛出异常,

          主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。

          另一种队列则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。


6. 异同点

a. Vector和ArrayList

1. vector是线程同步的,所以它也是线程安全的,而ArrayList是非线程同步的,是不安全的。如果不考虑线程安全因素,一般用ArrayList效率比较高。


2. 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而ArrayList增长率为目前数组长度的50%。

如果在集合中使用数据量较大的数据,使用vector有一定的优势。


3. 如果查找一个指定位置的数据,vector和arrayList使用的时间是相同的,这个时候使用vector和arrayList都可以。

ArrayList和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素

但是插入数据要涉及到数组元素的移动等内存操作,所以查询索引数据快,插入数据慢,

Vector由于使用了synchronized方法(线程安全),性能上比ArrayList要差。

LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快


b. Aarraylist和Linkedlist

1. ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构

2. 对于随机访问get和set操作,ArrayList优于LinkedList,因为LinkedList要移动指针。

3. 对于新增和删除操作,add和remove,LinkedList比较占优势,因为ArrayList要移动数据。


第三点需要看实际情况。

若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。

但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList。

因为ArrayList每插入一条数据,要移动插入点以及之后所有的数据。


c. HashMap与TreeMap

1. HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序。

如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)


2. HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,

如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。

集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。


3. 在Map 中插入、删除和定位元素,HashMap 是最好的选择。

但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现

这个TreeMap没有调优选项,因为该树总处于平衡状态。


d. hashtable与hashmap

1. 历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。

2. 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。

3. 值:只有HashMap可以让你将空值作为一个表的条目的key或value 。


7. 对集合的选择

1. 对List的选择

a. 对于随机查询与迭代遍历操作,数组比所有的容器都要快。所以在随机访问中一般使用ArrayList

b. LinkedList使用双向链表对元素的增加和删除提供了非常好的支持,而ArrayList执行增加和删除元素需要进行元素位移。

c. 对于Vector而已,我们一般都是避免使用。

d. 将ArrayList当做首选,毕竟对于集合元素而已我们都是进行遍历,只有当程序的性能因为List的频繁插入和删除而降低时,再考虑LinkedList。


2. 对Set的选择

a. HashSet由于使用HashCode实现,所以在某种程度上来说它的性能永远比TreeSet要好,尤其是进行增加和查找操作。

b. 虽然TreeSet没有HashSet性能好,但是由于它可以维持元素的排序,所以它还是存在用武之地的。


3. 对Map的选择

a. HashMap与HashSet同样,支持快速查询。虽然HashTable速度的速度也不慢,但是在HashMap面前还是稍微慢了些,所以HashMap在查询方面可以取代HashTable

b. 由于TreeMap需要维持内部元素的顺序,所以它通常要比HashMap和HashTable慢。

国产数据库安装部署说明 阅读详情

相关推荐

vivado运行时报错 license文件更新操作

vivado使用:SYNTHESIS->Run Synthesis 时报错 [Common 17-345] A valid license was not found for feature ‘Synthesis’ and/or device ‘xc7vx485t’. Please run the Vivado License Manager for assistance in determiningwhich features and devices are licensed for your sy

qq_44692266的博客 2万+

Java容器(一):容器总结

Java容器家族图容器从最大的概念来分:分为Collection和Map,区别就是Collection是一个槽的,Map是两个槽的(键值对) Collection划分为:List,Set,Queue List接口常见有:ArrayList,LinkedList,AbstractList, CopyOnWriteArrayList, Vector,Stack Set接口常见有:HashSet,T

XXX 3118

抖音风控参数‘bd-ticket-guard-client-data’深度解析:从X.509证书到请求签名的完整链路

本文深度解析抖音风控参数‘bd-ticket-guard-client-data’的技术实现,从X.509证书体系到请求签名的完整安全链路。通过Python代码示例,揭示证书生成、签名算法及票据封装等核心机制,帮助开发者理解现代平台风控系统的多层防御架构设计。

weixin_42525738的博客 433

【Java教程】Day9-04 集合:Map 提高查找效率 —— 从 List 到 Map 的转换

在 Java 中,List和Map是两种常见的数据结构。虽然它们都用于存储对象,但它们的使用场景却有所不同。在实际开发中,我们经常需要根据某个关键字(如学生的名字)查找对应的值(如学生的分数)。在这种情况下,Map是一个比List更高效的选择,特别是当需要进行频繁查找时。

max202011161630的博客 767

第四章 自定义组件、动画

第三章 自定义组件、动画 (一)自定义View 1.1) onMeasure:对当前View的尺寸进行测量 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) widthMeasureSpec和heightMeasureSpec包含测量模式和尺寸大小 int widthMode = MeasureSpec....

Stay Hungry Stay Foolish 求知若饥 虚心若愚 8132

内容创作全流程自动化:OpenClaw+大模型搞定选题+写稿+多平台发布

本文介绍了一套基于OpenClaw的全自动化内容创作流水线方案,帮助垂直领域创作者摆脱重复劳动。该方案将内容生产拆解为选题生成、内容撰写、格式适配、多平台发布四个模块,通过工作流引擎串联执行。系统能自动采集热榜生成选题、调用大模型撰写结构化内容、适配不同平台格式要求,并通过API+浏览器自动化实现多平台发布,全程只需人工最终审核。作者分享了各模块的实现细节,包括热榜采集、内容结构化生成、Markdown转换和发布策略,并提供了工作流编排方法。这套方案能为创作者每天节省约3小时,同时保证内容质量和发布效率。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 49

Java 之 JDK9 对集合添加的优化

  通常,在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 add方法调用,使得代码重复。   Java 9,添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。   JDK9 新特性:     List接口,Set接口,Map接口:里边增加了...

a804847944的博客 172

第八届传智杯微信小程序开发挑战赛练习题库

本文是微信小程序开发练习题库,包含单选题、多选题和判断题三种题型。单选题主要考察小程序开发基础知识,如数组方法、组件使用、API调用等;多选题涵盖样式属性、页面跳转、数据处理等综合知识;判断题则测试开发者对小程序特性、生命周期、功能限制等概念的理解。题目内容涉及小程序开发的各个方面,包括组件使用、API调用、数据绑定、页面配置等核心知识点,适合开发者进行自我测试和知识巩固。

qq_73044452的博客 506

java集合不可变数_java 9新增的不可变集合详解

对于java 9你了解吗?下面的文章内容要给大家介绍的就是java 9新增的不可变集合,一起来了解一下吧。Java9版本之前,如果你要创建一个包含6个元素的Set集合,程序要先创建Set集合,之后,调用6次add()方法向Set集合当中添加元素。Java9对这个方面进行了简化,程序直接调用Set、List、Map的of()方法就能够创建包含N个元素的不可变集合,这样一行代码就能够创建包含N个元素的...

weixin_31201737的博客 256

《QGIS快速入门与应用基础》079:KML/KMZ格式:Google Earth兼容

KML/KMZ是专为地理可视化设计的空间数据格式,原生兼容Google Earth,支持点线面要素标注与多媒体集成。KML为XML文本格式,KMZ是其压缩版本。该格式优势在于可视化表现力强、跨平台共享便捷,适合地理标注、路线分享等场景,但存在属性支持弱、大数据量处理效率低等局限。QGIS中可便捷加载和导出KML/KMZ数据,需注意编码设为UTF-8、勾选"导出样式"以保留可视化效果。建议中小规模标注数据使用KMZ格式,确保关联资源完整,提升共享效率。

LuckyHanMo的博客 772

彻底解决tplink路由器无法访问部分https网站

彻底解决tplink无法访问部分https网站

renkai721的专栏 8766

JDK9对集合添加的优化

通常,我们在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 add方法 调用,使得代码重复。 public class Demo01 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("abc"); list.add("def"); ...

九门宁生 205

一根同轴线,真的扛得住 4K 吗? ——从摄像头带宽算起,聊透车载 SerDes 接口选型

如果你记住这三句话,这篇文章就值了:🎯摄像头带宽 = 分辨率 × 位深 × fps × 开销4K RAW 摄像头 ≈ 3.7Gbps,是现实不是理论SerDes 选型,宁可多留 20%,不要刚刚好。

weixin_43199439的博客 193

Map集合练习

Map集合练习 需求: 计算一个字符串中每个字符出现次数。 分析: 获取一个字符串对象 创建一个Map集合,键代表字符,值代表次数。 遍历字符串得到每个字符。 判断Map中是否有该键。 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。 打印最终结果 遍历字符串的两种方式1.toCh...

Valentino112358的博客 515

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 9 新特性—概述

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!Java 9 发布于 2017 年 9 月 22 日。在传统的 Java 应用中,类路径的机制限制了封装性。即使类被标记为,也可以被同一个类路径中的其他任意代码访问。而且随着应用程序规模的增长,类路径依赖变得越来越复杂。

smart_an的专栏 1028

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java 9 集合与数组新特性详解

在 Java 9 中,集合和数组的 API 迎来了诸多改进,这些改进不仅提升了代码的简洁性,还增强了功能的灵活性。本文将详细介绍 Java 9 中集合和数组的新特性,并通过实例进行演示。

m0_74337424的博客 546

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JDK9新特性之:添加集合元素的优化

JDK9对集合添加的优化 通常,我们在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 add方法 调用,使得代码重复。 public class Demo01 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("abc"); list.add("def

Luis 236

Java 9 - 集合工厂方法

【代码】Java 9 - 集合工厂方法。

学无止境 531

java 9>>1_Java 9~Java11的七大新特性

Java 9~Java11的七大新特性Java 9 -11 引入的新语法和API本地变量类型推断Java 10 就已经引入了新关键词var,该关键词可以在声明局部变量的时候替换类型信息。本地(local)是指方法内的变量声明。Java 10之前,你需要这样声明一个String对象。String str="hello java 9";在Java10里头可以使用var替代String,表达式变成这样:...

weixin_35361243的博客 161

Java 9 学习(简述9个新特性)

1. Java 平台级模块系统 Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开...

ancl290591的博客 115

string转map集合_Java9系列第5篇集合类的增强

我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第5篇。这是真的:java接口中可以定义private 方法资源自动关闭语法的优化-java9系列让一个Jar包在多个JDK版本下面运行Java9响应式...

weixin_39621044的博客 272

Java9新特性介绍

1. Java 平台级模块系统 Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的 A

fly_zhyu的博客 2924

Java9新特性调研

1. Java 平台级模块系统 Java 9 的定义功能是一套全新的模块系统。当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开访问的

liuwenyu01的博客 462

Java9简介

JAVA 9(aka jdk 1.9)是JAVA编程语言开发的主要版本。它的最初版本于2017年9月21日发布。Java 9发布的主要目标是 -

unber的博客 885

Java集合正在发展

Java 9:集合的便利工厂方法 Java 9引入了创建不可变集合的新方法。在某个时候,我们都编写了看起来像这样的代码: List moods = Arrays.asList(“HAPPY”, “SAD”); 从Java 9开始,您现在可以编写以下代码: List moods = List.of(“HAPPY”, “SAD”); 虽然节省六个字符对于那些喜欢非常简洁的代码的人来说可能会令人兴奋,但...

阿志同学 205

JAVA 9的一些新特性

java 9于2017年9月21日发布,今天我们就通过实例来观察下java 9的几个最值得期待的特性。 1.JShell 2. Convenience Factory Methods for Collections 3.接口中的私有方法 1.JShell----The Java Shell Jshell 是一个命令行工具,用来把REPL(Read-Eval-print Loop)和...

qq_40531768的博客 200
上一篇: JVM_16_运行时栈帧结构
下一篇: Apache Thrift - 1 - 简介
Simba_cheng
博客等级 码龄11年 250粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值