Java 集合基础面试


1、Java集合有哪些?

1)按照实现接口分类
1.1)实现Map接口得有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap
1.2)实现List接口的有:ArrayList、LinkedList
1.3)实现Set接口的有:HashSet、LinkedHashSet、TreeSet
1.4)实现Queue接口的有:PriorityQueue、LinkedList、ArrayQueue

2)按照底层实现的数据结构分类
2.1)底层以数组的形式实现:EnumMap、ArrayList、ArrayQueue
2.2)底层以链表的形式实现:LinkedHashSet、LinkedList、LinkedHashMap
2.3)底层以红黑树的形式实现:TreeMap、TreeSet
2.4) 底层以哈希表的形式实现:HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap
2.5)底层以二叉树的形式实现:PriorityQueue

3)并发容器
3.1)ConcurrentHashMap、ConCurrentSkipListHashMap
3.2)LinkedTransferQueue、CopyOnWriteArrayList、ArrayBlockingQueue、LinkeBlockingQueue、PriorityBlockingQueue、LinkedBlockQueue、DelayQueue、SynchronusQueue
3.3)ConcurrentSkipListSet、CopyOnWriteArraySet

2、Collection和Collections有什么区别?

Collection是集合类的上级接口,继承与它有关的接口主要有List和Set;
Collections是一个包装类。它包含有各种有关集合操作的静态多态方法,不能实例化,像一个Collection集合框架中的工具类。

3、List、Set、Map 之间的区别是什么?

List:
1、可以允许重复的对象。
2、可以插入多个null元素。
3、是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4、常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

Set:
1、不允许重复对象
2、无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3、只允许一个 null 元素
4、Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

Map:
1、Map不是collection的子接口或者实现类。Map是一个接口。
2、Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3、TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4、Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5、Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

4、HashMap 和 Hashtable 有什么区别?

1)继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2)线程安全性不同
Hashtable中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。

3)key和value是否允许为null值
Hashtable中,key和value都不允许出现null值,而HashMap中,null可以作为键,这样的键只有一个,但是可以有一个或多个键所对应的值为null。

4)内部实现使用的数组初始化化和扩容方式不同
1)HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,
2)Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
3)Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

5)hash的计算方式不同
HashMap计算了hash值;Hashtable使用了key的hashCode方法。

6)是否有contains方法
HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。

5、ArrayList和LinkedList有什么区别?

1)数据结构实现
ArrayList底层是用数组实现的,而LinkedList底层是用双向链表实现的;

2)随机访问效率
正因为ArrayList是通过数组实现的,而数组的元素是带有下标的,查询的时候可以通过下标快速定位到所要查询的元素,而LinkedList 基于双向链表实现的,每次查询都必须从头结点移动指针从前往后依次查找直至查找到所要查找的元素,因此ArrayList的随机访问效率比LinkedList效率高;

3)增加和删除效率
在非尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList底层是基于数组实现的,而数组是一块连续的内存空间,当我们在中间删除一个元素时,我们都必须逐一将所要删除的元素的后面元素逐一向前移一位,操作繁琐,而LinkedList增加或者删除元素,只需要将所要删除的元素的上一个元素的后驱指针指向指向下下一个元素,也就是node.next = node.next.next;

在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用LinkedList。

6、Array和ArrayList有什么区别?

1)Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小,而ArrayList可以只是先声明。
2)Array只能存储类型相同的对象,而ArrayList可以存储不同的对象。
3)Array能存储基本数据类型类型和对象类型,而ArrayList只能包含对象类型。
4)Array大小是固定的,ArrayList 的大小是动态变化的。

7、ArrayList和Vector的区别和联系?

相同点:
1)底层都使用数组实现;
2)功能相同,实现增删改查等操作的方法相似;
3)长度可变的数组结构;

不同点:
1)Vector是早期JDK版本提供,ArrayList是新版本替代Vector的;
2)Vector 的方法都是同步的,线程安全;ArrayList 非线程安全,但性能比Vector好;
3)默认初始化容量都是10,Vector 扩容默认会翻倍,可指定扩容的大小;ArrayList只增加 50%。

8、迭代器Iterator是什么?

1)首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
2)Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
3)缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

9、HashMap的键值需要注意什么?

HashMap 的 key 相等的条件是,条件 1 必须满足,条件2和3必须满足一个。

1)key 的 hash 值相等

2)内存中是同一个对象,即使用 == 判断 key 相等

3)key 不为 null, 且使用 equals 判断 key 相等

所以自定义类作为 HashMap 的 key,需要注意按照自己的设计逻辑,重写自定义类的 hashCode() 方法和 equals() 方法。

10、HashMap的实现原理是什么?

1)HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

2)在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

image.png

实现原理:

1)利用key的hashCode重新hash计算出当前对象的元素在数组中的下标;

2)存储时,如果出现hash值相同的key,此时有两种情况:

1、如果key相同,则覆盖原始值;

2、如果key不同(出现冲突),则将当前的key-value放入链表中;

3)获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值;

4)理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

11、HashSet实现原理是什么?有什么特点?**

1)HashSet 是基于 HashMap 实现的,查询速度特别快

2)HashMap 是支持 key 为 null 值的,所以 HashSet 支持添加null 值

3)HashSet 存放自定义类时,自定义类需要重写 hashCode() 和 equals() 方法,确保集合对自定义类的对象的唯一性判断(具体判断逻辑,见 HashMap put() 方法,简单概括就是 key 进行 哈希。判断元素 hash 值是否相等、key 是否为同个对象、key 是否 equals。第 1 个条件为 true,2、3 有一个为 true,HashMap 即认为 key 相同)

4)无序、不可重复。

12、那些集合类是线程安全的?

1)Vector

2)Stack

3)Hashtable

4)java.util.concurrent 包下所有的集合类 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

13、怎么确保一个集合不能被修改?

使用 JDK中java.util.Collections 类,unmodifiable*** 方法赋值原集合

1)list = Collections.unmodifiableList(list);

2)set = Collections.unmodifiableSet(set);

3)map = Collections.unmodifiableMap(map);

当再修改集合时,会报错 java.lang.UnsupportedOperationException。从而确保自己定义的集合不被其他人修改。

未完待续

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

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,936评论 0 13
  • ArrayList实现原理要点概括 参考文献:http://zhangshixi.iteye.com/blog/6...
    晨光光阅读 1,066评论 0 1
  • 原文地址 Java集合 Java集合框架:是一种工具类,就像是一个容器可以存储任意数量的具有共同属性的对象。 Ja...
    gyl_coder阅读 978评论 0 8
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    胖先森阅读 810评论 4 17
  • 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:V...
    Oneisall_81a5阅读 901评论 0 11