面试题答案
一键面试主要区别
- 元素唯一性:
- List:允许元素重复。例如可以在一个
ArrayList
中多次添加同一个元素。 - Set:不允许元素重复。如果试图向
Set
中添加已存在的元素,添加操作通常会失败(返回false
,HashSet
等实现是这样的情况)。
- List:允许元素重复。例如可以在一个
- 顺序性:
- List:有序,即元素的插入顺序和存储顺序一致。可以通过索引来访问元素,例如
list.get(0)
获取第一个元素。 - Set:无序,元素的存储顺序和插入顺序不一定相同。通常不能通过索引来访问元素,例如
HashSet
。不过TreeSet
是按照自然顺序或自定义顺序排序的,但不是插入顺序。
- List:有序,即元素的插入顺序和存储顺序一致。可以通过索引来访问元素,例如
- 实现类:
- List:常见实现类有
ArrayList
、LinkedList
等。ArrayList
基于数组实现,查询效率高;LinkedList
基于链表实现,增删效率高。 - Set:常见实现类有
HashSet
、TreeSet
、LinkedHashSet
。HashSet
基于哈希表实现,查找效率高;TreeSet
基于红黑树实现,可对元素排序;LinkedHashSet
保持插入顺序,同时具备哈希表的查找性能。
- List:常见实现类有
适用场景
- List适用场景:
- 需要按照插入顺序遍历元素:比如记录用户操作日志,按照操作的先后顺序记录,使用
List
可以保证顺序性。
List<String> operationLogs = new ArrayList<>(); operationLogs.add("User logged in"); operationLogs.add("User created a new file"); for (String log : operationLogs) { System.out.println(log); }
- 需要频繁通过索引访问元素:例如学生成绩管理系统中,要经常根据学生在列表中的位置获取成绩,
ArrayList
比较合适。
List<Integer> scores = new ArrayList<>(); scores.add(85); scores.add(90); int secondStudentScore = scores.get(1);
- 需要按照插入顺序遍历元素:比如记录用户操作日志,按照操作的先后顺序记录,使用
- Set适用场景:
- 需要保证元素唯一性:比如统计一篇文章中出现的不重复单词,使用
Set
可以确保每个单词只记录一次。
Set<String> words = new HashSet<>(); String[] text = {"apple", "banana", "apple", "cherry"}; for (String word : text) { words.add(word); } for (String uniqueWord : words) { System.out.println(uniqueWord); }
- 需要对元素进行排序:比如在一个游戏排行榜系统中,需要对玩家得分进行排序展示,
TreeSet
比较合适。
Set<Integer> scores = new TreeSet<>(); scores.add(100); scores.add(80); scores.add(90); for (Integer score : scores) { System.out.println(score); }
- 需要保证元素唯一性:比如统计一篇文章中出现的不重复单词,使用