java 容器类 面试_Java面试清单(二、容器)

java 容器都有哪些?

简单的来说Java容器类类库的用途是“持有对象”,并将其划分为两个不同的概念:

1.Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。List必须按照插入的顺序保存元素,而set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。

2.Map:一组成对的“键值对”对象,允许你使用键来查找值。

Collection 和 Collections 有什么区别?

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

2.Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

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

HashMap 和 Hashtable 有什么区别?

如何决定使用 HashMap 还是 TreeMap?MapHashMapTreeMap /适用情况查询增加、快速创建

原因基于散列表实现基于红黑树实现

说一下 HashMap 的实现原理?

说一下 HashSet 的实现原理?

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,更确切的说,HashSet中的元素,只是存放在了底层HashMap的key上, 而value使用一个static final的Object对象标识。因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成。

ArrayList 和 LinkedList 的区别是什么?

ArrayList : 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。 JDK8 中ArrayList扩容的实现是通过grow()方法里使用语句newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍扩容)计算容量,然后调用Arrays.copyof()方法进行对原数组进行复制。

LinkedList:采用链表数据结构,插入和删除速度快,但访问速度慢。

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

转换为数组为list:

使用Stream中的Collector收集器

1

2String[] arrays = new String[]{"a", "b", "c"};

List listStrings = Stream.of(arrays).collector(Collectors.toList());

使用java.util.Arrays工具类中的asList()方法

1

2String[] arrays = new String[]{"a", "b", "c"};

List listStrings = Arrays.asList(arrays);

转换list为数组:

1

2String[] ss = listStrings.stream().toArray(String[]::new);

String[] sss = listStrings.toArray(new String[listStrings.size()]);

ArrayList 和 Vector 的区别是什么?

Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。

当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

Array 和 ArrayList 有何区别?

可以将 ArrayList想象成一种“会自动扩增容量的Array”,Array[]:最高效,但是其容量固定且无法动态改变;

ArrayList:容量可动态增长,但是牺牲效率。

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

可以将 ArrayList想象成一种“会自动扩增容量的Array”,Array[]:最高效,但是其容量固定且无法动态改变;

ArrayList:容量可动态增长,但是牺牲效率。

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

Vector:就比ArrayList多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

Stack:堆栈类,先进后出。

HashTable:上文已经说过和HashMap的区别以及原理

Enumeration:枚举,相当于迭代器。

迭代器 Iterator 是什么?

Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包括了可以返回迭代器实例的迭代方法。迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除。

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

1.Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationException的异常。

2.Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素。

3.Iterator必须依附某个Collection对象而存在,Iterator本身不具有装载数据对象的功能。

4.Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象。

5.强调一下next()方法,该方法通过游标指向的形式返回Iterator下一个元素。

Iterator 和 ListIterator 有什么区别?

1.iterator()方法在set和list接口中都有定义,但是ListIterator()仅存在于List接口中(或实现类中)。

2.ListIterator有add()方法,可以向List中添加对象,而Iterator不能。

3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

4.ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

5.都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

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

私有化 放到一个对象里。或者

ImmutableList imList = ImmutableList.copyOf(list);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值