BAT面试题——22个集合框架(一)

一、ArrayList 和 Vector 的区别

这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集

合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我

们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是

HashSet 之类的集合的最大不同处,HashSet 之类的集合不可以按索引号去检索其

中的元素,也不允许有重复的元素(本来题目问的与 hashset 没有任何关系,但为了

说清楚 ArrayList 与 Vector 的功能,我们使用对比方式,更有利于说明问题)。接

着才说 ArrayList 与 Vector 的区别,这主要包括两个方面。

 同步性:

Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayList 是线

程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那

最好是使用 ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问

到集合,那最好是使用 Vector,因为不需要我们自己再去考虑和编写线程安全的代

码。

备注:对于 Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,

记住 Vector 与 Hashtable 是旧的,是 java 一诞生就提供了的,它们是线程安全

的,ArrayList 与 HashMap 是 java2 时才提供的,它们是线程不安全的。所以,我

们讲课时先讲老的。

 数据增长:

ArrayList 与 Vector 都有一个初始的容量大小,当存储进它们里面的元素的个数超

过了容量时,就需要增加 ArrayList 与 Vector 的存储空间,每次要增加存储空间

时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数

在内存空间利用与程序效率之间要取得一定的平衡。Vector 默认增长为原来两倍,而

ArrayList 的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的 1.5

倍)。ArrayList 与 Vector 都可以设置初始的空间大小,Vector 还可以设置增长的

空间大小,而 ArrayList 没有提供设置增长空间的方法。

总结:即 Vector 增长原来的一倍,ArrayList 增加原来的 0.5 倍。

二、说说 ArrayList,Vector, LinkedList 的存储性能和特性

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数

据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组

元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了

synchronized 方法(线程安全)。

通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数

据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插

入速度较快 。

ArrayList 在查找时速度快,LinkedList 在插入与删除时更具优势。

三、快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?

Iterator 的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

java.util 包下面的所有的集合类都是快速失败的,而 java.util.concurrent 包下面的

所有的类都是安全失败的。快速失败的迭代器会抛出

ConcurrentModificationException 异常,而安全失败的迭代器永远不会抛出这样的

异常。

四、hashmap 的数据结构

在 java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针

(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap 也不例

外。Hashmap 实际上是一个数组和链表的结合体(在数据结构中,一般称之为 “链

表散列 “)

enter image description here

五、HashMap 的工作原理是什么?

Java 中的 HashMap 是以键值对 (key-value) 的形式存储元素的。HashMap 需要

一个 hash 函数,它使用 hashCode()和 equals()方法来向集合 / 从集合添加和检

索元素。当调用 put() 方法的时候,HashMap 会计算 key 的 hash 值,然后把键

值对存储在集合中合适的索引上。 如果 key 已经存在了,value 会被更新成新值。

HashMap 的一些重要的特性是它的容量 (capacity),负载因子 (load factor) 和扩

容极限(threshold resizing)。

六、Hashmap 什么时候进行扩容呢?

当 hashmap 中的元素个数超过数组大小 loadFactor 时,就会进行数组扩容,

loadFactor 的默认值为 0.75,也就是说,默认情况下,数组大小为 16,那么当

hashmap 中元素个数超过 16 0.75=12 的时候,就把数组的大小扩展为 2 16=32,

即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操

作,所以如果我们已经预知 hashmap 中元素的个数,那么预设元素的个数能够有效

的提高 hashmap 的性能。比如说,我们有 1000 个元素 new HashMap(1000),

但是理论上来讲 new HashMap(1024) 更合适,不过上面 annegu 已经说过,即使

是 1000,hashmap 也自动会将其设置为 1024。 但是 new HashMap(1024) 还

不是更合适的,因为 0.75*1000 < 1000, 也就是说为了让 0.75 * size > 1000, 我们

必须这样 new HashMap(2048) 才最合适,既考虑了 & 的问题,也避免了 resize

的问题。

七、List、Map、Set 三个接口,存取元素时,各有什么特点?

这样的题属于随意发挥题:这样的题比较考水平,两个方面的水平:一是要真正明白

这些内容,二是要有较强的总结和表述能力。如果你明白,但表述不清楚,在别人那

里则等同于不明白。

首先,List 与 Set 具有相似性,它们都是单列元素的集合,所以,它们有一个功共同

的父接口,叫 Collection。Set 里面不允许有重复的元素,所谓重复,即不能有两个

相等(注意,不是仅仅是相同)的对象 ,即假设 Set 集合中有了一个 A 对象,现在

我要向 Set 集合再存入一个 B 对象,但 B 对象与 A 对象 equals 相等,则 B 对

象存储不进去,所以,Set 集合的 add 方法有一个 boolean 的返回值,当集合中

没有某个元素,此时 add 方法可成功加入该元素时,则返回 true,当集合含有与某

个元素 equals 相等的元素时,此时 add 方法无法加入该元素,返回结果为 false。

Set 取元素时,没法说取第几个,只能以 Iterator 接口取得所有的元素,再逐一遍历

各个元素。

List 表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。

当我们多次调用 add(Obj e) 方法时,每次加入的对象就像火车站买票有排队顺序一

样,按先来后到的顺序排序。有时候,也可以插队,即调用 add(int index,Obj e) 方

法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进 List 中,

每调用一次 add 方法,这个对象就被插入进集合中一次,其实,并不是把这个对象

本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被

add 多次时,即相当于集合中有多个索引指向了这个对象,如图 x 所示。List 除了

可以以 Iterator 接口取得所有的元素,再逐一遍历各个元素之外,还可以调用

get(index i) 来明确说明取第几个。

Map 与 List 和 Set 不同,它是双列的集合,其中有 put 方法,定义如下:

put(obj key,obj value),每次存储时,要存储一对 key/value,不能存储重复的

key,这个重复的规则也是按 equals 比较相等。取则可以根据 key 获得相应的

value,即 get(Object key) 返回值为 key 所对应的 value。另外,也可以获得所有

的 key 的结合,还可以获得所有的 value 的结合,还可以获得 key 和 value 组合

成的 Map.Entry 对象的集合。

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素, 内部排序。

Map 保存 key-value 值,value 可多值。

HashSet 按照 hashcode 值的某种运算方式进行存储,而不是直接按 hashCode

值的大小进行存储。例如,"abc" ---> 78,"def" ---> 62,"xyz" ---> 65 在

hashSet 中的存储顺序不是 62,65,78,这些问题感谢以前一个叫崔健的学员提出,

最后通过查看源代码给他解释清楚,看本次培训学员当中有多少能看懂源码。

LinkedHashSet 按插入的顺序存储,那被存储对象的 hashcode 方法还有什么作用

呢?学员想想! hashset 集合比较两个对象是否相等,首先看 hashcode 方法是否相

等,然后看 equals 方法是否相等。new 两个 Student 插入到 HashSet 中,看

HashSet 的 size,实现 hashcode 和 equals 方法后再看 size。

同一个对象可以在 Vector 中加入多次。往集合里面加元素,相当于集合里用一根绳

子连接到了目标对象。往 HashSet 中却加不了多次的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,941评论 0 13
  • ArrayList实现原理要点概括 参考文献:http://zhangshixi.iteye.com/blog/6...
    晨光光阅读 1,068评论 0 1
  • 原文地址 Java集合 Java集合框架:是一种工具类,就像是一个容器可以存储任意数量的具有共同属性的对象。 Ja...
    gyl_coder阅读 978评论 0 8
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 754评论 0 1
  • hashmap实现的数据结构,数组、桶等。 如图所示 JDK 1.7,是以数组+链表组成的,链表为相同hash的键...
    不需要任何阅读 829评论 0 1