JAVA面试——容器

 

1、Java的容器有哪些?

Java容器分为Collection和Map两大类,其下又有很多子类,如下所示:

  ●Collection

    。List

    。ArrayList

    。LinkedList

    。Vector

      ■Stack

    。Set

    。HashSet

      ■LinkedHashSet

    。TreeSet

   ●Map

     。HashMap

    。LinkedHashMap

    。TreeMap

    。ConcurrentHashMap

    。Hashtable

 

 

 

2、Collection和Collections有什么区别?

  1)Collection是一个集合接口,它提供了对集合对行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等。

   2)Collections是一个包装类,包含了很多静态方法,不能被实例化,就像个工具类,比如提供的排序方法:Collections, sort(list)。

 

 

 

3、 Collection 和 Collections 有什么区别?

  List、Set、Map的区别主要体现在两个方面:元素是否有序'是否允许元素重复。 三者之间的区别,如下表:

 

 

 

 

4、 HashMap 和 Hashtable 有什么区别?

  •存储:HashMap运行 key 和 value 为 null, 而 Hashtable不允许。

  •线程安全:Hashtable是线程安全的,而HashMap是非线程安全的。

  •推荐使用:在Hashtable的类注释可以看到,Hashtable是保留类不建议使用,推荐在单线程环境下使用 HashMap替代,如果需要多线程使用则用ConcurrentHashMap 替代。

 

 

 

5、如何决定使用HashMap还是Tree Map?

  对于在Map中插入、删除、定位一个元素这类操作,HashMap是最好的选择,因为相对而言HashMap的插入会更快,但如果你要对一个key集合进行有序的遍历,那TreeMap的选择。

 

 

 

6、说一下HashMap的实现原理?

  HashMap基于Hash算法实现的,我们通过put(key,value)存储,get(key)来获取。当传入key时,HashMap会根据key. hashCode()计算出hash值,根据hash值将value保存在bucket里。当计算出的hash值相同时,我们称之为hash冲突,HashMap的做法是用链表和红黑树存储相同hash值的value。当hash冲突的个数比较少时,使用链表否则使用红黑树。

 

 

 

7、说一下HashSet的实现原理?

  HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许重复的值。

 

 

 

8、 Array List 和 Linked List 的区别是什么?

  •数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现。

  •随机访问效率:ArrayList比Li n ked List在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

  •增加和删除效率:在非首尾的增加和删除操作,LinkedList要比ArrayList效率要高,因为ArrayList增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用LinkedList。

 

 

 

9、 如何实现数组和List之间的转换?

  •数组转List:使用 Arrays.asList(array)进行转换。

  • List转数组:使用List自带的toArray()方法。

 

 

 

10、 AirayList和Vector的区别是什么?

  •线程安全:Vector使用了 Synchronized来实现线程同步,是线程安全的,而ArrayList是非线程安全的。

  •性能:ArrayList在性能方面要优于Vector。

  •扩容:ArrayList和Vector都会根据实际的需要动态的调整容量,只不过在Vector扩容每次会增加1倍,而Array List只会增加50%。

 

 

11、 Array 和 ArrayList 有何区别?

  • Array可以存储基本数据类型和对象,ArrayList只能存储对象。

  • Array是指定固定大小的,而ArrayList大小是自动扩展的。

  • Array内置方法没有ArrayList多,比如addAll、removeAll、iteration等方法只有ArrayList 有。

 

 

 

12、在Queue中poll()和remove()有什么区别?

  •相同点:都是返回第4元素,并在队列中删除返回的对象。

  •不同点:如果没有元素 P〇ll()会返回null, 而 remove()会直接抛出NoSuchElementException 异常。

代码示例:

Queue queue = new LinkedList();
queue. offer("string"); // add
System, out. println(queue. poll());
System, out. println(queue, remove());
System, out. println(queue. size());

 

 

 

13、哪些集合类是线程安全的?

  Vector、Hashtable、Stack都是线程安全的,而像HashMap则是非线程安全的,不过在JDK 1.5之后随着Java. util, concurrent并发包的出现,它们也有了自己对应的线程安全类,比如HashMap对应的线程安全类就是ConcurrentHashMap。

 

 

14、迭代器Iterator是什么?

  Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获雌代器实例。迭代器取代了 Java集合框架中的Enumeration,迭代器允许调用者在迭代过程中移除元素。

 

 

 

15、 Iteratr怎么使用?有什么特点?

Iterator使用代码如下:

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it. hasNext()){
String obj = it. next();
System, out. println(obj);
}

Iterator的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

 

 

 

16、Iterator和 Listlterator有什么区别?

  • Iterator可以遍历Set和List集合,而Listlterator只能遍历List。

  • Iterator只能单向遍历,而Listlterator可以双向遍历(向前/后遍历)。

  • Listlterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一^元素、获取前面或后面元素的索引位置。

 

 

 

17、 怎么确保一个集合不能被修改?

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

示例代码如下:

List<String> list = new ArrayListo ();
list.add("x");
Collection<String> clist = Collections.unmodifiableCollection(list);
clist.add("y"); //运行时此行报错
System.out.println(list.size());

 

posted @ 2019-10-16 14:56  晓->冥->王  阅读(205)  评论(0编辑  收藏  举报