Java高级部分之集合框架[面试题]

上一篇文章[Java基础部分(面试题)]

1.集合

摘自百度百科

  • Java中的集合类可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。
  • Map没有继承Collection接口,与Collection是并列关系。Map提供键(key)到值(value)的映射。一个Map中不能包含相同的键,每个键只能映射一个值。

Collection接口:

[List]底层是数组(有序,可重复)

  • ArrayList
    优点:底层数据结构是数组,查询快,增删慢
    缺点:线程不安全,效率高
  • Vector
    优点:底层数据结构是数组,查询快,增删慢
    缺点:线程安全,效率低
  • LinkedList
    优点:底层数据结构是链表,查询慢,增删快
    缺点:线程不安全,效率高

[Set]底层是散列表(无序,唯一)

  • HashSet
    底层数据结构是哈希表(无序,唯一)
    如何保证元素唯一?
    依赖两个方法:HashCode()和equals()
  • LinkedHashSet
    底层数据结构是链表和哈希表(FIFO插入有序,唯一)
    1).由链表保证元素有序
    2).由哈希表保证唯一
  • TreeSet
    底层数据结构是红黑树(有序,唯一)
    1). 如何保证元素排序的呢?
    自然排序
    比较器排序
    2).如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

Collection接口、List接口、Set接口以及相关类的关系如图所示
Java高级部分之集合框架[面试题]_第1张图片

Map接口:

[Map]键值对的方式,(有序,key不重复,value可重复)

  • HashMap[无序]
    1).key允许出现null值且只允许出现一个,value允许出现null
    2). 线程不安全
    3).Hash数组的默认大小是:16 加载因子:2*(2的指数)
    4).基于哈希表结构实现的,所以存储自定义对象作为键时,必须重写hasCode和equals方法
  • HashTable[无序]
    1).key和value都不允许出现null值
    2).线程安全
    3).Hash数组默认大小是:11 加载因子:old*2+1
  • TreeMap[有序]
    1).TreeMap底层使用的二叉树,其中存放进去的所有数据都需要排序
    2).自然升序排序
    3).线程不安全

Map接口及其相关类的关系如图所示
Java高级部分之集合框架[面试题]_第2张图片

关于集合的面试题:

1.List,Set和Map的区别?

  • List和Set是Collection的子接口,Map不是
  • List的底层是数组的方式实现的,Set是散列表的方式实现的,Map是键值对的方式
  • List是有序可重复的,Set是无序不可重复的,Map是有序,Key不重复,value可重复
  • List和Set可直接使用itertator来进行遍历,Map只能通过先遍历Key在遍历value

2.Collection和Collections的区别?

  • Collection是集合类的上级接口,继承与他的接口主要有List和Set
  • Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作

3.Set里的元素是不能重复的,那么用什么方法来区分重复与否?

  • Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的
  • equals()和==方法决定引用值是否指向同一对象,equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值

4.HashMap和HashTable的区别?

  • 继承不同:
    HashTable继承自Dictionary
    HashMap继承自AbstractMap
  • HashTable是线程安全的;HashMap线程不安全
  • HashTable中,Key和value都不允许出现null值;在HashMap中,key允许出现null值且只允许出现一个,value允许出现null
  • 遍历方式不同:
    HashTable,HashMap都使用了Iterator.而由于历史原因,HashTable还使用了Enumeration的方式
  • 哈希值的使用不同
    HashTable直接使用对象的hashCode
    HashMap重新计算hash值
  • HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数

5.ArrayList和LinkList的区别?

  • 相同点:
    ArrayList和linkList都是接口List的实现类,里面的数据都是有序可重复的
  • 区别:
    ArrayList:采用的是数组形式保存对象的,访问速度更快,而LinkList的插入和删除元素的速度更快

6.List遍历方式有多少种?

  • 下标遍历
  • Iterator遍历
  • Foreach遍历

7.Map怎么遍历?
先调用keyset()方法获取所有的key,在遍历key获取所有的元素

8.怎么获取Map所有的key,所有的value?

  • Map调用ketset()方法获取所有的key值,是一个Set集合
  • Map调用values()方法获取所有的值,是一个List集合

9.HashMap的底层实现?

  • HashMap实际上是一个链表散列的数据结构,即数组和链表的结合体
  • HashMap底层就是一个数组结构,数组中的每一项又是一个链表,当新建一个HashMap的时候,就会初始化一个数组
  • HashMap在底层将Key-value当成一个整体进行处理,这个整体就是一个Entry对象.HashMap底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置,当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry.

每一天都是值得期待的,这样的生活才有颜色!

你可能感兴趣的:(Java)