面试题答案
一键面试- 元素存储特性:
- List接口:
- 有序存储,即元素的存储顺序和插入顺序一致。例如,依次向
ArrayList
中添加元素a
、b
、c
,遍历ArrayList
时,获取到的元素顺序也是a
、b
、c
。
- 有序存储,即元素的存储顺序和插入顺序一致。例如,依次向
- Set接口:
- 无序存储,
Set
接口的实现类(如HashSet
)并不保证元素的存储顺序与插入顺序一致。例如,向HashSet
中依次添加元素1
、2
、3
,遍历HashSet
时,获取到的元素顺序可能不是1
、2
、3
。不过,TreeSet
是按照元素的自然顺序(或自定义比较器顺序)进行排序存储的。
- 无序存储,
- List接口:
- 是否允许重复元素:
- 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
。
- 不允许重复元素。如果向
- List接口:
- 遍历顺序:
- List接口:
- 因为是有序存储,所以可以按照插入顺序进行遍历。可以使用
for
循环、foreach
循环或者Iterator
进行遍历,都能保证遍历顺序与插入顺序一致。例如:
- 因为是有序存储,所以可以按照插入顺序进行遍历。可以使用
- List接口:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {
System.out.println(s);
}
上述代码输出结果为a
、b
、c
。
- 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);
}
上述代码输出结果为1
、2
、3
。