MST

星途 面试题库

面试题:Java中List接口和Set接口的主要区别是什么

在Java集合框架中,List接口和Set接口是非常重要的两个接口,请详细阐述它们在元素存储特性、是否允许重复元素、遍历顺序等方面的主要区别。
26.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 元素存储特性
    • List接口
      • 有序存储,即元素的存储顺序和插入顺序一致。例如,依次向ArrayList中添加元素abc,遍历ArrayList时,获取到的元素顺序也是abc
    • Set接口
      • 无序存储,Set接口的实现类(如HashSet)并不保证元素的存储顺序与插入顺序一致。例如,向HashSet中依次添加元素123,遍历HashSet时,获取到的元素顺序可能不是123。不过,TreeSet是按照元素的自然顺序(或自定义比较器顺序)进行排序存储的。
  2. 是否允许重复元素
    • List接口
      • 允许重复元素。比如在ArrayList中,可以多次添加同一个元素,ArrayList list = new ArrayList(); list.add("test"); list.add("test");,此时list中就有两个相同的"test"元素。
    • Set接口
      • 不允许重复元素。如果向Set中添加已经存在的元素,添加操作将失败(不会抛出异常,只是该元素不会被再次添加进去)。例如,HashSet set = new HashSet(); set.add("test"); set.add("test");set的实际元素个数仍然是1
  3. 遍历顺序
    • List接口
      • 因为是有序存储,所以可以按照插入顺序进行遍历。可以使用for循环、foreach循环或者Iterator进行遍历,都能保证遍历顺序与插入顺序一致。例如:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {
    System.out.println(s);
}

上述代码输出结果为abc

  • Set接口
    • 对于HashSet,遍历顺序通常是不确定的,因为其内部是基于哈希表实现的。例如:
HashSet<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
for (String s : set) {
    System.out.println(s);
}

每次运行上述代码,输出顺序可能都不一样。 - 而TreeSet是按照元素的自然顺序(或自定义比较器顺序)进行遍历的。例如:

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
for (Integer i : treeSet) {
    System.out.println(i);
}

上述代码输出结果为123