java容器面试题

二、容器

1.java 容器都有哪些?

  • 首先分为Collection、Map;Collection下分为List、Set和Queue;Map下分为HashMap、LinkedHashMap、TreeMap、WeakHashMap;
  • List下分为ArrayList和LinkedList;Set下分为HashSet、LinkedHashSet和TreeSet;Queue下有PriorityQueue。
  • Collection代表的是单个元素对象的序列;Map代表的是“键值对”对象的集合。

2.List、Set、Map 之间的区别是什么?

  • List是一个有序的Collection,可以精确掌控元素的插入,还可以根据index获取相应位置的元素。允许重复元素的插入。它还提供了一种特殊的iterator遍历器,ListIterator。这种遍历允许遍历时插入,替换,删除,双向访问。并且还有一个重载方法允许从一个指定位置开始遍历。
  • Set的核心就是集合内所有元素不重复。HashSet实现Set接口,基于HashMap进行存储。遍历时不保证顺序,并且不保证下次遍历的顺序和之前一样。HashSet中允许null元素。
  • LinkedHashSet的核心就是他是一个可以保持顺序的set集合,它的数据结构是基于LinkedHashMap
  • TreeSet是一组有次序的集合,如果没有指定排序规则Comparator,就会按照自然排序。TreeSet内的元素必须实现Comparable接口。
  • HashMap就是最基础最常用的一种Map,它无序,以散列表的方式进行存储。之前提到过,HashSet就是基于HashMap,只使用了HashMap的key作为单个元素存储。
  • LinkedHashMap的存储还是跟HashMap一样,采用哈希表方法存储,只不过LinkedHashMap多维护了一份head,tail链表。
  • WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,

3.HashMap 和 Hashtable 有什么区别?ConcurrentHashMap

  • Hashtable较早实现,继承的是陈旧的Dictionary类,HashMap是java1.2之后对Map接口的一个实现。
  • Hashtable线程安全,HashMap线程不安全。
  • Hashtable中key和value都不允许出现null值,而在HashMap中null可以作为键
  • Hashtable直接使用对象的hashCode,HashMap重新计算hash值
  • ConcurrentHashMap是线程安全的集合容器,可以使用Collections.synchronizedMap(HashMap)来包装HashMap作为同步容器

4.说一下 HashMap 的实现原理?

  • HashMap底层就是一个数组结构,数组中的每一项又是一个链表。
  • HashMap内部实现了一个Node节点,它实现了Map.Entry接口

5.说一下 HashSet 的实现原理?

  • 它底层是使用HashMap,将hashset中的值放在hashmap中的key中,将hashmap的value统一设置为PRESENT,PRESENT是一个静态的类对象,Object类型,所有HashSet的实例都共享这个对象。因为key是惟一的,这就实现了set的唯一性。
  • HashSet实现了Set这个接口。

6.ArrayList 和 LinkedList 的区别是什么?

  • ArrayList是一个实现了List接口的可变数组,它可以插入null,它的size, isEmpty, get, set, iterator,add这些方法的时间复杂度是O(1),如果add n个数据则时间复杂度是O(n),ArrayList不是synchronized的。
  • LinkedList是一个链表维护的序列容器。
  • 查找方面,ArrayList的效率更高,链表必须从头查找。
  • 插入删除方面,一般情况下链表的效率要比数组高不少,链表的插入只涉及几个元素,而数组需要涉及整个数组
  • 在内存申请方面,数组在达到初始的申请长度之后,就需要重新申请一个更大的数组然后迁移数据;而链表只需要动态创建既可

7.如何实现数组和 List 之间的转换?

8.ArrayList 和 Vector 的区别是什么?

  • ArrayList和Vector都实现了List接口,Vector支持线程的同步,访问速度比ArrayList要慢
  • 还有在内存不够的时候扩展是有区别的,ArrayList默认扩展50%+1个,Vector默认扩展1倍

9.Array 和 ArrayList 有何区别?

  • 可以把ArrayList看出一种会自动扩容的Array,Array是最高效的,但容量固定,而ArrayList是可扩容的,但牺牲效率

10.在 Queue 中 poll()和 remove()有什么区别?

  • 这两个方法都是从队列中删除第一个元素,但如果队列元素为空,remove则会抛出异常,而poll则只是返回null

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

  • hashtable、vector

12.迭代器 Iterator 是什么?

  • 迭代器模式又称游标模式,它提供一种方法访问一个容器
  • 相当于把一个Collection容器的所有对象,做成一个线性表,而iterator相当于一个指针

13.Iterator 怎么使用?有什么特点?

  • 主要有三个函数,hasNext、next、remove;
  • 我们不用关心各种容器的遍历机制, 只要使用Iterator , 会让人觉得各种容器的遍历方法都是一样的, 这也是java接口的重要意义.
  • ArrayList, HashSet容器内是没有 hasNext(), next()的方法的,而是具有 iterator() 这个方法,

14.Iterator 和 ListIterator 有什么区别?

  • listiterator有add方法,而iterator没有
  • listiterator有hasPrevious和previous方法,可以实现逆向遍历。而iterator不行
  • listiterator可以定位当前的索引位置,nextIndex和previousIndex都可以实现该功能。而iterator不行
  • 都可以实现删除对象,但是listiterator可以通过set方法实现对象的修改,而iterator不能

15.怎么确保一个集合不能被修改?

  • 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值