Java常见面试题(二)容器

二、容器       

1.java 容器都有哪些?

 

2.Collection 和 Collections 有什么区别?

1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),大多数方法都是用来处理线性表的。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

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

List:有序集合

Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序

Map:键值对集合

扫描二维码关注公众号,回复: 11975580 查看本文章

4.HashMap 和 Hashtable 有什么区别?

JDK1.8 主要区别如下:

​​​​
  1. 线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。
  2. key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
  3. 迭代器不同。HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器。
  4. hash的计算方式不同。HashMap计算了hash值;Hashtable使用了key的hashCode方法。Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。 HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。为了减少冲突,HashMap重新根据hashcode计算hash值后,又对hash值做了一些运算来打散数据
  5. 默认初始大小和扩容方式不同。HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
  6. 是否有contains方法。HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
  7. 父类不同。HashMap继承自AbstractMap;Hashtable继承自Dictionary。

5.如何决定使用 HashMap 还是 TreeMap?

TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排列的;TreeMap的实现也是基于红黑树结构。

而HashMap<K,V>的Key值实现散列hashCode(),分布是散列的均匀的,不支持排序,数据结构主要是桶(数组),链表或红黑树。

所以,查询的时候使用HashMap,增加、快速创建的时候使用TreeMap。

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

当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部。当需要取出一个Entry 时,也会根据 hash 算法找到其在数组中的存储位置,再根据 equals 方法从该位置上的链表中取出该Entry。

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

对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素。如果此 set 中尚未包含指定元素,则添加指定元素。更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2)) 的元素 e2,则向此 set 添加指定的元素 e。如果此 set 已包含该元素,则该调用不更改 set 并返回 false。但底层实际将将该元素作为 key 放入 HashMap。

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

ArrayList底层是一个数组,数组是同一类对象的连续存储,每个对象占用固定的字节,想要查询某个位置可以直接计算得到;LinkedList底层是一个链表,在内存中地址不连续,只能通过遍历查找,所以速度慢。插入删除同理。

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

数组转List

     1、循环

     2、new ArrayList<String>(Arrays.asList(str))

     3、Collections.addAll(list4, str)

     4、Stream.of(str).collect(Collectors.toList())

List转数组

     1、循环

     2、list.toArray(new String[list.size()]),

//错误方式:易错   list.toArray()返回的是Object[]数组,怎么可以转型为String

//ArrayList<String> list3=new ArrayList<String>();

//String strings[]=(String [])list.toArray();

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

Vector 的方法都是同步的,线程安全;ArrayList 非线程安全,但性能比Vector好

默认初始化容量都是10,Vector 扩容默认会翻倍,可指定扩容的大小;ArrayList只增加 50%

11.Array 和 ArrayList 有何区别?

定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固定并且类型相同。

ArrayList 是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不同类型元素。

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

Queue 中 remove() 和 poll()都是用来从队列头部删除一个元素。

在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。

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

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector。

14.迭代器 Iterator 是什么?

首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。

Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。一个类需要有一个对应迭代器类实现迭代器接口

通过index hasNext()  next()实现

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

  • terator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
  • Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素。
  • Iterator必须依附某个Collection对象而存在,Iterator本身不具有装载数据对象的功能。
  • Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象。
  • 强调以下next()方法,该方法通过游标指向的形式返回Iterator下一个元素。

16.Iterator 和 ListIterator 有什么区别?

ListIterator 继承 Iterator

ListIterator 比 Iterator多方法

  • add(E e)  将指定的元素插入列表,插入位置为迭代器当前位置之前
  • set(E e)  迭代器返回的最后一个元素替换参数e
  • hasPrevious()  迭代器当前位置,反向遍历集合是否含有元素
  • previous()  迭代器当前位置,反向遍历集合,下一个元素
  • previousIndex()  迭代器当前位置,反向遍历集合,返回下一个元素的下标
  • nextIndex()  迭代器当前位置,返回下一个元素的下标

使用范围不同,Iterator可以迭代所有集合;ListIterator 只能用于List及其子类

ListIterator 有 add 方法,可以向 List 中添加对象;Iterator 不能

ListIterator 有 hasPrevious() 和 previous() 方法,可以实现逆向遍历;Iterator不可以

ListIterator 有 nextIndex() 和previousIndex() 方法,可定位当前索引的位置;Iterator不可以

ListIterator 有 set()方法,可以实现对 List 的修改;Iterator 仅能遍历,不能修改

 

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

Collections包下的unmodifiableMap方法;

使用final的集合还是可以更改的->因为final只限定引用即地址,相当于集合的地址不能改变,但是内容可以改;对于string任何修改就需要创建新的对象,此时不能修改

题目主要来自:https://blog.csdn.net/sufu1065/article/details/88051083

学习:Java 集合学习指南

猜你喜欢

转载自blog.csdn.net/qq_36366757/article/details/105007326