欢迎来到知了汇智!
联系电话:知了汇智-电话号码 028-62016472 / 13228113191

Java面试常考题集合之集合与数组-知了汇智

Java面试常考题集合之集合与数组


        相信绝大多数人学习Java的目的就是为了就业吧,而想要入职Java开发工程师,面试是必不可少的一个环节,知了堂特意为大家整理了Java面试常考题集合之集合与数组篇,希望对大家面试Java开发工程师有一定的帮助。

       相关资料:Java面试常考题集合之Java概念篇
                       Java面试常考题集合之集合与数组

  1.Java集合框架是什么?说出一些集合框架的优点?
  每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
  (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
  (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
  (3)通过使用JDK附带的集合类,可以降低代码维护成本。
  (4)复用性和可操作性。
 
  2.集合框架中的泛型有什么优点?
  Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。
 
  3.Java集合框架的基础接口有哪些?
  Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。## 标题 ##
  Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
  List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。
  Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。
  一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。
 
  4.为何Collection不从Cloneable和Serializable接口继承?
  Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。例如,一些如List的Collection实现允许重复的元素,而其它的如Set就不允许。很多Collection实现有一个公有的clone方法。然而,把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现。重要的是实现。
  当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用。所以,具体实现应该决定如何对它进行克隆或序列化,或它是否可以被克隆或序列化。
  在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定它是否可以被克隆和序列化。

Java面试常考题集合之集合与数组

 
  5.为何Map接口不继承Collection接口?
  尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。
  如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。
 
  6.什么是迭代器(Iterator)?
  Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。
 
  7.Iterator和ListIterator的区别是什么?
  下面列出了他们的区别:
  Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
  Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
  ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
 
  8.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
  快速失败:当你在迭代一个集合的时候,如果有另一个线程正在修改你正在访问的那个集合时,就会抛出一个ConcurrentModification异常。
  在java.util包下的都是快速失败。
  安全失败:你在迭代的时候会去底层集合做一个拷贝,所以你在修改上层集合的时候是不会受影响的,不会抛出ConcurrentModification异常。
  在java.util.concurrent包下的全是安全失败的。
 
  9.Java中的HashMap的工作原理是什么?
  我们知道在Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现,HashMap也是如此。实际上HashMap是一个“链表散列”,如下是它数据结构:最左侧是一个数组,数组中的每一个元素都是一个链表,链表的每一个元素都是entry。
  HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
 
  10.当两个对象的hashcode相同会发生什么?
  因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。
 
  11.如果两个键的hashcode相同,你如何获取值对象?
  当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。
 
  12.hashCode()和equals()方法有何重要性?
  HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则:
  (1)如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。
  (2)如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。
 
  13.HashMap和Hashtable有什么区别?
  1、HashMap是非线程安全的,HashTable是线程安全的。
  2、HashMap的键和值都允许有null值存在,而HashTable则不行。
  3、因为线程安全的问题,HashMap效率比HashTable的要高。
  4、Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
  一般现在不建议用HashTable, ①是HashTable是遗留类,内部实现很多没优化和冗余。②即使在多线程环境下,现在也有同步的ConcurrentHashMap替代,没有必要因为是多线程而用HashTable。
 
  14.如何决定选用HashMap还是TreeMap?
  对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。
 
  15.ArrayList和Vector有何异同点?
  ArrayList和Vector在很多时候都很类似。
  (1)两者都是基于索引的,内部由一个数组支持。
  (2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。
  (3)ArrayList和Vector的迭代器实现都是fail-fast的。
  (4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。
  以下是ArrayList和Vector的不同点。
  (1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。
  (2)ArrayList比Vector快,它因为有同步,不会过载。
  (3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。
 
  16.Array和ArrayList有何区别?什么时候更适合用Array?
  Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
  Array是指定大小的,而ArrayList大小是固定的。
  Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
  (1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
  (2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
  (3)如果你要使用多维数组,使用[][]比List
 
  版权声明:本文来源于网络,由知了堂搜集整理,仅供大家提前熟悉Java面试时使用
132 2811 3191
预约免费试学
点击咨询
预约试学