个性化阅读
专注于IT技术分析

34个Java集合面试题和答案汇总

在Java中, 访问者最常询问集合访问问题。以下是最常见的藏书面试问题及答案列表。


1)什么是Java中的Collection框架?

集合框架是类和接口的组合, 用于存储和处理对象形式的数据。为此, 它提供了各种类(例如ArrayList, Vector, Stack和HashSet等)以及接口(例如List, Queue, Set等)。


2)数组和集合之间的主要区别是什么?

数组和集合在存储对象的引用和操作数据方面有些相似, 但是它们在许多方面有所不同。数组和集合之间的主要区别如下:

  • 数组始终具有固定大小, 即, 用户不能根据其要求或在运行时增加或减少数组的长度, 但是在Collection中, 可以根据需要动态更改大小。
  • 数组只能存储同构或相似类型的对象, 但是在Collection中, 可以存储异类的对象。
  • 数组无法提供”现成的”?满足用户要求的方法, 例如排序, 搜索等, 但是”收集”包括现成的方法供使用。

3)解释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不是”线程安全的”吗?因为它不同步。 向量列表是”线程安全的”?因为它的每个方法都是同步的。

5)ArrayList和LinkedList有什么区别?

No. ArrayList LinkedList
ArrayList使用动态数组。 LinkedList使用双链表。
ArrayList的操作效率不高, 因为需要太多。 LinkedList对于操作非常有效。
ArrayList更好地存储和获取数据。 LinkedList更好地处理数据。
ArrayList提供随机访问。 LinkedList不提供随机访问。
ArrayList仅存储对象, 因此占用较少的内存开销 LinkedList需要更多的内存开销, 因为它存储了对象以及该对象的地址。

6)Iterator和ListIterator有什么区别?

Iterator仅沿向前方向遍历元素, 而ListIterator仅沿向前和向后遍历元素。

No. Iterator ListIterator
迭代器仅沿向前方向遍历元素。 ListIterator沿向后和向前方向遍历元素。
迭代器可以在列表, 集合和队列中使用。 ListIterator只能在List中使用。
迭代器只能在遍历集合时执行删除操作。 ListIterator可以执行”添加”吗? ?去掉, ?和?在遍历集合时进行操作。

7)Iterator和Enumeration有什么区别?

No. Iterator Enumeration
迭代器可以遍历旧版元素和非旧版元素。 枚举只能遍历旧元素。
迭代器是快速失败的。 枚举不是快速失败的。
迭代器比枚举慢。 枚举比Iterator快。
遍历集合时, 迭代器可以执行删除操作。 枚举只能对集合执行遍历操作。

8)List和Set有什么区别?

List和Set都扩展了收集接口。但是, 下面列出了两者之间的某些区别。

  • 列表可以包含重复元素, 而集合可以包含唯一项。
  • List是一个有序集合, 它维护插入顺序, 而Set是一个无序集合, 它不保留插入顺序。
  • List接口包含单个旧类, 即Vector类, 而Set接口没有任何旧类。
  • List接口可以允许n个空值, 而Set接口仅允许单个空值。

9)HashSet和TreeSet有什么区别?

HashSet和TreeSet这两个类都实现Set接口。两者之间的区别在下面列出。

  • HashSet保持不顺序, 而TreeSet保持升序。
  • HashSet由哈希表实现, 而TreeSet由Tree结构实现。
  • HashSet的执行速度比TreeSet快。
  • HashSet由HashMap支持, 而TreeSet由TreeMap支持。

10)Set和Map有什么区别?

Set和Map之间的区别如下。

  • Set仅包含值, 而Map包含键和值。
  • Set包含唯一值, 而Map可以包含具有重复值的唯一Key。
  • Set包含单个数量的null值, 而Map可以包含单个n个null值的null键。

11)HashSet和HashMap有什么区别?

下面列出了HashSet和HashMap之间的区别。

  • HashSet仅包含值, 而HashMap包含条目(键, 值)。 HashSet可以进行迭代, 但是HashMap需要转换为Set进行迭代。
  • HashSet实现Set接口, 而HashMap实现Map接口
  • HashSet不能有任何重复值, 而HashMap可以包含具有唯一键的重复值。
  • HashSet包含唯一数量的null值, 而HashMap可以包含一个n个null值的单个null键。

12)HashMap和TreeMap有什么区别?

HashMap和TreeMap之间的区别如下。

  • HashMap不维持任何顺序, 但是TreeMap维持升序。
  • HashMap由哈希表实现, 而TreeMap由Tree结构实现。
  • HashMap可以按键或值排序, 而TreeMap可以按键排序。
  • HashMap可能包含具有多个空值的空键, 而TreeMap不能持有空键, 但可以具有多个空值。

13)HashMap和Hashtable有什么区别?

No. HashMap Hashtable
HashMap不同步。 哈希表已同步。
HashMap可以包含一个null键和多个null值。 哈希表不能包含任何空键或空值。
HashMap不是”线程安全的”吗?因此对于非线程应用程序很有用。 哈希表是线程安全的, 并且可以在各个线程之间共享。
4)HashMap继承了AbstractMap类 Hashtable继承了Dictionary类。

14)Collection和Collections有什么区别?

集合与集合之间的区别如下。

  • Collection是一个接口, 而Collections是一个类。
  • 集合接口为列表, 集合和队列提供数据结构的标准功能。但是, Collections类是对集合元素进行排序和同步。
  • Collection接口提供可用于数据结构的方法, 而Collections类提供可用于集合的各种操作的静态方法。

15)Comparable和Comparator有什么区别?

No. Comparable Comparator
可比仅提供一种序列。 比较器提供多种序列。
它提供了一种名为compareTo()的方法。 它提供了一种名为compare()的方法。
在java.lang包中可以找到它。 它位于java.util包中。
如果我们实现Comparable接口, 则会修改实际的类。 实际的类别不变。

16)你对BlockingQueue了解什么?

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元素同步的方法:


21)泛型集合有什么优势?

使用通用集合有三个主要优点。

  • 如果使用泛型类, 则不需要类型转换。
  • 它是类型安全的, 并在编译时检查。
  • 泛型通过在编译时检测到错误来确认代码的稳定性。

22)Hashtable中的哈希冲突是什么?在Java中如何处理?

具有相同哈希值的两个不同键称为哈希冲突。两个单独的条目将保存在单个哈希存储桶中, 以避免冲突。有两种避免哈希冲突的方法。

  • 单独链接
  • 公开地址

23)什么是字典类?

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无法存储原始数据类型, 它只能存储对象。

27)Array的长度和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来维护插入顺序。

使用LinkedHashSet从ArrayList中删除重复元素的过程:

  • 将ArrayList的所有元素复制到LinkedHashSet。
  • 使用clear()方法清空ArrayList, 该方法将从列表中删除所有元素。
  • 现在, 将LinkedHashset的所有元素复制到ArrayList。

31)如何反转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>

34)何时使用ArrayList和LinkedList?

LinkedLists最好用于更新操作, 而ArrayLists最好用于搜索操作。


1 2 3 4 5 6 7 8


Java OOP面试问题
Java字符串和异常面试问题
JDBC面试问题
JSP面试问题
休眠面试问题
SQL面试题
Android面试题
MySQL面试问题

1)

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面试问题

赞(0) 打赏
未经允许不得转载:srcmini » 34个Java集合面试题和答案汇总
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏