无论是需要招聘的企业人员还是正在求职或者打算跳槽的程序员,今天这篇都值得一看。
这里整合了常见的Java集合框架面试题目,以及对应的nice的答案。
面试这关至关重要,合适的问题和巧妙的回答,是企业和应聘者相互了解和有效沟通的关键,下面就一起来看看这些题目和答案。
1.为什么Map接口不继承Collection 接口?
Set是无序集合,并且不允许重复的元素
List是有序的集合,并且允许重复的元素
而Map是键值对
它被视为是键的set和值的set的组合
Map被设计为键值对的集合,所以不需要继承Collection 接口
2.HashMap和Hashtable之间的区别?
同步或线程安全
Null键和Null值
迭代值
默认容量大小
3.comparable 和 comparator的不同之处?
comparable接口实际上是出自java.lang包
它有一个 compareTo(Object obj)方法来将objects排序
comparator接口实际上是出自 java.util 包
它有一个compare(Object obj1, Object obj2)方法来将objects排序
4.如何对Object的list排序?
对objects数组进行排序,我们可以用Arrays.sort()方法
如果要对objects的集合进行排序,需要使用Collections.sort()方法
5. fail-fast 与 fail-safe 之间的区别?
Fail fast快速地报告任何的failure。无论何时任何一个问题都会引发 fail fast系统fails
在Java Fail fast 迭代器中,迭代objects集合有时会出现并发修改异常,出现这种情况有2个原因
如果一个线程正在迭代一个集合,而另一个线程同时试图修改这个集合
在调用remove()方法后,如何我们还试图去修改集合object
6. Iterator、ListIterator 和 Enumeration的区别?
Enumeration接口在Java1.2版本开始有,所以Enumeration是合法规范的接口
Enumeration使用elements()方法
Iterator对所有Java集合类都有实现
Iterator使用iterator方法
Iterator只能往一个方向前进
ListIterator仅仅对List类型的类实现了
ListIterator使用listIterator()方法
7.Java 中 Set 与 List 有什么不同?
Set是一个不允许重复元素存在的集合
Set没有索引
Set仅仅允许一个null值
Set有类:HashSet、LinkedHashMap、TreeSet
List有索引
List允许N个null值
List可以按插入顺序显示
List有类:Vector、ArrayList、LinkedList
8. arraylist 与 vector 的区别?
Vector 在Java的第一个版本就引入了,也就是说vector是一个合法规范的类
ArrayList在Java1.2版本引入的,是Java 集合框架的组成部分
Vector是同步的
ArrayList是不同步的
9.什么类实现了List接口?
ArrayList
LinkedList
Vector
10.什么类实现了Set接口?
HashSet
LinkedHashSet
TreeSet
11.如何保证一个集合线程安全?
Vector, Hashtable, Properties 和 Stack 都是同步的类,所以它们都线程安全的,可以被使用在多线程环境中
使用Collections.synchronizedList(list)) 方法,可以保证list类是线程安全的
使用java.util.Collections.synchronizedSet()方法可以保证set类是线程安全的
12.是否可以往 TreeSet 或者 HashSet 中添加 null 元素?
可以往 hashset 中添加一个 null
TreeSet 也允许一个 null值
13.解释下Collection的接口继承关系?
14.Iterator符合哪个设计模式?
Iterator 设计模式
15.HashSet 实现了哪个数据结构?
HashSet 内部实现了hashmap
16.为什么 Collection 不能继承 Cloneable 和 Serializable?
List和Set唯一继承 Collection 接口
SortedMap 继承了 Map 接口
17.hashCode() 和 equals() 方法的重要性?如何在Java中使用它们?
hashCode() 和 equals() 方法定义在”object”类中
如果equals() 方法在比较2个对象时返回true,那么hashCode()的返回值必须得一样
18.array 和 arraylist 的区别?
Array类似object集合类型,大小固定
Arraylist是同质和异质元素的集合
19.什么是 Properties 类?
Properties 是Hashtable的子类。它被用于维护值的list,其中它们的键、值都是String类型
20.如何将一个字符串转换为arraylist?
使用 arrayList.toArray() 方法
你以为只有上面这些问题吗?
21.Java支持的数据类型有哪些?什么是自动拆装箱?
Java支持的基本数据类型有:
byte
short
int
long
float
double
boolean
char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer。反之就是自动拆箱。
21.面向对象编程(OOP)有哪些优点?
代码开发模块化,更易维护和修改。
代码复用。
增强代码的可靠性和灵活性。
增加代码的可理解性。
22.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
23.Java支持多继承么?
不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
24.创建线程有几种不同的方式?你喜欢哪一种?为什么?
创建线程有以下几种方式:
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在已经继承了别的类的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
25.解释一下线程的几种可用状态
就绪(Runnable):线程准备运行,不一定立马就能开始执行。
运行中(Running):程序正在执行线程的代码。
等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
睡眠中(Sleeping):线程被强制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成。
同步阻塞(Blocked on Synchronization):等待获取锁。
死亡(Dead):线程完成了执行。
26.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
监视器和锁在Java虚拟机中是一起使用的。监视器监视同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
27.什么是死锁(deadlock)?
两个线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个线程都陷入了无限的等待中。
28.Java集合类框架的基本接口有哪些?
Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的Collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。