电脑桌面
添加盘古文库-分享文档发现价值到电脑桌面
安装后可以在桌面快捷访问

Java集合框架

来源:火烈鸟作者:开心麻花2026-01-071

Java集合框架(精选3篇)

Java集合框架 第1篇

在编程世界里一般需要提供一种机制遍历软件对象的集合。大多数编程语言都有类似于数组的功能并且直接支持数组元素的遍历, 但是现代的编程语言还支持更为复杂的数据结构, 如列表、集合、映射和树, 遍历能力是通过公共方法提供, 而内部细节都隐藏在类的私有部分, 所以程序员不需要了解其内部实现就能够遍历这些数据结构中的元素, 这就是迭代的目的。

迭代器是对集合中的所有元素进行顺序访问并可以对每个元素执行某些操作的机制。迭代器在本质上提供了在封装的对象集合上做“循环”的装置。常见的使用迭代器的例子有:

访问目录中的每个文件并显示文件名;访问队列中的每个客户 (如银行排队) 并判断他或她等待了多久。使用迭代器时, 一般情况下可以循环嵌套, 即可以在同一时间做多个遍历;迭代器应该是无损的, 即迭代行为不应该改变集合本身, 如迭代时不要从集合中移除或插入元素;在某些情况下你还需要使用迭代器的不同的遍历方法, 例如, 树的前序遍历和后序遍历, 或者深度优先和广度优先遍历。

根据Gang of Four, 迭代器设计模式是一种行为模式, 其核心思想是负责访问和遍历列表中的对象, 并把这些对象放到一个迭代器对象中[1]。迭代器的实现方法根据谁来控制迭代分为两种:主动迭代和被动迭代。主动迭代器是由客户程序创建迭代器, 调用next () 行进到下一个元素, 测试查看是否所有元素已被访问等等, 总之客户程序是可以操作的。这种方法在象C++这样的语言中最为常见, 在GoF的书中也是最为关注的方法, 主动迭代器在Java 8之前可以说是Java的唯一选择。被动迭代器则是迭代器本身控制迭代, 即迭代器自行next () 向下走, 针对客户程序来说迭代是透明的, 是不能操作的。这种方法在象LISP这样的语言中很常见。随着Java 8的发布, 这种迭代方法也成为Java程序员的一个选择。

2 Java 8之前的迭代 (Iteration before Java 8)

为了说明Java中的各种迭代方法, 我们需要一个集合并对集合中的元素做些操作, 本文选择代表事物或人物名称的字符串的集合, 我们将简单地打印集合中的每个名称到标准输出。这些基本的思想很容易扩展到更为复杂的对象的集合 (如员工) , 并在处理每一个对象的时候可以涉及更为复杂的操作。

在Java 1.0和1.1中两个主要的集合类是Vector (向量) 和Hashtable (哈希表) , 迭代器是通过一个叫做Enumeration (枚举) 的类实现的。今天无论是Vector还是Hashtable都是泛型类, 但退回到那时泛型还不是Java语言的一部分。代码清单1演示了使用枚举来处理字符串向量的方法。

Vector names = new Vector () ;

names.add ("Apple") ;

names.add ("Orange") ;

Enumeration e = names.elements () ;

while (e.hasMoreElements () )

{

String name = (String) e.nextElement () ;

System.out.println (name) ;

}

代码清单1:使用枚举处理字符串向量

List names = new LinkedList () ;

names.add ("Apple") ;

names.add ("Orange") ;

Iterator i = names.iterator () ;while (i.hasNext () )

{

String name = (String) i.next () ;

System.out.println (name) ;

}

代码清单2:使用迭代器处理字符串列表

Java 1.2推出了集合类 (Collections) , 并通过一个迭代器类 (Iterator) 实现了迭代器设计模式。因为当时在Java 1.2中还没有泛型, 所以对迭代器返回的对象进行强制类型转换仍然是必要的。对于Java版本1.2至1.4, 遍历字符串列表如代码清单2所示。

Java 5给出了泛型、Iterable接口和增强for循环。在增强for循环中, 迭代器的创建和调用它的hasNext () 和next () 方法都发生在幕后, 不需要明确地写在代码中, 因此代码显得更为紧凑。使用Java 5, 我们的例子类似代码清单3所示, 请注意, 在Java 5我们使用的仍然是主动迭代器。

List names = new

LinkedList () ;

names.add ("Apple") ;

names.add ("Orange") ;

for (String name : names)

System.out.println (name) ;

代码清单3:使用泛型和增强for循环

List names = new LinkedList<> () ;

names.add ("Apple") ;

names.add ("Orange") ;

names.forEach (name-> System.out.println (name) ) ;

代码清单4:Java8使用forEach () 方法进行迭代

Java 7为了避免泛型的冗长给出了钻石运算符<>, 从而避免了使用new运算符实例化泛型类时重复指定数据类型。从Java 7开始, 代码清单3中的第一行可以简化成以下形式:List names = new LinkedList<> () ;

3 Java 8中的迭代 (Iteration in Java 8)

3.1 forEach () 方法

Java8为我们提供了新的迭代途径, 它使用lambda表达式开展集合的遍历。Java8最主要的新特性就是lambda表达式以及与此相关的特性, 如流 (streams) , 方法引用 (methodreferences) 和功能接口 (functional interfaces) 。正是因为这些新特性使我们能够使用被动迭代器而不是传统的主动迭代器, 特别是Iterable接口提供了一个被动迭代器的缺省方法 (default method) 叫做forEach () 。缺省方法是Java 8的又一个新特性, 是一个接口方法的缺省实现, 在这种情况下, forEach () 方法实际上是用类似于代码清单3的主动迭代器方式来实现的。

实现了Iterable接口的集合类 (如:所有列表List、集合set) 现在都有一个forEach () 方法, 这个方法接收一个功能接口参数, 实际上传递给forEach () 方法的参数是一个lambda表达式。使用Java 8的功能, 我们的例子将演变成代码清单4中所示的形式。

请注意清单4中的被动迭代与前面三个清单中的主动迭代之间的差异。在主动迭代中由循环结构控制迭代, 并且每次通过循环从列表中获取一个对象, 然后打印出来。而在清单4中没有显式的循环结构, 我们只是告诉forEach () 方法对列表中的对象实施打印, 迭代控制隐含在forEach () 方法中。

3.2 流

如果要做一些比打印名字稍微复杂一点的事情, 比如, 计算以字母A开头的人名的个数, 就需要用lambda表达式, 或者使用Java 8的流API (Stream API) 来实现更复杂的逻辑了。

流是应用在一组元素上的一次执行的操作序列。集合和数组都可以用来产生流, 因此它们称作数据源, 但流不存储集合中的元素, 相反, 流是通过管道 (pipeline) 操作来自数据源的值序列的一种机制。流管道 (Stream Pipeline) 由数据源 (Stream Source) 、若干中间操作 (Intermediate Operations) 和一个最终操作 (Terminal Operation) 组成, 中间操作对数据集完成过滤、检索等中间业务, 而最终操作完成对数据集处理的最终结果, 或者调用forEach () 方法。

List names = new LinkedList<> () ;

names.add ("Annie") ;

names.add ("Alice") ;

names.add ("Bob") ;

long count = names.stream ()

.filter (name -> name.startsWith ("A")

.count () ;

代码清单5:Java8使用流管道计算以字母A开头的人名的个数

List names = new LinkedList<> () ;

names.add ("Annie") ;

names.add ("Alice") ;

names.add ("Bob") ;

long count = 0;

for (String name : names) {

if (name.startsWith ("A") )

++count;

}

代码清单6:Java 7使用主动迭代计算以字母A开头的人名的个数

如清单5所示, 列表names用于创建流, 然后使用过滤器对数据集进行过滤, filter () 方法只过滤出以字母A开头的名字, 该方法的参数是一个lambda表达式[2]。最后, 流的count () 方法作为最终操作, 得到应用结果。

中间操作除了filter () 之外, 还有distinct () 、sorted () 、map () 等等, 其一般是对数据集的整理 (过滤、排序、匹配、抽取等等) , 返回值一般也是数据集。

最终方法往往是完成对数据集中数据的处理, 如forEach () , 还有allMatch () 、anyMatch () 、findAny () 、findFirst () , 数值计算类的方法有sum () 、max () 、min () 、averag () 等等。最终方法也可以是对集合的处理, 如reduce () 、collect () 等等。reduce () 方法的处理方式一般是每次都产生新的数据集, 而collect () 方法是在原数据集的基础上进行更新, 过程中不产生新的数据集。流管道操作更为详细的资料请参阅Java Tutorial[3]。

为了理解Java8的流的重要性, 请比较代码清单5和代码清单6。代码清单6是大多数Java开发人员比较熟悉的, 它使用主动式迭代完成同样的功能。很显然, 只要掌握了流的基本概念和操作, 清单5中的方法易读性更好且不易出错, 特别是, 在多线程环境下清单6中的逻辑不是线程安全的, 而清单5是线程安全的, 它也更容易进行并行化。

Java8集合类不仅具有Stream () 方法, 该方法返回一个连续的数据流, Java8集合类还有一个parallelStream () 方法, 该方法返回一个并行流。并行流的作用在于允许管道操作同时在不同的Java线程中执行以提高性能;但要注意, 集合元素的处理顺序可能发生改变。测试显示, 使用并行流打印列表中的名字, 他们打印的顺序不同于他们在列表中出现的顺序。下面是使用并行流之后的代码:

long count=names.parallelStream () .filter (name->name.startsWith ("A") ) .count () ;

4 性能比较 (Performance comparison)

虽然使用Java 8中的被动迭代器有多种优势, 那么它是否提供更快的集合处理速度呢?为了比较主动迭代器、流和并行流的性能, 下面我们还是以计算字母A开头的人名的个数为例, 采取上述三种迭代方法做一个比较测试。在一台双核奔腾处理器、4G内存、64位Windows 7和64位版本的Java 8配置环境下, 使用五种不同的集合类 (LinkedList, ArrayList、HashSet、LinkedHashSet和TreeSet) 运行上述程序, 将平均时间总结在如下所示的表1中。

从表中我们可以得出如下结论:对于链表型数据结构, LinkedList和LinkedHashSet, 主动迭代器和流的性能差不多, 并且都优于并行流;对于ArrayList和TreeSet, 主动迭代器和流似乎也有相同的性能, 但都比并行流性能差;对于HashSet, 并行流比主动迭代器和流的性能都要好很多。

5 结论 (Conclusion)

Java 8支持一种新功能进行迭代, 它是声明性的方法, 这种新方法带来的好处是代码的可读性更好, 不易出错, 也更容易并行化。然而测试表明, 并行流对每一种集合类而言不一定性能更快。

参考文献

[1]Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, Design Patterns:Elements of Reusable Object-Oriented Software[A], Addison-Wesley Professional, 1994.

[2]Oracle, The JavaTM Tutorials, Lambda Expressions[EB/OL], http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html.

java集合总结 第2篇

(一)一、数组、集合数组、集合:都是一种容器,用一个对象管理多个对象;

数组:不能自动增长;只能存放同类型的元素

集合:能自动扩容;部分集合允许存放不同类型的元素;

二、学习这些集合类要掌握哪些东西:

1)怎样得到(选择)集合对象;

2)怎样添加元素

3)怎样删除元素

4)怎样循环遍历没一个元素

三、list、set、map

collection:父接口;

Set:接口---一个实现类:HashSet

List:接口---三个实现类:LinkedList,Vector,ArrayList

SortedSet:接口---实现类:TreeSet1、List:

List:有序列表,允许存放重复的元素;

实现类:

ArrayList:数组实现,查询快,增删慢,线程不安全,轻量级;下标也是从0开始;

LinkedList:链表实现,增删快,查询慢

Vector:数组实现,线程安全,重量级

2.Set:

无序集合,不允许存放重复的元素;

实现类HashSet:equals返回true,hashCode返回相同的整数;哈希表;

子接口SortedSet:对Set排序实现类:TreeSet:二叉树实现的;

看API:泛型:表示一个对象;

Iterator:接口,迭代器;

java.util;

hasNext();

next();

remove();

Iterable:可迭代的,访问的;

ng;实现了可迭代的接口就可以用迭代的方式访问;

只需实现iterator();方法即可;Iteratoriterator();

三种循环的访问方式:

只有实现了Iterable接口的才能用第三种;能用第二种的也一定能用第三种;

ArrayList:自动扩容,是数组照搬过来的;

3.Map

HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;

HashSet的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问;

如果有两个Key重复,那么会覆盖之前的;

Hashtable:线程安全的Properties:java.util.Properties;key和value都是String类型,用来读配置文件;

HashMap与Hashtable区别:

HashMap线程不安全的,允许null作为key或value;

Hashtable线程安全的,不允许null作为key或value;

TreeMap:对key排好序的Map;key就是TreeSet,value对应每个key;

key要实现Comparable接口或TreeMap有自己的构造器;

HashSet:remove(Objecto)的原则看这个对象O的Hashcode和equals是否相等,并不是看是不是一个对象;

定义一个Map;key是课程名称,value是Integer表示选课人数;

map.put(cou,map.get(cou)+newInteger(1));

四、Hashtable、Properties

1,Hashtable:实现了Map接口,此类实现一个哈希表,作用和HashMap相同。任何非null对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals法。

2,Properties:继承自Hashtable,比Hashtable更严格属性列表中每个键及其对应值都是一个字符串。

常用方法StringgetProperty(String?key)和setProperty(Stringkey,Stringvalue);

用法:我在C盘下建了一个名为yy.dat的文件,文件的内容为:

name=hehe

password=1234

5执行以下程序,输出hehe,可见用Properties可以很方便的解析配置文件

Propertiesp=newProperties();

p.load(newFileInputStream(“C:yy.dat”));

System.out.println(p.getProperty(“name”))

五、两个工具类Arrays和Collections

1.Arrays、此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂

2.Collections、主要提供了在collection上进行操作的静态方法

六、遗留的几个类

1.Hashtable,作用和HashMap相同,不过它是线程安全的,如果不需要线程安全,应该使用HashMap

2.Enumeration,遗留集合使用枚举接口来遍历元素,它有两个方法,hasMoreElements和nextElement,用法类似Iterator。

3.Stack,继承自Vector,实现了栈的功能,提供了push()方法押栈和pop()方法出栈。

4.BitSet,位集。如果需要高效率的存储一个位序列,例如一个标志序列,请使用位集。它可以对各个位进行

读取get(i)

设置set(i)

清楚clear(i)

七、常见笔试题目汇总

1.Collection和Collections的区别。

Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2.List,Set,Map是否继承自Collection接口?

List,Set是,Map不是

3.两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?

不对,有相同的hashcode。

4.你所知道的集合类都有哪些?主要方法?

最常用的集合类是List和Map。List的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。

Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。

5.排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

快速排序的伪代码。

//使用快速排序方法对a[0:n-1]排序

从a[0:n-1]中选择一个元素作为middle,该元素为支点

把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点

递归地使用快速排序方法对left进行排序

递归地使用快速排序方法对right进行排序

所得结果为left+middle+right

6.HashMap和Hashtable的区别

都属于Map接口的类,实现了将惟一键映射到特定的值上。

HashMap类没有分类或者排序。它允许一个null键和多个null值。

Hashtable类似于HashMap,但是不允许null键和null值。它也比HashMap慢,因为它是同步的。

7.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。

equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

java集合总结

(二)java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。java集合类分为:set、list、map、queue四大体系。其中set代表无序、不可重复的集合;list代表有序、可重复的集合。map代表具有映射关系的集合;queue代表队列集合。

java集合类主要由两个接口派生:Collection和Map,是集合框架的根接口。下面是其接口、子接口和实现类的继承树。

下面就一一介绍四大接口及其实现类。

Set接口。set集合不允许包含相同的元素。set判断两个对象是否相同是根据equals方法。如果两个对象用equals方法返回的是true,set不会接受这两个对象。

HashSet是set接口的典型实现,HashSet按hash算法来存储集合中的元素。因此具有很好的存储和查找性能。HashSet判断两个元素的标准是两个元素的equals方法比较相等,同时两个对象的hasCode()方法返回值也相等。HashSet可以保存null元素。

List集合代表一个有序集合。集合中的每个元素都有其对应的顺序索引。Arraylist和vector是list接口的两个典型实现。他们之间的显着区别就是:vector是线性安全的,而arraylist不是。它们两个都是基于数组实现的list类。List还有一个基于链表实现的LinkedList类。当插入、删除元素的速度非常快。这个类比较特殊,功能也特别多,即实现了List接口,也实现了Dueue接口(双向队列)。可以当成双向队列使用,也可以当成栈使用。

Queue用于模拟队列的数据结构。LinkedList和ArrayDueue是其两个比较常用的实现类。

Map用于保存具有映射关系的数据。Map接口有如下几个常用的实现类:HashMap、HashTable、TreeMap。TreeMap是基于红黑树对TreeMap中所有key进行排序。HashMap和HashTable主要区别有两点:

1、Hashtable是线性安全的,因此性能差些。

2、HashMap可以使用null作为key或者value。

集合类还提供了一个工具类Collections。主要用于查找、替换、同步控制、设置不可变集合。

上面是对java集合类的一般概述,下面就set、list、map三者之间的关系进行剖析。

Set与Map的关系。Map集合中所有key集中起来,就组成了一个set集合。所以Map集合提供SetkeySet()方法返回所有key组成的set集合。由此可见,Map集合中的所有key具有set集合的特征,只要Map所有的key集中起来,它就是一个Set集合,这就实现了Map到Set的转换。同时,如果把Map中的元素看成key-value的set集合,也可以实现从Set到Map之间的转换。HashSet和HashMap分别作为它们的实现类。两者之间也挺相似的。HashSet的实现就是封装了HashMap对象来存储元素。它们的本质是一样的。类似于HashSet和HashMap的关系,其实TreeMap和TreeSet本质也差不多,TreeSet底层也是依赖TreeMap实现。

Map与List的关系。把Map的key-value分开来看,从另一个角度看,就可以把Map与List统一起来。

Map集合是一个关联数组,key可以组成Set集合,Map中的value可以重复,所以这些value可以组成一个List集合。但是需要注意的是,实质Map的values方法并未返回一个List集合。而是返回一个不存储元素的Collection集合,换一种角度来看对List集合,它也包含了两组值,其中一组就是虚拟的int类型的索引,另一组就是list集合元素,从这个意思上看,List就相当于所有key都是int型的Map。

下面讲解几个相似类之间的差异。

ArrayList和LinkedList。ArrayList是一种顺序存储的线性表,其底层是采用数组实现的,而LinkedList是链式存储的线性表。其本质就是一个双向链表。对于随机存储比较频繁的元素操作应选用ArrayList,对于经常需要增加、删除元素应该选用LinkedList。但总的来说ArrayList的总体性能还是优于LinkedList。

10个经典的Java面试题集合 第3篇

HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值。

HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象。当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象。HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,对象将会储存在 LinkedList 的下一个节点中。 HashMap 在每个 LinkedList 节点中储存键值对对象。

2.什么是快速失败的故障安全迭代器?

快速失败的Java迭代器可能会引发ConcurrentModifcationException在底层集合迭代过程中被修改。故障安全作为发生在实例中的一个副本迭代是不会抛出任何异常的。快速失败的故障安全范例定义了当遭遇故障时系统是如何反应的。例如,用于失败的快速迭代器 ArrayList和用于故障安全的迭代器ConcurrentHashMap。

3.Java BlockingQueue是什么?

Java BlockingQueue是一个并发集合util包的一部分。BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素。

4.什么时候使用ConcurrentHashMap?

在问题2中我们看到ConcurrentHashMap被作为故障安全迭代器的一个实例,它允许完整的并发检索和更新。当有大量的并发更新时,ConcurrentHashMap此时可以被使用。这非常类似于Hashtable,但ConcurrentHashMap不锁定整个表来提供并发,所以从这点上ConcurrentHashMap的性能似乎更好一些。所以当有大量更新时ConcurrentHashMap应该被使用。

5.哪一个List实现了最快插入?

LinkedList和ArrayList是另个不同变量列表的实现。ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用。LinkedList的优势在于在中间位置插入和删除操作,速度是最快的。

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

ArrayList实现了可变大小的数组。它允许所有元素,包括null。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

6.Iterator和ListIterator的区别

ListIterator有add()方法,可以向List中添加对象,而Iterator不能。

ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。

7.什么是CopyOnWriteArrayList,它与ArrayList有何不同?

CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。

CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的“=”将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException ,因此CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

8.迭代器和枚举之间的区别

如果面试官问这个问题,那么他的意图一定是让你区分Iterator不同于Enumeration的两个方面:

Iterator允许移除从底层集合的元素。

Iterator的方法名是标准化的。

9.Hashmap如何同步?

当我们需要一个同步的HashMap时,有两种选择:

使用Collections.synchronizedMap(..)来同步HashMap。

使用ConcurrentHashMap的

这两个选项之间的首选是使用ConcurrentHashMap,这是因为我们不需要锁定整个对象,以及通过ConcurrentHashMap分区地图来获得锁。

10.IdentityHashMap和HashMap的区别

IdentityHashMap是Map接口的实现。不同于HashMap的,这里采用参考平等。

在HashMap中如果两个元素是相等的,则key1.equals(key2)

在IdentityHashMap中如果两个元素是相等的,则key1 == key2

;charset=GB2312 %>

Java集合框架

Java集合框架(精选3篇)Java集合框架 第1篇在编程世界里一般需要提供一种机制遍历软件对象的集合。大多数编程语言都有类似于数组的功能并...
点击下载文档文档内容为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部