面试题答案
一键面试List、Set和Map的特性区别
- List(列表)
- 有序性:List中的元素有顺序,按照添加的顺序存储。可以通过索引访问元素,索引从0开始。
- 可重复性:允许元素重复,即可以有多个相同的元素存在于List中。
- 实现类:常见的实现类有ArrayList和LinkedList。ArrayList基于数组实现,随机访问效率高;LinkedList基于链表实现,插入和删除操作效率高。
- Set(集合)
- 无序性:Set中的元素没有特定顺序,不保证按照添加的顺序存储。
- 不可重复性:Set不允许有重复元素,当试图添加已存在的元素时,添加操作会失败(某些实现会忽略重复元素的添加)。
- 实现类:常见的实现类有HashSet和TreeSet。HashSet基于哈希表实现,查找效率高;TreeSet基于红黑树实现,能保持元素的排序(自然排序或自定义排序)。
- Map(映射)
- 键值对存储:Map存储的是键值对(key - value pairs),通过键来访问对应的值。
- 键的唯一性:键是唯一的,每个键最多映射到一个值。但值可以重复。
- 无序性(部分实现):像HashMap,其键值对没有特定顺序。而TreeMap会按键的自然顺序或自定义顺序存储键值对。
实际编程中的适用场景
- List的适用场景
- 顺序存储和访问:例如存储学生考试成绩,需要按照考试顺序记录成绩,并且可能需要根据顺序查询某个学生的成绩。
val scores = mutableListOf(85, 90, 78) println(scores[1]) // 输出90,访问第二个学生的成绩
- 频繁的插入和删除操作(如果使用LinkedList):如实现一个简单的消息队列,消息按顺序进入队列,也按顺序处理,可能会频繁进行添加和移除消息的操作。
- Set的适用场景
- 去重需求:比如统计一篇文章中出现的不同单词,单词不能重复。
val words = mutableSetOf("apple", "banana", "apple") println(words) // 输出:[banana, apple],重复的“apple”只保留一个
- 快速查找元素是否存在:例如判断某个用户ID是否已经在系统中注册过,使用HashSet能高效地进行查找。
- Map的适用场景
- 关联数据存储:如存储学生ID和对应的学生姓名,通过学生ID快速查找姓名。
val studentMap = mutableMapOf(1 to "Alice", 2 to "Bob") println(studentMap[1]) // 输出:Alice,通过ID查找姓名
- 统计元素出现次数:比如统计一篇文章中每个单词出现的次数,单词作为键,出现次数作为值。
val wordCountMap = mutableMapOf<String, Int>() val wordsInArticle = listOf("apple", "banana", "apple") for (word in wordsInArticle) { wordCountMap[word] = wordCountMap.getOrDefault(word, 0) + 1 } println(wordCountMap) // 输出:{apple=2, banana=1}