【34个Java集合面试题和答案汇总】在Java中, 访问者最常询问集合访问问题。以下是最常见的藏书面试问题及答案列表。
1)什么是Java中的Collection框架?
集合框架是类和接口的组合, 用于存储和处理对象形式的数据。为此, 它提供了各种类(例如ArrayList, Vector, Stack和HashSet等)以及接口(例如List, Queue, Set等)。
2)数组和集合之间的主要区别是什么?
数组和集合在存储对象的引用和操作数据方面有些相似, 但是它们在许多方面有所不同。数组和集合之间的主要区别如下:
- 数组始终具有固定大小, 即, 用户不能根据其要求或在运行时增加或减少数组的长度, 但是在Collection中, 可以根据需要动态更改大小。
- 数组只能存储同构或相似类型的对象, 但是在Collection中, 可以存储异类的对象。
- 数组无法提供” 现成的” ?满足用户要求的方法, 例如排序, 搜索等, 但是” 收集” 包括现成的方法供使用。
集合框架实现了各种接口, 集合接口和Map接口(java.util.Map)是Java集合框架的主要使用接口。 Collection Framework的接口列表如下:
1.集合接口:集合(java.util.Collection)是主要接口, 每个集合都必须实现此接口。
语法
public interface Collection<
E>
extends Iterable
其中< E> 表示此接口是通用类型
2. List接口:List接口扩展了Collection接口, 它是对象的有序集合。它包含重复的元素。它还允许元素的随机访问。
语法
public interface List<
E>
extends Collection<
E>
3. Set接口:Set接口(java.util.Set)是一个集合, 不能包含重复的元素。它只能包含Collection接口的继承方法
语法
public interface Set<
E>
extends Collection<
E>
队列接口:队列(java.util.Queue)接口定义队列数据结构, 该结构以FIFO(先进先出)形式存储元素。
语法
public interface Queue<
E>
extends Collection<
E>
4.出队接口:这是一个双端队列。它允许从两端插入和删除元素。它植入了堆栈和队列的属性, 因此它可以执行LIFO(后进先出)堆栈和FIFO(先进先出)队列操作。
语法
public interface Dequeue<
E>
extends Queue<
E>
5. Map接口:Map(java.util.Map)表示元素的键, 值对存储。 Map接口未实现Collection接口。它只能包含一个唯一键, 但可以有重复的元素。在Java中有两个实现Map的接口是Map接口和Sorted Map。
4)ArrayList和Vector有什么区别?
No. | ArrayList | Vector |
---|---|---|
ArrayList不同步。 | 向量已同步。 | |
ArrayList不是遗留类。 | Vector是一个遗留类。 | |
ArrayList将其大小增加到数组大小的50%。 | 向量通过使数组大小加倍来增加其大小。 | |
ArrayList不是” 线程安全的” 吗?因为它不同步。 | 向量列表是” 线程安全的” ?因为它的每个方法都是同步的。 |
No. | ArrayList | LinkedList |
---|---|---|
ArrayList使用动态数组。 | LinkedList使用双链表。 | |
ArrayList的操作效率不高, 因为需要太多。 | LinkedList对于操作非常有效。 | |
ArrayList更好地存储和获取数据。 | LinkedList更好地处理数据。 | |
ArrayList提供随机访问。 | LinkedList不提供随机访问。 | |
ArrayList仅存储对象, 因此占用较少的内存开销 | LinkedList需要更多的内存开销, 因为它存储了对象以及该对象的地址。 |
Iterator仅沿向前方向遍历元素, 而ListIterator仅沿向前和向后遍历元素。
No. | Iterator | ListIterator |
---|---|---|
迭代器仅沿向前方向遍历元素。 | ListIterator沿向后和向前方向遍历元素。 | |
迭代器可以在列表, 集合和队列中使用。 | ListIterator只能在List中使用。 | |
迭代器只能在遍历集合时执行删除操作。 | ListIterator可以执行” 添加” 吗? ?去掉, ?和?在遍历集合时进行操作。 |
No. | Iterator | Enumeration |
---|---|---|
迭代器可以遍历旧版元素和非旧版元素。 | 枚举只能遍历旧元素。 | |
迭代器是快速失败的。 | 枚举不是快速失败的。 | |
迭代器比枚举慢。 | 枚举比Iterator快。 | |
遍历集合时, 迭代器可以执行删除操作。 | 枚举只能对集合执行遍历操作。 |
List和Set都扩展了收集接口。但是, 下面列出了两者之间的某些区别。
- 列表可以包含重复元素, 而集合可以包含唯一项。
- List是一个有序集合, 它维护插入顺序, 而Set是一个无序集合, 它不保留插入顺序。
- List接口包含单个旧类, 即Vector类, 而Set接口没有任何旧类。
- List接口可以允许n个空值, 而Set接口仅允许单个空值。
HashSet和TreeSet这两个类都实现Set接口。两者之间的区别在下面列出。
- HashSet保持不顺序, 而TreeSet保持升序。
- HashSet由哈希表实现, 而TreeSet由Tree结构实现。
- HashSet的执行速度比TreeSet快。
- HashSet由HashMap支持, 而TreeSet由TreeMap支持。
Set和Map之间的区别如下。
- Set仅包含值, 而Map包含键和值。
- Set包含唯一值, 而Map可以包含具有重复值的唯一Key。
- Set包含单个数量的null值, 而Map可以包含单个n个null值的null键。
下面列出了HashSet和HashMap之间的区别。
- HashSet仅包含值, 而HashMap包含条目(键, 值)。 HashSet可以进行迭代, 但是HashMap需要转换为Set进行迭代。
- HashSet实现Set接口, 而HashMap实现Map接口
- HashSet不能有任何重复值, 而HashMap可以包含具有唯一键的重复值。
- HashSet包含唯一数量的null值, 而HashMap可以包含一个n个null值的单个null键。
HashMap和TreeMap之间的区别如下。
- HashMap不维持任何顺序, 但是TreeMap维持升序。
- HashMap由哈希表实现, 而TreeMap由Tree结构实现。
- HashMap可以按键或值排序, 而TreeMap可以按键排序。
- HashMap可能包含具有多个空值的空键, 而TreeMap不能持有空键, 但可以具有多个空值。
No. | HashMap | Hashtable |
---|---|---|
HashMap不同步。 | 哈希表已同步。 | |
HashMap可以包含一个null键和多个null值。 | 哈希表不能包含任何空键或空值。 | |
HashMap不是” 线程安全的” 吗?因此对于非线程应用程序很有用。 | 哈希表是线程安全的, 并且可以在各个线程之间共享。 | |
4)HashMap继承了AbstractMap类 | Hashtable继承了Dictionary类。 |
集合与集合之间的区别如下。
- Collection是一个接口, 而Collections是一个类。
- 集合接口为列表, 集合和队列提供数据结构的标准功能。但是, Collections类是对集合元素进行排序和同步。
- Collection接口提供可用于数据结构的方法, 而Collections类提供可用于集合的各种操作的静态方法。
No. | Comparable | Comparator |
---|---|---|
可比仅提供一种序列。 | 比较器提供多种序列。 | |
它提供了一种名为compareTo()的方法。 | 它提供了一种名为compare()的方法。 | |
在java.lang包中可以找到它。 | 它位于java.util包中。 | |
如果我们实现Comparable接口, 则会修改实际的类。 | 实际的类别不变。 |
BlockingQueue是扩展Queue接口的接口。它在诸如检索, 插入, 删除之类的操作中提供并发性。在检索任何元素时, 它将等待队列为非空。在存储元素时, 它等待可用空间。 BlockingQueue不能包含null元素, 并且BlockingQueue的实现是线程安全的。
语法
public interface BlockingQueue<
E>
extends Queue <
E>
17)属性文件的优点是什么?
如果更改属性文件中的值, 则无需重新编译java类。因此, 它使应用程序易于管理。它用于存储经常更改的信息。考虑以下示例。
import java.util.*;
import java.io.*;
public class Test {
public static void main(String[] args)throws Exception{
FileReader reader=new FileReader("db.properties");
Properties p=new Properties();
p.load(reader);
System.out.println(p.getProperty("user"));
System.out.println(p.getProperty("password"));
}
}
输出
system
oracle
18)hashCode()方法是什么?
hashCode()方法返回哈希码值(整数)。
如果两个键(通过调用equals()方法)相同, 则hashCode()方法将返回相同的整数。
但是, 两个哈希码编号可能具有不同或相同的密钥。
如果两个对象使用equals()方法不能产生相等的结果, 则hashcode()方法将为两个对象提供不同的整数结果。
19)为什么我们重写equals()方法?
equals方法用于检查两个对象是否相同。如果要基于属性检查对象, 则需要覆盖它。
例如, Employee是一个具有3个数据成员的类:id, 名称和薪水。但是, 我们想通过薪水检查雇员对象的相等性。然后, 我们需要重写equals()方法。
20)如何同步List, Set和Map元素?
是的, Collections类提供了使List, Set或Map元素同步的方法:
使用通用集合有三个主要优点。
- 如果使用泛型类, 则不需要类型转换。
- 它是类型安全的, 并在编译时检查。
- 泛型通过在编译时检测到错误来确认代码的稳定性。
具有相同哈希值的两个不同键称为哈希冲突。两个单独的条目将保存在单个哈希存储桶中, 以避免冲突。有两种避免哈希冲突的方法。
- 单独链接
- 公开地址
Dictionary类提供了存储键值对的功能。
24)在基于哈希的集合中, 负载因子的默认大小是多少?
负载系数的默认大小为0.75。默认容量计算为初始容量*负载系数。例如, 16 * 0.75 =12。因此, 12是Map的默认容量。
25)通过快速失败你了解什么?
如果发生任何结构修改, 则Java中立即引发ConcurrentmodificationException的Iterator称为快速失败迭代器。故障转移迭代器不需要任何额外的内存空间。
26)Array和ArrayList有什么区别?
Array和ArrayList之间的主要区别如下。
SN | Array | ArrayList |
---|---|---|
数组的大小固定, 这意味着我们无法根据需要调整数组的大小。 | ArrayList的大小不是固定的, 我们可以动态更改大小。 | |
数组是静态类型。 | ArrayList具有动态大小。 | |
数组可以存储原始数据类型以及对象。 | ArrayList无法存储原始数据类型, 它只能存储对象。 |
数组的长度可以使用length属性获得, 而ArrayList不支持length属性, 但是我们可以使用size()方法获取列表中对象的数量。
查找数组的长度
Int [] array = new int[4];
System.out.println("The size of the array is " + array.length);
查找ArrayList的大小
ArrayList<
String>
list=new ArrayList<
String>
();
list.add("ankit");
list.add("nippun");
System.out.println(list.size());
28)如何将ArrayList转换为Array以及将Array转换为ArrayList?
我们可以使用Arrays类的asList()方法将Array转换为ArrayList。 asList()方法是Arrays类的静态方法, 并接受List对象。考虑以下语法:
Arrays.asList(item)
我们可以使用ArrayList类的toArray()方法将ArrayList转换为Array。考虑以下语法, 将ArrayList转换为List对象。
List_object.toArray(new
String[List_object.size()])
29)如何使Java ArrayList只读?
我们可以通过调用Collections.unmodifiableCollection()方法来获取java ArrayList只读。当我们将ArrayList定义为只读时, 我们将无法通过add(), remove()或set()方法对集合进行任何修改。
30)如何从ArrayList中删除重复项?
有两种方法可以从ArrayList中删除重复项。
- 使用HashSet:通过使用HashSet, 我们可以从ArrayList中删除重复的元素, 但是它将不会保留插入顺序。
- 使用LinkedHashSet:我们还可以通过使用LinkedHashSet而不是HashSet来维护插入顺序。
- 将ArrayList的所有元素复制到LinkedHashSet。
- 使用clear()方法清空ArrayList, 该方法将从列表中删除所有元素。
- 现在, 将LinkedHashset的所有元素复制到ArrayList。
要反转ArrayList, 我们可以使用Collections类的reverse()方法。考虑以下示例。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class ReverseArrayList {
public static void main(String[] args) {
List list = new ArrayList<
>
();
list.add(10);
list.add(50);
list.add(30);
Iterator i = list.iterator();
System.out.println("printing the list....");
while(i.hasNext())
{
System.out.println(i.next());
}
Iterator i2 = list.iterator();
Collections.reverse(list);
System.out.println("printing list in reverse order....");
while(i2.hasNext())
{
System.out.println(i2.next());
}
}
}
输出
printing the list....
10
50
30
printing list in reverse order....
30
50
10
32)如何按降序排列ArrayList?
要按降序对ArrayList进行排序, 我们可以使用Collections类的reverseOrder方法。考虑以下示例。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
public class ReverseArrayList {
public static void main(String[] args) {
List list = new ArrayList<
>
();
list.add(10);
list.add(50);
list.add(30);
list.add(60);
list.add(20);
list.add(90);
Iterator i = list.iterator();
System.out.println("printing the list....");
while(i.hasNext())
{
System.out.println(i.next());
}
Comparator cmp = Collections.reverseOrder();
Collections.sort(list, cmp);
System.out.println("printing list in descending order....");
Iterator i2 = list.iterator();
while(i2.hasNext())
{
System.out.println(i2.next());
}}
}
输出
printing the list....
10
50
30
60
20
90
printing list in descending order....
90
60
50
30
20
10
33)如何同步ArrayList?
我们可以通过两种方式同步ArrayList。
- 使用Collections.synchronizedList()方法
- 使用CopyOnWriteArrayList < T>
LinkedLists最好用于更新操作, 而ArrayLists最好用于搜索操作。
1 2 3 4 5 6 7 8
Java OOP面试问题 |
Java字符串和异常面试问题 |
JDBC面试问题 |
JSP面试问题 |
休眠面试问题 |
SQL面试题 |
Android面试题 |
MySQL面试问题 |
2)
3)
4)
1)
2)
3)
4)
5)
1)
2)
3)
1)
2)
3)
4)
1)
2)
3)
4)
1)
2)
3)
4)
公共静态列表syncedList(列表l){}
公共静态集合SynchronizedSet(Set s){}
公共静态SortedSetsyncedSortedSet(SortedSet s){}
公共静态地图SyncedMap(地图m){}
公共静态SortedMapsyncedSortedMap(SortedMap m){}
1
2
3
Java基础面试问题
Java多线程面试问题
Java Collection面试题
Servlet面试问题
春季面试问题
PL / SQL面试问题
Oracle面试问题
SQL Server面试问题
推荐阅读
- 300个核心Java面试问题和答案(一)
- 面试必备!WPF面试题和答案汇集
- 最全面!Silverlight面试题和答案汇总
- WCF面试问题和答案精华合集
- 史上最全!F#面试题和答案合集
- 最全面的ASP.NET面试题和答案合集
- 史上最全的ADO.NET面试题和答案
- 史上最全的.Net面试题和答案合集
- 面试必备!Phalcon面试题和知识点汇总