集合基础面试题

1. 请描述一下你对集合的理解?

参考答案

  集合是 Java 中用于存放大量相同类型数据的一种方式,在程序中也可以使用数组完成这个需求,但是数组有个巨大的问题就是长度固定,当我们需要创建一个未知长度的数组这个问题就无法解决了,集合就可以帮助我们解决这个问题。同时集合还定义了一系列的方法例如判断是否为空,来简化操作。
  集合分两大类:继承了 Collection 接口的 List 和 Set,还有 Map 接口...
2. HashMap 和 Hashtable 的区别?

参考答案

  HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),它们都完成了 Map 接口,Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。
  主要区别在于:
  1. HashMap 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
  2. HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。
  3. Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map 的 interface 的一个实现。
  4. Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。
  总结一下就是 HashMap 与 HashTable 主要从三方面来说。
  1. 历史原因: Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 Java 1.2 引进的 Map 接口的一个实现
  2. 同步性: Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的,不是同步的
  3. 值:只有 HashMap 可以让你将空值作为一个表的条目的 key 或 value
  
3. List 和 Map 的区别?

参考答案一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List 中存储的数据是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

4. 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(Object e) 方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用 add(int index,Object e) 方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进 List 中,每调用一次 add 方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被 add 多次时,即相当于集合中有多个索引指向了这个对象,如图 x 所示。List 除了可以以 Iterator 接口取得所有的元素,再逐一遍历各个元素之外,还可以调用 get(int index) 来明确说明取第几个。
    Map 与 List 和 Set 不同,它是双列的集合,其中有 put 方法,定义如下:put(Object key,Object 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 中却加不了多次的。
    
5. 说出 ArrayList,Vector, LinkedList 的存储性能和特性 ?

参考答案

  ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
  LinkedList 也是线程不安全的,LinkedList 提供了一些方法,使得 LinkedList 可以被当作堆栈和队列来使用。
    
6. 去掉一个 Vector 集合中重复的元素?

参考答案Vector newVector = new Vector();
for (int i=0;i<vector.size();i++){
    Object obj = vector.get(i);
    if(!newVector.contains(obj))
        newVector.add(obj);
}

 还有一种简单的方式,HashSet set = new HashSet(vector); 
7. Collection 和 Collections 的区别?

参考答案

  Collection 是集合类的上级接口,继承它的接口主要有 Set 和 List.
  Collections 是针对集合类的一个工具类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
    
8. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是 equals()? 它们有何区别?

参考答案

  Set 里的元素是不能重复的,元素重复与否是使用 equals() 方法进行判断的。
  equals() 和 == 方法决定引用值是否指向同一对象 equals() 在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
    
9. 你所知道的集合类都有哪些?主要方法?

参考答案

  最常用的集合类是 List 和 Map。
  List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
  Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作 "键" 和 "值"),其中每个键映射到一个值。
  我记的不是方法名,而是思想,我知道它们都有增删改查的方法,但这些方法的具体名称,我记得不是很清楚,对于 set,大概的方法是 add,remove, contains;对于 map,大概的方法就是 put,remove,contains 等,因为,我只要在 eclispe 下按点操作符,很自然的这些方法就出来了。我记住的一些思想就是 List 类会有 get(int index) 这样的方法,因为它可以按顺序取元素,而 set 类中没有 get(int index) 这样的方法。List 和 set 都可以迭代出所有元素,迭代时先要得到一个 iterator 对象,所以,set 和 list 类都有一个 iterator 方法,用于返回那个 iterator 对象。map 可以返回三个集合,一个是返回所有的 key 的集合,另外一个返回的是所有 value 的集合,再一个返回的 key 和 value 组合成的 EntrySet 对象的集合,map 也有 get 方法,参数是 key,返回值是 key 对应的 value。
    
10. 两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

参考答案

  是对的。
  如果对象要保存在 HashSet 或 HashMap 中,它们的 equals 相等,那么,它们的 hashcode 值就必须相等。
如果不是要保存在 HashSet 或 HashMap,则与 hashcode 没有什么关系了,这时候 hashcode 不等是可以的,例如 ArrayList 存储的对象就不用实现 hashcode,当然,我们没有理由不实现,通常都会去实现的。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师范大学通信大怨总

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值