java数组容器的分析数组、List和Set、Map
- 格式:doc
- 大小:50.50 KB
- 文档页数:12
java中常用的数据结构
Java中常用的数据结构有:
1. 数组(Array):一组具有相同类型的数据元素的集合,通
过索引来访问元素。
2. 链表(LinkedList):由若干个节点组成,每个节点包含数
据和指向下一个节点的指针。
3. 栈(Stack):一种后进先出(LIFO)的数据结构,只允许
在栈顶进行插入和删除操作。
4. 队列(Queue):一种先进先出(FIFO)的数据结构,只允
许在队头和队尾进行插入和删除操作。
5. 集合(Set):一种不允许重复元素的数据结构,常见的实
现类有HashSet和TreeSet。
6. 列表(List):一种有序的数据结构,允许重复元素,常见
的实现类有ArrayList和LinkedList。
7. 字典(Map):一种键值对的数据结构,以键作为唯一标识
符来存储和访问元素,常见的实现类有HashMap和TreeMap。
8. 堆(Heap):一种可以快速找到最大值(或最小值)的数
据结构,常用于优先队列的实现。
9. 树(Tree):一种层次关系的数据结构,包含根节点、子节
点和叶子节点等。
10. 图(Graph):由节点和节点之间的关系(边)组成的数据结构,常用于描述网络等复杂关系。
这些数据结构在Java中都有对应的类或接口,可以根据具体
的需求选择合适的数据结构来使用。
Java中常用的容器类有哪些?它们有什么特点?2023年的今天,Java作为一门跨平台的面向对象编程语言,在软件开发领域继续得到广泛的应用。
而在Java中,容器类是不可或缺的一部分,它们为程序员提供了方便易用的数据结构和算法,进而帮助他们快速实现各种功能。
本文将详细介绍Java中常用的容器类,并探讨它们的特点和使用方式。
1. ListList是Java中最基本的容器类之一,它也是最常用的容器之一。
List容器可以按顺序存储一组对象,并允许有重复元素。
List容器提供了一系列的操作方法,包括增加、删除、获取、修改等操作。
在Java中,常见的List容器包括ArrayList、LinkedList和Vector 等。
- ArrayListArrayList是用数组实现的List容器。
它的优点是支持随机访问,插入和删除元素时效率高,而缺点则是在删除元素时需要移动数组的其他元素。
因此,ArrayList适合用于索引域比较小的场合。
- LinkedList相比ArrayList,LinkedList则是通过双向链表的方式实现的容器。
LinkedList支持插入和删除元素时具有较高的效率,而随机访问效率较低。
因此,当需要频繁地进行插入和删除操作时,LinkedList 可以提供更好的性能。
- VectorVector是一个同步的List容器,在多线程环境中更加稳定。
Vector与ArrayList类似,也是用数组实现的容器,并且支持随机访问。
2. SetSet是另一种常用的容器类,它用于存储一组无序的元素。
Set容器具有不允许有重复元素的特点,并提供一系列的操作方法,包括增加、删除、包含等操作。
在Java中,常见的Set容器包括HashSet、LinkedHashSet和TreeSet等。
- HashSetHashSet是使用哈希表实现的Set容器,它具有快速查找元素的特点。
HashSet容器不允许重复元素,因此它适合用于元素去重的场合。
2020年第10期104计算机应用信息技术与信息化浅谈JAVA 集合框架及其应用段莎莉* DUAN Sha-li摘 要 在计算机应用技术领域的学习中,灵活运用各种各样的数据结构可以说是一项基本技能,了解各种数据结构的底层源码将有助于用户更好地使用各种开源框架,java 语言凭借其跨平台的先天优势及桌面端、WEB 端、移动端等多场景的应用成为许多程序员追捧的对象,本文将结合jdk6.0源码分析java 集合框架中常用的接口和实现类对应的底层数据结构及其特点,便于在实际业务开发中做出更好地选择。
关键词 java 集合框架;数据结构;应用doi:10.3969/j.issn.1672-9528.2020.10.032* 山西国际商务职业学院 山西太原 0300311 java 集合框架简介java 集合框架位于java.util 包中,作为对数组结构的补充,当元素个数即将超过容器定义的长度时,它会乘以系数进行自动扩容。
根据存储元素种类的不同可分为两大类,有存储元素为单个引用型数据的Collection 集合和存储元素为<键,值>组合的Map 集合,二者本身没有任何联系,但是Map集合中元素的key 是无序不可重复的,其底层是Col-lection 集合中的Set 集合,这样就可以通过Collection 集合的迭代器遍历Map 集合的key,从而遍历到整个集合的元素记录。
它们之间的实现、继承关系见图1、图2所示。
图1 Collection 接口中常用集合类继承关系图图2 Map 接口中常用集合类的继承关系图计算机应用信息技术与信息化2 集合底层的数据结构及其特点2.1 Collection集合Collection集合中常用的子接口有List和Set。
List中的元素是有序可重复的,常用的实现子类有Ar-rayList、LinkedList和Vector。
ArrayList和Vector底层均采用数组的线性结构,每个元素有唯一的下标索引便于查找,与此同时,元素的位置相对固定造成在增、删元素时需要大量地移动元素才能进行,影响效率,但add()方法是在集合尾部增加元素,这是不受影响的。
Java中常见数据结构:list与map1 1:集合2 Collection(单列集合)3 List(有序,可重复)4 ArrayList5底层数据结构是数组,查询快,增删慢6线程不安全,效率⾼7 Vector8底层数据结构是数组,查询快,增删慢9线程安全,效率低10 LinkedList11底层数据结构是链表,查询慢,增删快12线程不安全,效率⾼13 Set(⽆序,唯⼀)14 HashSet15底层数据结构是哈希表。
16哈希表依赖两个⽅法:hashCode()和equals()17执⾏顺序:18⾸先判断hashCode()值是否相同19是:继续执⾏equals(),看其返回值20是true:说明元素重复,不添加21是false:就直接添加到集合22否:就直接添加到集合23最终:24⾃动⽣成hashCode()和equals()即可2526 LinkedHashSet27底层数据结构由链表和哈希表组成。
28由链表保证元素有序。
29由哈希表保证元素唯⼀。
30 TreeSet31底层数据结构是红⿊树。
(是⼀种⾃平衡的⼆叉树)32如何保证元素唯⼀性呢?33根据⽐较的返回值是否是0来决定34如何保证元素的排序呢?35两种⽅式36⾃然排序(元素具备⽐较性)37让元素所属的类实现Comparable接⼝38⽐较器排序(集合具备⽐较性)39让集合接收⼀个Comparator的实现类对象40 Map(双列集合)41 A:Map集合的数据结构仅仅针对键有效,与值⽆关。
42 B:存储的是键值对形式的元素,键唯⼀,值可重复。
4344 HashMap45底层数据结构是哈希表。
线程不安全,效率⾼46哈希表依赖两个⽅法:hashCode()和equals()47执⾏顺序:48⾸先判断hashCode()值是否相同49是:继续执⾏equals(),看其返回值50是true:说明元素重复,不添加51是false:就直接添加到集合52否:就直接添加到集合53最终:54⾃动⽣成hashCode()和equals()即可55 LinkedHashMap56底层数据结构由链表和哈希表组成。
JAVA数组操作的常用工具类在Java中,数组是一种包含固定数量元素的数据结构。
数组操作是在数组中执行各种任务的过程,并且在编程中经常遇到。
为了简化数组操作的过程,Java提供了许多常用的工具类来处理数组。
下面是Java数组操作的常用工具类。
1. Arrays类:Arrays类提供了许多静态方法来处理数组,其中一些常用的方法包括:- sort(:对数组进行排序。
- binarySearch(:在排序后的数组中查找指定元素的索引。
- toString(:将数组转换为字符串。
- equals(:比较两个数组是否相等。
- fill(:将数组的所有元素设置为指定值。
2. System类:System类提供了一些用于操作数组的静态方法,其中一些常用的方法包括:- arraycopy(:将一个数组的部分元素复制到另一个数组。
- identityHashCode(:获取数组的哈希码。
3. Collections类:Collections类是Java集合框架的一部分,但也可以用于处理数组。
其中一些常用的方法包括:- sort(:对数组进行排序。
- binarySearch(:在排序后的数组中查找指定元素的索引。
4. Arrays类与Collection接口转换:Arrays类和Collection接口之间提供了一些静态方法,可以将数组转换为Collection,并将Collection转换为数组。
其中一些常用的方法包括:- asList(:将数组转换为List。
- toArray(:将Collection转换为数组。
- toList(:将Collection转换为List。
5. Arrays类与Stream接口转换:Java 8引入了Stream接口,可以对数组进行处理。
Arrays类提供了一些方法来将数组转换为Stream,并从Stream转换为数组。
其中一些常用的方法包括:- stream(:将数组转换为Stream。
《Java程序设计》课程教学大纲课程编号:08120031课程名称:Java程序设计/JAVA Programming总学时/学分:48/3(其中理论32学时,实验16学时)适用专业:计算机科学与技术一、课程目标通过本课程学习,学生应达到如下目标:目标1. 识别Java语言特点、基本语法、语言机制。
目标2. 将面向对象方法知识运用在程序设计案例中,能使用JAVA常用类、枚举、lambda 表达式、容器、泛型进行实例编程验证。
目标3. 利用JavaSE中的异常处理、输入输出等技术来表达处理程序应用问题。
目标4. 将图形用户界面和数据库编程技术运用中综合应用程序设计中。
目标5. 搭建Java开发环境,能设计实现各种Java技术的应用程序,且能测试运行。
二、课程目标对毕业要求的支撑三、教学过程安排四、实验或上机内容五、课程目标达成方法六、考核标准本门课程考核包括6个部分,分别为考试、作业、实验、讨论和测验。
具体要求及评分方法如下:1、期末考试试卷知识点要求2、作业3、实验4、讨论设置讨论课一次,要求学生按照讨论题目分组查阅资料,归纳总结,撰写报告。
5、测验随堂测验,老师给出题目,学生回答。
具体有任课老师给出评分标准。
七、教材及主要参考资料[1] 黑马程序员. Java基础入门(第2版)[M]. 清华大学出版社, 2018.[2] 郑人杰、马素霞、殷人昆. 软件工程概论(第2版)[M]. 机械工业出版社,2016.[3] Gay S.Horstmann. Java核心技术(第10版)[M]. 机械工业出版社,2016.[4] Y.Daniel Liang(美). Java语言程序设计(第10版)[M]. 机械工业出版社.2015.[5] 李刚. 疯狂Java讲义(第4版)[M]. 电子工业出版社,2018.[6] 封亚飞. 揭秘Java虚拟机[M]. 电子工业出版社,2017.[7] Bruce Eckel(美). Java编程思想(第4版)[M]. 机械工业出版社,2007.。
2023上半年 大数据分析师(中级)考前冲刺题A1卷1.【单选题】HBase的三层结构不包括()。
A:Zookeeper文件B:ROOT表C:.META.表D:Region正确答案:D答案解析:HBase的三层结构分别是Zookeeper文件,ROOT表,.META.表2.【单选题】HBase与Hadoop生态系统其他组件的关系描述不正确的是()。
A:利用HDFS进行数据存储B:利用Zookeeper进行协同服务管理C:利用Spark进行并行计算D:利用Sqoop进行数据导入与导出正确答案:C答案解析:HBase的并行计算不使用Spark3.【单选题】Hive中having子句通常会和()子句一起出现。
A:selectB:fromC:whereD:group by正确答案:D答案解析:having是分组后进行筛选,需要和group by一起使用4.【单选题】Hive中把弧度转换为角度的函数是()。
A:degreesB:radiansC:todegreesD:toradians正确答案:A5.【单选题】Hive中的函数last_day的作用是()。
A:得到参数所指定时间的后一天B:得到参数所指定时间所在月份的最后一天C:得到参数所指定时间所在年份的最后一天D:得到参数所指定时间的前一天正确答案:B6.【单选题】Hive中加载数据到表中,指定文件路径的关键字是()。
A:pathB:inpathC:directoryD:local正确答案:B答案解析:inpath指定要导入的文件7.【单选题】MySQL中,()不是查询语句中的关键字。
A:group byB:havingC:limitD:update正确答案:D8.【单选题】MySQL中,select ascii('A');的查询结果是()。
A:'A'C:65D:64正确答案:C答案解析:A的编码是659.【单选题】MySQL中,查询所有学生的sno和name的SQL语句是()。
Java中常用的集合类有哪些?它们的使用场景是什么?Java作为目前最为流行的编程语言之一,其优越的面向对象编程思想和强大的类库使其成为了广大编程爱好者和专业开发者的首选语言之一。
在Java开发中,常用的集合类具有广泛的应用场景,可以大大简化我们代码的编写和维护。
在本篇文章中,我们将介绍Java中常用的集合类有哪些,它们的使用场景是什么,以及如何选择合适的集合类来应对各种场景。
一、Java中常用的集合类Java中常用的集合类包括List、Set、Map等,具体如下:1.ListList是Java中最基础和最常用的集合类之一,它是一个有序的集合,可以存储重复的元素。
List提供了一系列的方法用来操作列表中的元素,如添加、删除、获取、修改等。
常见的List有ArrayList 和LinkedList。
2.SetSet是Java中的另一个基础集合类,它是一个无序的集合,不允许存储重复的元素。
Set提供了一系列的方法用来操作集合中的元素,如添加、删除、获取等。
常见的Set有HashSet、TreeSet。
3.MapMap是Java中常用的映射关系集合,它存储键值对,支持通过键来访问值。
Map提供了一系列的方法用来操作映射关系,如添加、删除、获取、修改等。
常见的Map有HashMap、TreeMap、ConcurrentHashMap等。
二、Java中常用集合类的使用场景不同的集合类有不同的使用场景,我们需要根据具体的业务需求来选择合适的集合类。
下面我们来介绍几种常见的使用场景及其对应的集合类。
1.需要随机访问元素的情况:ArrayListArrayList是Java中常用的集合类之一,它支持随机访问,通过索引访问元素的时间复杂度为O(1),是处理元素数量较大的情况下的较好选择。
2.需要频繁插入或删除元素的情况:LinkedListLinkedList是另一个常用的集合类,它支持快速的插入和删除操作,通过节点互相关联实现。
Java核⼼数据结构(List、Map、Set)原理与使⽤技巧JDK提供了⼀组主要的数据结构实现,如List、Set等常⽤数据结构。
这些数据都继承⾃java.util.Collection接⼝,并位于java.util包内。
⼀、List接⼝最重要的三种List接⼝实现:ArrayList、Vector、LinkedList。
它们的类图如下:可以看到,3种List均来⾃AbstratList的实现。
⽽AbstratList直接实现了List接⼝,并扩展⾃AbstratCollection。
ArrayList和Vector使⽤了数组实现,可以认为,ArrayList封装了对内部数组的操作。
⽐如向数组中添加、删除、插⼊新的元素或数组的扩展和重定义。
对ArrayList或者Vector的操作,等价于对内部对象数组的操作。
ArrayList和Vector⼏乎使⽤了相同的算法,它们的唯⼀区别可以认为是对多线程的⽀持。
ArrayList没有对⼀个⽅法做线程同步,因此不是线程安全的。
Vector中绝⼤多数⽅法都做了线程同步,是⼀种线程安全的实现。
因此ArrayList和Vector的性能特性相差⽆⼏。
LinkedList使⽤了循环双向链表数据结构。
LinkedList由⼀系列表项连接⽽成。
⼀个表项总是包含3个部分:元素内容、前驱表项和后驱表项。
如图所⽰:LinkedList的表项源码:private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}⽆论LinkedList是否为空,链表都有⼀个header表项,它既是链表的开始,也表⽰链表的结尾。
Java集合排序及java集合类详解(Collection, List, Set, Map)摘要内容Java里面最重要,最常用也就是集合一部分了。
能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。
本文详细解释了关于Java中的集合是如何实现的,以及他们的实现原理。
关键字:Collection , List ,Set , Map , 集合,框架。
目录1 集合框架 (2)1.1 集合框架概述 (2)1.1.1 容器简介 (2)1.1.2 容器的分类 (4)1.2 Collection (6)1.2.1 常用方法 (6)1.2.2 迭代器 (8)1.3 List (10)1.3.1 概述 (10)1.3.2 常用方法 (11)1.3.3 实现原理 (15)1.4 Map (18)1.4.1 概述 (18)1.4.2 常用方法 (18)1.4.3 Comparable 接口 (23)1.4.4 实现原理 (25)1.4.5 覆写hashCode() (29)1.5 Set (33)1.5.1 概述 (33)1.5.2 常用方法 (34)1.5.3 实现原理 (38)1.6 总结:集合框架中常用类比较 (39)2 练习 (40)3 附录:排序 (41)1集合框架1.1集合框架概述1.1.1容器简介到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一些有意义的事情。
举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员的身份证号。
我们可以通过身份证号来顺序存储每个雇员,但是在内存中实现呢?是不是要准备足够的内存来存储1000个雇员,然后再将这些雇员逐一插入?如果已经插入了500条记录,这时需要插入一个身份证号较低的新雇员,该怎么办呢?是在内存中将500条记录全部下移后,再从开头插入新的记录? 还是创建一个映射来记住每个对象的位置?当决定如何存储对象的集合时,必须考虑如下问题。
Java容器分析--数组数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式。
Java类库提供了一套相当完整的容器类,使用这些类的方法可以保存和操纵对象。
下面分别进行讨论,在研究Java容器类之前,先了解一下Java数组的基本功能和特性。
1. 数组的基本特性数组与其它种类的容器(List/Set/Map)之间的区别在于效率、确定的类型和保存基本类型数据的能力。
数组是一种高效的存储和随机访问对象引用序列的方式,使用数组可以快速的访问数组中的元素。
但是当创建一个数组对象(注意和对象数组的区别)后,数组的大小也就固定了,当数组空间不足的时候就再创建一个新的数组,把旧的数组中所有的引用复制到新的数组中。
Java中的数组和容器都需要进行边界检查,如果越界就会得到一个RuntimeException 异常。
这点和C++中有所不同,C++中vector的操作符[]不会做边界检查,这在速度上会有一定的提高,Java的数组和容器会因为时刻存在的边界检查带来一些性能上的开销。
Java中通用的容器类不会以具体的类型来处理对象,容器中的对象都是以Object类型处理的,这是Java中所有类的基类。
另外,数组可以保存基本类型,而容器不能,它只能保存任意的Java对象。
一般情况下,考虑到效率与类型检查,应该尽可能考虑使用数组。
如果要解决一般化的问题,数组可能会受到一些限制,这时可以使用Java提供的容器类。
2. 操作数组的实用功能在java.util.Arrays类中,有许多static静态方法,提供了操作数组的一些基本功能:equals()方法----用于比较两个数组是否相等,相等的条件是两个数组的元素个数必须相等,并且对应位置的元素也相等。
fill()方法----用以某个值填充整个数组,这个方法有点笨。
asList()方法----接受任意的数组为参数,将其转变为List容器。
binarySearch()方法----用于在已经排序的数组中查找元素,需要注意的是必须是已经排序过的数组。
当Arrays.binarySearch()找到了查找目标时,该方法将返回一个等于或大于0的值,否则将返回一个负值,表示在该数组目前的排序状态下此目标元素所应该插入的位置。
负值的计算公式是“-x-1”。
x指的是第一个大于查找对象的元素在数组中的位置,如果数组中所有的元素都小于要查找的对象,则x = a.size()。
如果数组中包含重复的元素,则无法保证找到的是哪一个元素,如果需要对没有重复元素的数组排序,可以使用TreeSet或者LinkedHashSet。
另外,如果使用Comparator排序了某个对象数组,在使用该方法时必须提供同样的Comparator类型的参数。
需要注意的是,基本类型数组无法使用Comparator进行排序。
sort()方法----对数组进行升序排序。
在Java标准类库中,另有static方法System.arraycopy()用来复制数组,它针对所有类型做了重载。
3. 数组的排序在Java1.0和1.1两个版本中,类库缺少基本的算法操作,包括排序的操作,Java2对此进行了改善。
在进行排序的操作时,需要根据对象的实际类型执行比较操作,如果为每种不同的类型各自编写一个不同的排序方法,将会使得代码很难被复用。
一般的程序设计目标应是“将保持不变的事物与会发改变的事物相分离”。
在这里,不变的是通用的排序算法,变化的是各种对象相互比较的方式。
Java有两种方式来实现比较的功能,一种是实现parable接口,该接口只有一个compareTo()方法,并以一个Object类为参数,如果当前对象小于参数则返回负值,如果相等返回零,如果当前对象大于参数则返回正值。
另一种比较方法是采用策略(strategy)设计模式,将会发生变化的代码封装在它自己的类(策略对象)中,再将策略对象交给保持不变的代码中,后者使用此策略实现它的算法。
因此,可以为不同的比较方式生成不同的对象,将它们用在同样的排序程序中。
在此情况下,通过定义一个实现了Comparator接口的类而创建了一个策略,这个策略类有compare()和equals()两个方法,一般情况下实现compare()方法即可。
使用上述两种方法即可对任意基本类型的数组进行排序,也可以对任意的对象数组进行排序。
再提示一遍,基本类型数组无法使用Comparator进行排序。
Java标准类库中的排序算法针对排序的类型进行了优化——针对基本类型设计了“快速排序”,针对对象设计的“稳定归并排序”。
一般不用担心其性能。
Java容器分析--List和Set容器类可以大大提高编程效率和编程能力,在Java2中,所有的容器都由SUN公司的Joshua Bloch进行了重新设计,丰富了容器类库的功能。
Java2容器类类库的用途是“保存对象”,它分为两类:Collection----一组独立的元素,通常这些元素都服从某种规则。
List必须保持元素特定的顺序,而Set不能有重复元素。
Map----一组成对的“键值对”对象,即其元素是成对的对象,最典型的应用就是数据字典,并且还有其它广泛的应用。
另外,Map可以返回其所有键组成的Set和其所有值组成的Collection,或其键值对组成的Set,并且还可以像数组一样扩展多维Map,只要让Map中键值对的每个“值”是一个Map即可。
1.迭代器迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。
迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:(1) 使用方法iterator()要求容器返回一个Iterator。
第一次调用Iterator的next()方法时,它返回序列的第一个元素。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
2.List的功能方法List(interface): 次序是List最重要的特点;它确保维护元素特定的顺序。
List为Collection添加了许多方法,使得能够向List中间插入与移除元素(只推荐LinkedList使用)。
一个List 可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和删除元素。
ArrayList: 由数组实现的List。
它允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和删除元素,因为这比LinkedList开销要大很多。
LinkedList: 对顺序访问进行了优化,向List中间插入与删除得开销不大,随机访问则相对较慢(可用ArrayList代替)。
它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
3.Set的功能方法Set(interface): 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。
加入Set的Object必须定义equals()方法以确保对象的唯一性。
Set与Collection有完全一样的接口。
Set 接口不保证维护元素的次序。
HashSet: 为快速查找而设计的Set。
存入HashSet的对象必须定义hashCode()。
TreeSet: 保持次序的Set,底层为树结构。
使用它可以从Set中提取有序的序列。
LinkedHashSet: 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。
于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
HashSet采用散列函数对元素进行排序,这是专门为快速查询而设计的;TreeSet采用红黑树的数据结构进行排序元素;LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。
需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。
Java容器分析--Map标准的Java类库中包含了几种类型的Map,它们都拥有同样的基本接口Map,但是行为特性各不相同,主要表现在效率、键值对的保存、元素呈现次序、对象的保存周期和判定键是否等价的策略等方面。
1.Map的功能方法Map(interface): 维护label和value的关联性,使得可以通过label查找value。
HashMap: Map基于散列表的实现,取代了Hashtable。
插入和查询label/value的开销是固定的,并且可以通过构造器设置容量和负载因子,以调整容器的性能。
LinkedHashMap: 在HashMap的基础上做了一些改进,在迭代遍历它时,取得label/value的顺序是其插入的次序,或者是最近最少使用(LRU)的次序,速度上比HashMap要慢一点,但在迭代访问时速度会更快,主要原因是它使用了链表维护内部次序。
TreeMap: 查看label或label/value时,元素会被排序,其次序由Comparable或Comparator 决定,因此查询所得到的结果是经过排序的。
另外,它是唯一带有subMap()方法的Map具体类,即返回一个子树。
它也是SortedMap接口的唯一实现,subMap()方法也是从该接口继承的。
WeakHashMap: Weak Key映射,允许释放映射所指向的对象。
当映射之外没有引用指向某个label时,此label可以被垃圾收集器回收。
IdentityHashMap: 使用==代替equals()对label进行比较的散列映射。
2.hashCode()当使用标准库中的类Integer作为HashMap的label时,程序能够正常运行,但是使用自己创建的类作为HashMap的label时,通常犯一个错误。
在HashMap中通过label查找value时,实际上是计算label对象地址的散列码来确定value的。
一般情况下,我们是使用基类Object的方法hashCode()来生成散列码,它默认是使用对象的地址来计算的,因此由第一个对象new Apple(5)和第二个对象new Apple(5)生成的散列码是不同的,不能完成正确的查找。