【集合类】-常见面试问题总结

常见面试题

  • 集合
    • 1. 介绍一下集合类框架?
    • 2.数组和对象的区别?
    • 3. Collection和Collections的差别?
    • 4. LinkedList与ArrayList有什么差别?
    • 5.ArrayList与Vector的差别?
    • 6. HashMap和HashTable的区别?
    • 7.List与Map的差别?
    • 8.List、set、map三个接口,存取元素时有什么特点?
    • 9.什么是iterator?
    • 10.集合框架中的泛型有什么优点?
    • 11. 哪些集合提供对元素的随机访问?
    • 12.哪些集合类是线程安全的?
    • 13.你如何选择集合类框架的使用?
    • 14. 两个对象的值相同(x.equals(y)==true),但是有不同的hashCode,这句话对不对?
    • 15. 集合类常用方法?

集合

1. 介绍一下集合类框架?

  • 首先,集合类框架经常使用的是继承Collection接口,和继承Map接口的两个体系。
  • Collection接口:Collection接口的常见的实现接口为List,Set。
  1. List : List接口的实现类主要有ArrayList、LinkedList以及Vector

    • 有序、可重复。
    • ArrayList:就是一个可扩容的对象数组,是线程不安全的。
    • LinkedList:是一个双向链表。
    • Vector:是线程安全的(ArrayList不是线程安全的)。
    • 线程安全:加锁就是安全的,不加锁就是不安全的;就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
  2. Set:Set接口的主要实现类HashSet、TreeSet、LinkedHashSet:

    • 无序、不可重复。
    • HashSet:实现基于HashMap,实际上就是HashMap中的Key;
    • TreeSet:低层由TreeMap实现;
    • LinkedHashSet:低层由LinkedHashMap实现;
  • Map接口:实现类常见有HashMap、TreeMap、HashTable等;map接口的特点是存储方式都是键值对,键不可以重复,值可以重复。
  1. HashMap:的底层是基于哈希表来实现的, 往HashMap中添加元素的时候,首先会调用hashCode方法得到元素的哈希码值,经过运算可以得到该码在哈希表中的位置。它是线程不安全的。
  2. TreeMap是基于二叉树来实现的,会对元素的键进行排序。
  3. HashTable底层和HashMap原理一样,都是哈希表,但是是线程安全的。

2.数组和对象的区别?

  • 数组特点:大小固定,只能存储相同数据类型的数据
  • 集合特点:大小可动态扩展,可以存储各种类型的数据
  • 数组转换为集合:Arrays.asList(数组)

3. Collection和Collections的差别?

  • 他俩都是java.util包下的。
  • Collection是一个集合接口,它底下有很多集合的实现。
  • Collections是一个集合的帮助类,提供了一系列的静态方法对集合进行搜索、排序、线程安全化的操作。

4. LinkedList与ArrayList有什么差别?

  • 他俩都是实现了List接口,都是有序可重复的。
  • ArrayList是基于动态数组,LinkedList是基于链表。
  • 所以ArrayList的查效率高,可以根据下标直接定位查询,但是增删改的效率低,因为要移动数据。
  • LinkedList的增删改效率高,但是查的效率低,因为它必须得从链表的一端开始逐一遍历。

5.ArrayList与Vector的差别?

  • 他连都是实现了List接口,都是有序可重复的。
  • ArrayList是线程不安全的,Vector是线程安全的。所以ArrayList的执行效率高于vector
  • 当向一个集合中添加元素时,超过他俩的初始容量时,ArrayList每次添加原来的0.5倍,vector添加为原来的1倍,并且vector提供我们自己来设置存储空间增长的大小。
  • HashTable相比于HashMap也是支持多线程的操作而导致性能不如HashMap。
  • 线程安全:加锁就是安全的,不加锁就是不安全的;就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据;

6. HashMap和HashTable的区别?

  • 两者都实现了Map接口,都是以键值对来存储数据。并且key值都不重复。
  • HashMap是线程不安全的,HashTable是线程安全的。
  • HashMap支持空的key和value,HashTable不支持。

7.List与Map的差别?

  • List是存储单链数据的集合,而map是存储key和value的双链的数据的集合。
  • List是有序的,可重复的。map存储的数据是无序的,key值不能重复,value值可以重复。
  • List继承Collection接口,Map没有父类。

8.List、set、map三个接口,存取元素时有什么特点?

  • List和Set都是单列元素集合都继承自Collection接口。
  • List是有序的、可以重复的。Set是无序、不可重复的。他俩的add()方法,set由于不可重复,所以在插入时需要循环遍历set集合中的对象,如果相等,则插入失败,返回一个false。List可以通过get()方法通过下标来取值,set通过iterator()循环遍历取值。
  • Map时键值对来存数据,通过put()方法,不能存储相同的key值,取值通过get()方法,通过key值来确定value值。

9.什么是iterator?

  • Iterator接口提供遍历任何Collection接口的实现类,我们可以从实现类中获取迭代器实例,迭代器允许调用者在迭代过程中移除元素。

10.集合框架中的泛型有什么优点?

  • java1.5之后引用泛型
  • 泛型为集合类框架引入了可以存放相同对象的容器,因此,如果在集合中添加其他的对象,就会在编译时报错,避免了运行时出现ClassCastException。泛型也使代码变得整洁,不用使用显示转换和instanceOf操作符。

11. 哪些集合提供对元素的随机访问?

ArrayList(有序)、HashMap、TreeMap、HashTable(key值)

12.哪些集合类是线程安全的?

Vertor、HashTable是线程安全的。

13.你如何选择集合类框架的使用?

  1. 如果指定了大小,就使用Array而不使用ArrayList;
  2. 如果想使用插入顺序来遍历Map,我们需要使用TreeMap而不是HashMap;
  3. 如果不想重复就使用set接口下的实现类。
  4. 如果是单线程代码环境,使用HashMap,多线程使用HashTable

14. 两个对象的值相同(x.equals(y)==true),但是有不同的hashCode,这句话对不对?

  • 分情况。
  • 如果两个对象保存在HashMap或者HashSet中,他们的equals相等的话,他们的hashcode值必须相等。
  • 如果存储在ArrayList中,这时与hashcode就没有关系了。
  • 通常我们都一般重写equals时顺带重写hashcode。

15. 集合类常用方法?

  1. add(E e) ,添加元素
  2. clear() ,暴力清除集合中所有元素
  3. contains(Object o), 返回值类型:boolean。判断集合是否包含某个元素
  4. isEmpty() ,返回值类型:boolean。如果此集合不包含元素,则返回true。
  5. iterator() 迭代器。返回值类型:Iterator
  6. size() 返回值类型:int。返回集合中的元素数

你可能感兴趣的:(面试)