杰哥教你面试之一百问系列:java集合
文章目录
- 1. 什么是Java集合?请简要介绍一下集合框架。
- 2. Java集合框架主要分为哪几种类型?
- 3. 什么是迭代器(Iterator)?它的作用是什么?
- 4. ArrayList和LinkedList有什么区别?它们何时适用?
- 5. HashMap和HashTable有什么区别?
- 6. 什么是ConcurrentModificationException?它是如何引起的,如何避免?
- 7. 什么是equals()和hashCode()方法?为什么它们在集合中很重要?
- 8. 什么是Comparable和Comparator接口?
- 9. 什么是同步集合(Synchronized Collections)?它们在什么情况下使用?
- 10. 什么是并发集合(Concurrent Collections)?它们的作用是什么?
- 11. 什么是Fail-Fast和Fail-Safe迭代器?
- 12. Java集合框架中的主要接口有哪些?
- 13. 什么是WeakHashMap?
- 14. 什么是HashCode和Equals的约定?
- 15. 什么是IdentityHashMap?
- 16. 什么是EnumSet和EnumMap?
- 17. 什么是Collections类的实用方法?
- 18. 什么是Collections类的不可修改视图(Unmodifiable Views)?
- 19. 什么是Collections类的同步方法?
- 20. 什么是ListIterator?
- 21. 什么是Collections类的reverse()和shuffle()方法?
- 22. 什么是PriorityQueue?
- 23. 什么是BitSet?
- 24. 什么是Arrays类的asList()方法?
- 25. 什么是LinkedHashMap?
- 26. 什么是Stream API?
- 27. 什么是Lambda表达式?它在集合操作中的作用是什么?
- 28. 什么是Collectors类?
- 29. 什么是并行Stream?
- 30. 什么是ConcurrentSkipListMap?
- 31. 什么是EnumSet和EnumMap?
- 32. 什么是WeakReference、SoftReference和PhantomReference?
- 33. 什么是Comparator接口的自然排序和定制排序?
- 34. 什么是IdentityHashMap?
- 35. 什么是Collections类的checkedXXX方法?
- 36. 什么是CopyOnWriteArrayList和CopyOnWriteArraySet?
- 37. 什么是Collections类的disjoint()方法?
- 38. 什么是Collections类的reverseOrder()方法?
- 39. 什么是Collections类的singletonXXX()方法?
- 40. 什么是Collections类的emptyXXX()方法?
- 41. 什么是ConcurrentHashMap?
- 42. 什么是Spliterator?
- 43. 什么是Set接口的特点?
- 44. 什么是NavigableSet接口?
- 45. 什么是BlockingQueue?
- 46. 什么是Deque接口?
- 47. 什么是BlockingDeque接口?
- 48. 什么是EnumMap和EnumSet?
- 49. 什么是IdentityHashMap?
- 50. 什么是Queue接口?
- 51. 什么是Map接口的特点?
- 52. 什么是NavigableMap接口?
- 53. 什么是EnumMap?
- 54. 什么是WeakHashMap?
- 55. 什么是PriorityQueue?
- 56. 什么是Hashtable?
- 57. 什么是WeakReference、SoftReference和PhantomReference?
- 58. 什么是Arrays类的asList()方法?
- 59. 什么是Collections类的unmodifiableXXX()方法?
- 60. 什么是Collections类的singletonXXX()方法?
- 61. 什么是Collections类的checkedXXX()方法?
- 62. 什么是Arrays类的sort()方法?
- 63. 什么是Arrays类的binarySearch()方法?
- 64. 什么是Arrays类的copyOf()方法?
- 65. 什么是Arrays类的equals()方法?
- 66. 什么是Arrays类的hashCode()方法?
- 67. 什么是Arrays类的toString()方法?
- 68. 什么是Arrays类的deepEquals()方法?
- 69. 什么是System.arraycopy()方法?
- 70. 什么是Arrays类的fill()方法?
- 71. 什么是Arrays类的stream()方法?
- 72. 什么是Arrays类的parallelSort()方法?
- 73. 什么是Arrays类的mismatch()方法?
- 74. 什么是Collections类的frequency()方法?
- 75. 什么是Collections类的disjoint()方法?
- 76. 什么是Collections类的reverse()方法?
- 77. 什么是Collections类的shuffle()方法?
- 78. 什么是Collections类的min()和max()方法?
- 79. 什么是Collections类的addAll()方法?
- 80. 什么是Collections类的synchronizedXXX()方法?
- 81. 什么是Arrays类的spliterator()方法?
- 82. 什么是Collections类的newSetFromMap()方法?
- 83. 什么是Collections类的checkedMap()方法?
- 84. 什么是Collections类的emptyXXX()方法?
- 85. 什么是Collections类的singletonMap()方法?
- 86. 什么是Collections类的nCopies()方法?
- 87. 什么是Collections类的reverseOrder()方法?
- 88. 什么是Collections类的rotate()方法?
- 89. 什么是Collections类的replaceAll()方法?
- 90. 什么是Collections类的singleton()方法?
- 91. 什么是Collections类的enumeration()方法?
- 92. 什么是Collections类的indexOfSubList()和lastIndexOfSubList()方法?
- 93. 什么是Collections类的newXXX()方法?
- 94. 什么是Collections类的checkedSortedMap()方法?
- 95. 什么是Collections类的emptyIterator()和emptyListIterator()方法?
- 96. 什么是Collections类的fill()方法?
- 97. 什么是Collections类的unmodifiableCollection()方法?
- 98. 什么是Collections类的disjoint()方法?
- 99. 什么是Collections类的singleton()方法?
- 100. 什么是Collections类的synchronizedCollection()方法?
集合是我们在java中经常会用到的东西,熟悉了集合我们就熟悉了java。当面试官在Java面试中涉及到Java集合的问题时,通常会涉及到集合的概念、类型、常见操作、性能等方面的内容。
1. 什么是Java集合?请简要介绍一下集合框架。
回答:
Java集合是用于存储、管理和操作一组对象的类和接口的集合。集合框架提供了多种不同类型的集合实现,以满足不同的需求,包括列表、集合、映射等。集合框架位于java.util包下,它提供了一组接口和类,用于存储和操作对象,使得数据处理更加方便和高效。
2. Java集合框架主要分为哪几种类型?
回答:
Java集合框架主要分为以下三种类型:
- List(列表): 有序集合,允许重复元素。常见实现类有ArrayList、LinkedList等。
- Set(集合): 无序集合,不允许重复元素。常见实现类有HashSet、TreeSet等。
- Map(映射): 键值对映射,每个键只能对应一个值。常见实现类有HashMap、TreeMap等。
3. 什么是迭代器(Iterator)?它的作用是什么?
回答:
迭代器是集合框架中的一个接口,用于遍历集合中的元素。它提供了一种统一的方式来访问集合中的元素,而不需要关心集合的具体实现。通过迭代器,可以按顺序逐个访问集合中的元素,而不需要暴露集合内部的结构。
代码示例:
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);
}
4. ArrayList和LinkedList有什么区别?它们何时适用?
回答:
- ArrayList: 基于动态数组实现,适用于随机访问和读取操作较多的场景。插入和删除元素需要移动元素位置,因此在频繁的插入和删除操作时效率相对较低。
- LinkedList: 基于双向链表实现,适用于频繁的插入和删除操作,因为在链表中插入和删除元素只需要修改相邻节点的指针,效率较高。但随机访问较慢。
选择哪种集合取决于具体的使用场景和操作频率。
5. HashMap和HashTable有什么区别?
回答:
- HashMap: 允许使用null键和null值,不是线程安全的(非同步),在大多数情况下性能较好。
- HashTable: 不允许使用null键和null值,是线程安全的(同步),性能相对较差。
由于HashTable的同步性能开销较大,一般在单线程环境下使用HashMap,而在多线程环境下可以使用ConcurrentHashMap来替代HashTable。
6. 什么是ConcurrentModificationException?它是如何引起的,如何避免?
回答:
ConcurrentModificationException是在使用迭代器遍历集合时,如果在遍历过程中修改了集合的结构(如增加或删除元素),就会抛出的异常。这是因为迭代器在遍历过程中会使用一个计数器来检测集合是否被修改。
避免这个异常的常见方法是使用迭代器的删除方法来进行元素的删除,而不是直接在集合上使用删除操作。
代码示例:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {Integer number = iterator.next();if (number == 2) {iterator.remove(); // 正确的删除方式,不会抛出ConcurrentModificationException}
}
7. 什么是equals()和hashCode()方法?为什么它们在集合中很重要?
回答:
- equals(): 是Object类中定义的方法,用于比较两个对象是否相等。在集合中,比如HashSet和HashMap,用于判断两个元素是否相等。
- hashCode(): 也是Object类中定义的方法,返回对象的哈希码值。在集合中,比如HashMap,用于确定对象在集合中的存储位置。
在使用集合框架中的HashSet和HashMap等需要根据元素的相等性进行查找和存储的容器中,正确实现equals()和hashCode()方法是非常重要的,以确保元素的一致性和正确性。
8. 什么是Comparable和Comparator接口?
回答:
- Comparable接口: 定义在对象上的自然排序方式,使对象可以与其他对象进行比较。实现了Comparable接口的类可以使用compareTo()方法来实现比较逻辑。
- Comparator接口: 是一个用于比较两个对象的定制排序接口,可以在不修改对象类的情况下实现多种不同的比较逻辑。
实现了
Comparable接口的类可以直接使用Collections.sort()进行排序,而使用Comparator接口可以在需要的地方提供定制的比较逻辑。
代码示例:
class Person implements Comparable<Person> {private String name;private int age;// Constructors, getters, setters@Overridepublic int compareTo(Person otherPerson) {return Integer.compare(this.age, otherPerson.age);}
}List<Person> people = new ArrayList<>();
// Add people to the list
Collections.sort(people); // 使用自然排序// 使用Comparator进行定制排序
Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge);
Collections.sort(people, ageComparator);
9. 什么是同步集合(Synchronized Collections)?它们在什么情况下使用?
回答:
同步集合是指对于多线程环境,提供了线程安全的操作的集合类。在并发访问的情况下,普通的集合类可能会引发线程安全问题,因此Java提供了诸如Collections.synchronizedList、Collections.synchronizedSet等方法来返回同步版本的集合。
代码示例:
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
Set<Integer> synchronizedSet = Collections.synchronizedSet(new HashSet<>());// 在多线程环境中使用同步集合
10. 什么是并发集合(Concurrent Collections)?它们的作用是什么?
回答:
并发集合是指专为多线程并发操作而设计的集合类,能够提供更高的并发性能。java.util.concurrent包提供了许多并发集合,如ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentLinkedQueue等。
这些集合通过使用不同的并发控制策略,允许多个线程同时访问和修改集合,而不需要显式的同步控制。这对于高并发的应用场景非常有用。
代码示例:
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("one", 1);
concurrentMap.put("two", 2);// 在多线程环境中安全地进行操作
11. 什么是Fail-Fast和Fail-Safe迭代器?
回答:
-
Fail-Fast迭代器: 当集合在迭代过程中被修改(增加、删除元素)时,会立即抛出ConcurrentModificationException,以避免在并发环境中出现潜在的问题。这种迭代器主要用于在迭代过程中检测集合的非法修改。
-
Fail-Safe迭代器: 迭代器会复制原始集合的数据,在迭代过程中允许对集合进行修改,但不会影响正在进行的迭代过程。这种迭代器适用于需要在迭代过程中允许修改集合的情况,如并发环境。
Java集合框架中的CopyOnWriteArrayList和CopyOnWriteArraySet就是Fail-Safe集合的例子。
12. Java集合框架中的主要接口有哪些?
回答:
主要的集合接口包括:
- Collection:表示一组对象,包括List和Set。
- List:有序集合,可以包含重复元素,常见的实现有ArrayList、LinkedList等。
- Set:无序集合,不允许重复元素,常见的实现有HashSet、TreeSet等。
- Map:键值对映射,每个键只能对应一个值,常见的实现有HashMap、TreeMap等。
13. 什么是WeakHashMap?
回答:
WeakHashMap是java.util包中提供的一种特殊的Map实现,它的键是弱引用(WeakReference)。这意味着当某个键不再被程序中的其他部分引用时,它可以被垃圾回收器回收,即使这个键在WeakHashMap中。
WeakHashMap常用于需要将对象与相关的附加信息关联起来,但又不想妨碍垃圾回收过程的场景。典型的应用是缓存和资源管理。
代码示例:
WeakHashMap<Key, Value> weakMap = new WeakHashMap<>();
Key key = new Key(); // 仅被weakMap引用
Value value = new Value(); // 与key相关的值
weakMap.put(key, value);// 当key不再被其他部分引用,垃圾回收时,weakMap中的对应条目会被移除
14. 什么是HashCode和Equals的约定?
回答:
hashCode和equals方法在集合框架中有一些约定:
- 如果两个对象通过equals方法相等,它们的hashCode值必须相等。
- 如果两个对象的hashCode值相等,它们不一定通过equals方法相等,但是在HashMap等集合中,相等的哈希码会增加链表的长度,影响性能,因此最好保持一致性。
为了符合这些约定,当你在自定义类中重写equals方法时,也应该重写hashCode方法,以保证对象在集合中的正确行为和性能。
代码示例:
class Student {private int id;private String name;// Constructors, getters, setters@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return id == student.id && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}
}
15. 什么是IdentityHashMap?
回答:
IdentityHashMap是一个特殊的Map实现,它在比较键和值的相等性时使用的是引用的身份(内存地址)而不是通过equals方法。这使得它可以区分不同引用指向的相同内容的情况。
IdentityHashMap适用于需要基于对象引用身份而不是内容来存储键值对的场景。
代码示例:
IdentityHashMap<String, Integer> identityMap = new IdentityHashMap<>();
String key1 = new String("key");
String key2 = new String("key");
identityMap.put(key1, 1);
identityMap.put(key2, 2);System.out.println(identityMap.size()); // 输出 2,因为两个键在引用上不同
16. 什么是EnumSet和EnumMap?
回答:
- EnumSet: 是java.util包中的一个专门为枚举类型设计的集合类。它基于位向量实现,适用于枚举类型的快速集合操作,非常高效。
- EnumMap: 也是java.util包中的一个专门为枚举类型设计的Map实现。它的键必须是同一个枚举类的枚举值,提供了非常高效的枚举键值对存储和查找操作。
这两个类在处理枚举类型数据时非常有用,因为它们针对枚举类型做了特殊的优化。
代码示例:
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
EnumMap<Day, String> activities = new EnumMap<>(Day.class);
activities.put(Day.MONDAY, "Working");
activities.put(Day.FRIDAY, "Partying");
17. 什么是Collections类的实用方法?
回答:
java.util.Collections类提供了一系列静态实用方法,用于操作集合。这些方法包括排序、查找、替换等,它们可以用于各种不同的集合实现。
代码示例:
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);Collections.sort(numbers); // 对列表进行排序int index = Collections.binarySearch(numbers, 5); // 二分查找
18. 什么是Collections类的不可修改视图(Unmodifiable Views)?
回答:
Collections.unmodifiableXXX()方法可以返回一个不可修改的视图,用于对现有集合进行封装,使其不允许进行修改操作。这在需要将集合传递给其他部分,但又不希望这些部分能够修改集合时非常有用。
代码示例:
List<String> originalList = new ArrayList<>();
originalList.add("Apple");
originalList.add("Banana");List<String> unmodifiableList = Collections.unmodifiableList(originalList);// 试图修改unmodifiableList会引发UnsupportedOperationException
19. 什么是Collections类的同步方法?
回答:
java.util.Collections类提供了一些静态方法,用于返回线程安全的集合。这些方法在需要保证多线程环境下集合的安全访问时非常有用。常见的同步方法包括Collections.synchronizedList、Collections.synchronizedSet和Collections.synchronizedMap等。
代码示例:
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
Set<Integer> synchronizedSet = Collections.synchronizedSet(new HashSet<>());
Map<String, Integer> synchronizedMap = Collections.synchronizedMap(new HashMap<>());
20. 什么是ListIterator?
回答:
ListIterator是List接口提供的一个特殊迭代器,除了具有普通迭代器的功能外,它还可以在迭代过程中向列表中插入、删除元素。ListIterator允许双向遍历(向前和向后),并提供了更多的操作。
代码示例:
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");ListIterator<String> iterator = names.listIterator();
while (iterator.hasNext()) {String name = iterator.next();if (name.equals("Bob")) {iterator.add("David"); // 在Bob之后插入David}
}
21. 什么是Collections类的reverse()和shuffle()方法?
回答:
Collections.reverse()方法用于将一个List中的元素进行反转排序。Collections.shuffle()方法用于随机打乱一个List中的元素顺序。这两个方法在处理列表中的元素顺序时非常有用。
代码示例:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);Collections.reverse(numbers); // 反转列表Collections.shuffle(numbers); // 随机打乱列表
22. 什么是PriorityQueue?
回答:
PriorityQueue是一个基于优先级堆(heap)的队列实现,它可以根据元素的优先级进行排序。默认情况下,PriorityQueue是自然顺序排序,但你也可以通过提供自定义的Comparator来指定元素的排序方式。
代码示例:
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.add(5);
priorityQueue.add(2);
priorityQueue.add(8);int highestPriority = priorityQueue.poll(); // 弹出具有最高优先级的元素
23. 什么是BitSet?
回答:
BitSet是一个用于存储位信息的集合类,它的每个元素只有两个可能的值:0和1。BitSet经常被用于处理位运算和标志位操作,例如在位图索引、压缩算法等领域。
代码示例:
BitSet bitSet = new BitSet(8); // 创建一个有8位的BitSetbitSet.set(2); // 设置第2位为1
bitSet.set(5); // 设置第5位为1boolean isSet = bitSet.get(2); // 获取第2位的值(true)
24. 什么是Arrays类的asList()方法?
回答:
Arrays.asList()方法是java.util.Arrays类提供的一个实用方法,用于将数组转换为List。注意,这个方法返回的List是固定大小的,不支持添加和删除操作,但可以使用set()方法修改元素。
代码示例:
String[] array = {"Apple", "Banana", "Orange"};
List<String> list = Arrays.asList(array);list.set(1, "Pear"); // 修改数组中的元素
25. 什么是LinkedHashMap?
回答:
LinkedHashMap是java.util包中的一个实现了Map接口的类,它继承自HashMap,但是额外维护了键值对的插入顺序。这意味着当你遍历LinkedHashMap时,键值对的顺序与插入顺序一致。
LinkedHashMap适用于需要保持元素插入顺序的场景,同时也可以通过访问顺序模式来遍历元素。
代码示例:
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("one", 1);
linkedHashMap.put("two", 2);
linkedHashMap.put("three", 3);// 遍历顺序与插入顺序一致
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());
}
26. 什么是Stream API?
回答:
Stream API是Java 8引入的一个功能强大的功能,它提供了一种处理集合数据的函数式编程方法。Stream允许你对集合中的元素进行一系列的操作,如过滤、映射、排序、归约等,以函数式的风格进行处理。
Stream API能够使代码更加简洁、清晰,并且在一些情况下可以提供更高效的并行处理。
代码示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(Integer::intValue).sum();
27. 什么是Lambda表达式?它在集合操作中的作用是什么?
回答:
Lambda表达式是Java 8引入的一种轻量级函数式编程特性,它允许你以更紧凑的方式传递匿名函数。在集合操作中,Lambda表达式可以用于传递操作的逻辑,如过滤、映射、排序等,使代码更加简洁、易读。
Lambda表达式能够帮助你将操作的焦点从“如何实现”转移到“要实现什么”,从而提高代码的可读性和可维护性。
代码示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");names.stream().filter(name -> name.length() <= 4).forEach(System.out::println);
28. 什么是Collectors类?
回答:
java.util.stream.Collectors是Stream API中的一个工具类,提供了一组静态方法,用于将Stream中的元素收集到集合或其他数据结构中。它在Stream的最终操作中非常有用,可以用于汇总、分组、分区等操作。
Collectors类的方法可以帮助你以更简洁的方式对Stream的结果进行收集。
代码示例:
List<Person> people = // ... 获得一组人员数据Map<String, List<Person>> peopleByCity = people.stream().collect(Collectors.groupingBy(Person::getCity));
29. 什么是并行Stream?
回答:
并行Stream是指在多个线程中同时处理Stream中的元素的方式。Java 8引入的Stream API允许你通过调用parallel()方法将一个普通Stream转换为并行Stream。这在处理大量数据时,可以提高处理效率。
然而,要注意在使用并行Stream时,需要考虑到线程安全问题,以及在某些情况下可能的性能开销。
代码示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.parallelStream().filter(n -> n % 2 == 0).mapToInt(Integer::intValue).sum();
30. 什么是ConcurrentSkipListMap?
回答:
ConcurrentSkipListMap是一个java.util.concurrent包中提供的并发映射实现,它是基于跳表(Skip List)数据结构的。ConcurrentSkipListMap提供了高并发性能,适用于多线程环境下的并发访问。
跳表是一种有序数据结构,类似于平衡树,但具有更好的并发性能。
代码示例:
ConcurrentSkipListMap<String, Integer> skipListMap = new ConcurrentSkipListMap<>();
skipListMap.put("one", 1);
skipListMap.put("two", 2);int value = skipListMap.get("two");
31. 什么是EnumSet和EnumMap?
回答:
- EnumSet: 是java.util包中为枚举类型设计的高效集合类,它基于位向量实现,适用于对枚举类型的元素进行存储和操作。因为枚举的取值是有限的,所以使用位向量可以提供高效的存储和访问。
- EnumMap: 是java.util包中为枚举类型设计的高效映射类,它的键必须是同一个枚举类的枚举值。EnumMap在内部使用数组来存储映射的键值对,因此具有高效的访问性能。
这两个类都是针对枚举类型数据的特定优化,可以提供高效的存储和操作。
代码示例:
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);EnumMap<Day, String> activities = new EnumMap<>(Day.class);
activities.put(Day.MONDAY, "Working");
activities.put(Day.FRIDAY, "Partying");
32. 什么是WeakReference、SoftReference和PhantomReference?
回答:
这些是Java中的引用类型,用于在内存管理中控制对象的垃圾回收:
- WeakReference(弱引用): 弱引用对象在垃圾回收时只有在内存不足时才会被回收。常用于构建缓存,当缓存中的对象不再被强引用时,可以被垃圾回收。
- SoftReference(软引用): 软引用对象在内存不足时会被回收。用于实现缓存,但比弱引用更“持久”,有利于利用剩余内存。
- PhantomReference(虚引用): 虚引用用于在对象被垃圾回收之前获得通知。虚引用对象在任何时候都可能被垃圾回收。
这些引用类型在一些特殊场景下,如内存敏感的缓存和资源释放,非常有用。
33. 什么是Comparator接口的自然排序和定制排序?
回答:
Comparator接口定义了用于对象排序的比较器。它有两种排序方式:
- 自然排序(Natural Ordering): 对于实现了Comparable接口的类,可以通过自然顺序进行排序。例如,整数和字符串已经实现了Comparable接口,所以它们可以使用自然排序进行排序。
- 定制排序(Custom Ordering): 当你需要对没有实现Comparable接口的类进行排序时,可以通过提供自定义的Comparator来指定排序规则。这样你可以在不修改类本身的情况下定义多种排序方式。
代码示例:
class Student {private String name;private int age;// Constructors, getters, setters
}List<Student> students = // ... 获得一组学生数据// 自然排序
Collections.sort(students);// 定制排序
Comparator<Student> ageComparator = Comparator.comparingInt(Student::getAge);
Collections.sort(students, ageComparator);
34. 什么是IdentityHashMap?
回答:
IdentityHashMap是java.util包中提供的一个实现Map接口的类,它使用引用的身份(内存地址)而不是equals方法来判断键的相等性。这意味着只有当两个键的引用是同一个对象时,它们才被认为是相等的。
这在某些情况下很有用,例如需要精确地根据对象的身份进行键值存储。
代码示例:
IdentityHashMap<String, Integer> identityMap = new IdentityHashMap<>();
String key1 = new String("key");
String key2 = new String("key");
identityMap.put(key1, 1);// key2不等于key1,所以不会被视为相等的键
identityMap.get(key2); // 输出null
35. 什么是Collections类的checkedXXX方法?
回答:
java.util.Collections类提供了一系列用于创建类型安全(typed-safe)的集合的方法,它们称为checkedXXX方法。这些方法可以帮助你确保向集合中添加的元素类型是
正确的,从而在运行时避免类型转换错误。
代码示例:
List<String> stringList = new ArrayList<>();
List checkedList = Collections.checkedList(stringList, String.class);// 现在只能添加String类型的元素到checkedList
36. 什么是CopyOnWriteArrayList和CopyOnWriteArraySet?
回答:
CopyOnWriteArrayList和CopyOnWriteArraySet都是并发集合,属于java.util.concurrent包。它们通过使用一种特殊的写时复制(Copy-On-Write)策略来实现高并发的读操作。
- CopyOnWriteArrayList: 是线程安全的List实现,适用于读多写少的场景。在修改操作(添加、删除元素)时,它会复制一份原始数组,并进行修改,从而保证读取操作的线程安全性。
- CopyOnWriteArraySet: 是线程安全的Set实现,它基于CopyOnWriteArrayList实现,拥有类似的特性。
这些集合对于读多写少的情况提供了一种高效的解决方案。
代码示例:
CopyOnWriteArrayList<String> copyOnWriteList = new CopyOnWriteArrayList<>();
CopyOnWriteArraySet<Integer> copyOnWriteSet = new CopyOnWriteArraySet<>();// 在多线程环境中使用copyOnWriteList和copyOnWriteSet
37. 什么是Collections类的disjoint()方法?
回答:
Collections.disjoint()方法是用于检查两个集合是否没有共同元素的。如果两个集合没有交集,即它们之间没有共同的元素,该方法返回true,否则返回false。
代码示例:
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(4, 5, 6);boolean noCommonElements = Collections.disjoint(list1, list2);
System.out.println(noCommonElements); // 输出 true
38. 什么是Collections类的reverseOrder()方法?
回答:
Collections.reverseOrder()方法返回一个逆序的比较器,用于对元素进行逆序排序。通常与Collections.sort()方法一起使用,可以实现对集合中元素的逆序排列。
代码示例:
List<Integer> numbers = Arrays.asList(5, 2, 8, 1);Collections.sort(numbers, Collections.reverseOrder());
39. 什么是Collections类的singletonXXX()方法?
回答:
Collections.singletonXXX()方法用于创建只包含一个元素的不可修改集合。这种集合在内部实现上更加紧凑,适用于只包含单个元素的场景。
代码示例:
Set<String> singletonSet = Collections.singleton("Hello");List<Integer> singletonList = Collections.singletonList(42);
40. 什么是Collections类的emptyXXX()方法?
回答:
Collections.emptyXXX()方法用于创建一个空的不可修改集合,如emptyList()、emptySet()和emptyMap()。这些集合在不需要存储元素时很有用,可以避免创建不必要的实例。
代码示例:
List<String> emptyList = Collections.emptyList();
Set<Integer> emptySet = Collections.emptySet();
Map<String, Integer> emptyMap = Collections.emptyMap();
41. 什么是ConcurrentHashMap?
回答:
ConcurrentHashMap是java.util.concurrent包中提供的并发哈希映射实现,它允许多个线程同时读取和写入映射,而不会引发并发冲突。ConcurrentHashMap的设计使得它在高并发情况下表现优异。
它通过将映射分成一些段(Segments),每个段相当于一个小的哈希表,从而实现了并发的写操作。不同的段可以由不同的线程同时操作,从而减少了锁的争用。
代码示例:
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("one", 1);
concurrentMap.put("two", 2);int value = concurrentMap.get("one");
42. 什么是Spliterator?
回答:
Spliterator是Java 8引入的一个用于遍历和拆分元素序列的接口,它是“分割迭代器”(Split Iterator)的缩写。Spliterator可以用于支持并行迭代操作,将数据源拆分为多个部分,以便多个线程并行处理。
Spliterator被广泛应用于支持新的Stream API和并行流。
代码示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Spliterator<Integer> spliterator = numbers.spliterator();// 并行迭代
spliterator.forEachRemaining(System.out::println);
43. 什么是Set接口的特点?
回答:
Set接口是java.util包中的一个接口,表示不允许包含重复元素的集合。Set的主要特点包括:
- 不允许重复元素:集合中的元素是唯一的,不能有重复。
- 无序性:Set通常不保证元素的特定顺序。实际的顺序可能会随着时间的推移发生变化。
- 没有索引:Set不支持通过索引访问元素,因为它没有定义特定的顺序。
常用的Set实现包括HashSet、LinkedHashSet和TreeSet。
44. 什么是NavigableSet接口?
回答:
NavigableSet接口是java.util包中的一个扩展自SortedSet接口的子接口,它提供了一系列用于导航和搜索元素的方法。NavigableSet的主要特点包括:
- 提供了用于搜索最小和最大元素的方法。
- 提供了用于搜索给定元素的方法,或搜索大于或小于给定元素的元素。
- 可以获取前一个和后一个元素。
TreeSet是NavigableSet接口的一个常见实现。
45. 什么是BlockingQueue?
回答:
BlockingQueue是java.util.concurrent包中的一个接口,它是一个支持线程安全的生产者-消费者模式的队列。BlockingQueue提供了阻塞操作,当队列为空或满时,读取和写入操作会被阻塞,直到满足条件。
BlockingQueue在多线程应用中很有用,用于实现并发的生产者和消费者线程。
代码示例:
BlockingQueue<Integer> blockingQueue = new LinkedBlockingQueue<>();// 生产者线程
blockingQueue.put(1);// 消费者线程
int value = blockingQueue.take();
46. 什么是Deque接口?
回答:
Deque接口(Double Ended Queue的缩写)是java.util包中的一个接口,代表双向队列。Deque允许你在队列的两端插入和删除元素,可以作为队列和栈的混合使用。
Deque提供了一系列用于在队列的头部和尾部进行操作的方法,如addFirst()、addLast()、removeFirst()、removeLast()等。
代码示例:
Deque<String> deque = new LinkedList<>();
deque.addLast("Alice");
deque.addLast("Bob");
deque.addFirst("Charlie");String first = deque.removeFirst(); // 输出 Charlie
47. 什么是BlockingDeque接口?
回答:
BlockingDeque接口是java.util.concurrent包中的一个接口,是Deque的扩展,它结合了Deque的双向队列特性和BlockingQueue的阻塞特性。BlockingDeque允许在队列两端插入和删除元素,并且在队列为空或满时提供阻塞操作。
BlockingDeque适用于需要高并发的双向队列场景,例如生产者-消费者模式。
48. 什么是EnumMap和EnumSet?
回答:
- EnumMap: EnumMap是java.util包中的一个实现了Map接口的类,专门用于枚举类型作为键的情况。它的键必须来自同一个枚举类,这使得它在具有枚举键的情况下效率更高。
- EnumSet: EnumSet是java.util包中的一个实现了Set接口的类,专门用于枚举类型的集合。EnumSet中的元素必须来自同一个枚举类,它使用位向量来实现高效的存储和操作。
这两个类都是针对枚举类型数据的高效实现。
代码示例:
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}EnumMap<Day, String> activities = new EnumMap<>(Day.class);
activities.put(Day.MONDAY, "Working");
activities.put(Day.FRIDAY, "Partying");EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
49. 什么是IdentityHashMap?
回答:
IdentityHashMap是java.util包中的一个实现了Map接口的类,与普通的HashMap不同,它使用引用的身份(内存地址)而不是equals方法来判断键的相等性。这意味着只有当两个键的引用是同一个对象时,它们才被认为是相等的。
IdentityHashMap在需要精确比较对象引用时很有用,它不考虑对象的内容,只关注对象的内存地址。
代码示例:
IdentityHashMap<String, Integer> identityMap = new IdentityHashMap<>();
String key1 = new String("key");
String key2 = new String("key");
identityMap.put(key1, 1);// key2不等于key1,所以不会被视为相等的键
identityMap.get(key2); // 输出 null
50. 什么是Queue接口?
回答:
Queue接口是java.util包中的一个接口,代表队列数据结构。队列通常按照“先进先出”(FIFO,First-In-First-Out)的原则,也就是最早进入队列的元素最先被移出。
Queue接口提供了一系列用于在队列的尾部添加元素、在队列的头部移除元素的方法,以及一些用于检查队列状态的方法。
常用的Queue实现包括LinkedList、ArrayDeque和PriorityQueue。
51. 什么是Map接口的特点?
回答:
Map接口是java.util包中的一个接口,用于表示键值对的映射。Map的主要特点包括:
- 键唯一:每个键只能对应一个值,不允许重复的键。
- 可以通过键来获取值:通过键可以找到对应的值。
- 无序性:Map通常不保证元素的特定顺序。实际的顺序可能会随着时间的推移发生变化。
Map接口的常见实现包括HashMap、LinkedHashMap、TreeMap等。
52. 什么是NavigableMap接口?
回答:
NavigableMap接口是java.util包中的一个扩展自SortedMap接口的子接口,它提供了一系列用于导航和搜索键的方法。NavigableMap的主要特点包括:
- 提供了用于搜索最小和最大键的方法。
- 提供了用于搜索给定键的方法,或搜索大于或小于给定键的键。
- 可以获取前一个和后一个键。
TreeMap是NavigableMap接口的一个常见实现。
53. 什么是EnumMap?
回答:
EnumMap是java.util包中的一个实现了Map接口的类,专门用于枚举类型作为键的情况。EnumMap的键必须来自同一个枚举类,这使得它在具有枚举键的情况下效率更高。
EnumMap内部使用数组来表示
映射,因此具有较高的访问速度。
代码示例:
enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}EnumMap<Day, String> activities = new EnumMap<>(Day.class);
activities.put(Day.MONDAY, "Working");
activities.put(Day.FRIDAY, "Partying");
54. 什么是WeakHashMap?
回答:
WeakHashMap是java.util包中的一个实现了Map接口的类,它是一种特殊的Map,其中的键是“弱键”(Weak Key)。这意味着如果某个键不再被其他部分引用,它会被垃圾回收器回收,即使它还存在于WeakHashMap中。
WeakHashMap常用于在没有其他强引用时临时保存对象的映射。
代码示例:
WeakHashMap<Key, Value> weakHashMap = new WeakHashMap<>();
Key key = new Key();
Value value = new Value();
weakHashMap.put(key, value);// 当key不再被强引用时,它会被垃圾回收,对应的映射也会被移除
55. 什么是PriorityQueue?
回答:
PriorityQueue是java.util包中的一个实现了Queue接口的类,它是一个优先级队列,根据元素的优先级进行排列。默认情况下,PriorityQueue使用元素的自然顺序或提供的比较器来确定元素的优先级。
PriorityQueue的实现基于堆数据结构,它保证了队列中最高优先级的元素总是位于队列的头部。
代码示例:
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.add(5);
priorityQueue.add(3);
priorityQueue.add(7);int highestPriority = priorityQueue.poll(); // 输出 3
56. 什么是Hashtable?
回答:
Hashtable是java.util包中的一个古老的实现了Map接口的类,它提供了一种使用键-值对存储数据的方式。Hashtable在功能上与HashMap类似,但是它是线程安全的,即多个线程可以同时操作一个Hashtable实例而不会引发并发问题。
然而,由于它是基于同步方法实现的,因此在多线程环境下性能相对较差。在Java 5之后,更推荐使用ConcurrentHashMap来获得更好的并发性能。
代码示例:
Hashtable<String, Integer> hashtable = new Hashtable<>();
hashtable.put("one", 1);
hashtable.put("two", 2);int value = hashtable.get("one");
57. 什么是WeakReference、SoftReference和PhantomReference?
回答:
这些是Java中用于内存管理的引用类型:
- WeakReference(弱引用): 弱引用对象只有在垃圾回收时,当没有强引用指向它时,才会被回收。常用于实现缓存,以便在内存不足时释放一些不再需要的对象。
- SoftReference(软引用): 软引用对象在内存不足时可能会被回收,但只有在内存真正紧张的情况下才会被回收。用于构建内存敏感的高速缓存。
- PhantomReference(虚引用): 虚引用对象在任何时候都可能被垃圾回收。虚引用主要用于跟踪对象是否已经从内存中删除,但不能通过虚引用来获取对象本身。
这些引用类型有助于在特定场景下进行精细的内存管理。
58. 什么是Arrays类的asList()方法?
回答:
Arrays.asList()方法是java.util包中的一个静态方法,它可以将传递的一组元素转换为一个固定大小的List。这个List是一个视图,不支持增加或删除元素,但可以使用set方法修改元素的值。
代码示例:
List<String> list = Arrays.asList("one", "two", "three");
list.set(0, "modified"); // 修改第一个元素为 "modified"
59. 什么是Collections类的unmodifiableXXX()方法?
回答:
Collections.unmodifiableXXX()方法用于创建不可修改的集合,其中XXX可以是List、Set或Map。这些方法返回一个不可修改的视图,即原始集合不能被修改,但可以读取。
代码示例:
List<String> originalList = new ArrayList<>();
originalList.add("one");
originalList.add("two");List<String> unmodifiableList = Collections.unmodifiableList(originalList);// 尝试修改unmodifiableList会引发 UnsupportedOperationException
60. 什么是Collections类的singletonXXX()方法?
回答:
Collections.singletonXXX()方法用于创建只包含一个元素的不可修改集合,其中XXX可以是Set、List或Map。这种集合在内部实现上更加紧凑,适用于只包含单个元素的场景。
代码示例:
Set<String> singletonSet = Collections.singleton("Hello");
List<Integer> singletonList = Collections.singletonList(42);
61. 什么是Collections类的checkedXXX()方法?
回答:
Collections.checkedXXX()方法用于创建类型安全的集合,其中XXX可以是List、Set或Map。这些方法可以帮助你确保向集合中添加的元素类型是正确的,从而在运行时避免类型转换错误。
代码示例:
List<String> stringList = new ArrayList<>();
List checkedList = Collections.checkedList(stringList, String.class);// 现在只能添加String类型的元素到checkedList
62. 什么是Arrays类的sort()方法?
回答:
Arrays.sort()方法是java.util包中的一个静态方法,用于对数组元素进行排序。它提供了多个重载方法,可以根据不同的排序规则进行排序。对于基本类型数组,使用Arrays.sort()可以实现快速的排序。
代码示例:
int[] numbers = {5, 2, 8, 1};
Arrays.sort(numbers); // 对数组进行排序
63. 什么是Arrays类的binarySearch()方法?
回答:
Arrays.binarySearch()方法是java.util包中的一个静态方法,用于在已排序的数组中执行二分查找。如果数组包含目标元素,则返回该元素的索引;否则返回一个负数值,表示目标元素应该插入的位置。
代码示例:
int[] numbers = {1, 2, 3, 5, 8};
int index = Arrays.binarySearch(numbers, 5); // 返回 3
64. 什么是Arrays类的copyOf()方法?
回答:
Arrays.copyOf()方法是java.util包中的一个静态方法,用于创建一个新数组,包含指定数组的一部分或全部元素。新数组的长度可以比原数组长或短。
代码示例:
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOf(original, 3); // 新数组为 {1, 2, 3}
65. 什么是Arrays类的equals()方法?
回答:
Arrays.equals()方法是java.util包中的一个静态方法,用于比较两个数组是否相等。数组中的元素会逐个比较,如果数组长度相等且对应位置的元素也相等,则返回true,否则返回false。
代码示例:
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};boolean areEqual = Arrays.equals(array1, array2); // 返回 true
66. 什么是Arrays类的hashCode()方法?
回答:
Arrays.hashCode()方法是java.util包中的一个静态方法,用于计算数组的哈希码。数组的哈希码是基于数组的内容计算的,如果两个数组内容相同,它们的哈希码也会相同。
代码示例:
int[] array = {1, 2, 3};
int hashCode = Arrays.hashCode(array); // 返回数组的哈希码
67. 什么是Arrays类的toString()方法?
回答:
Arrays.toString()方法是java.util包中的一个静态方法,用于将数组转换为字符串表示形式。该方法会按照数组的顺序将元素转换为字符串,并用逗号分隔,然后放在方括号内。
代码示例:
int[] array = {1, 2, 3};
String arrayString = Arrays.toString(array); // 返回 "[1, 2, 3]"
68. 什么是Arrays类的deepEquals()方法?
回答:
Arrays.deepEquals()方法是java.util包中的一个静态方法,用于比较多维数组的内容是否相等。它会递归比较数组的元素,如果多维数组的内容完全相同,则返回true,否则返回false。
代码示例:
int[][] array1 = {{1, 2}, {3, 4}};
int[][] array2 = {{1, 2}, {3, 4}};boolean areEqual = Arrays.deepEquals(array1, array2); // 返回 true
69. 什么是System.arraycopy()方法?
回答:
System.arraycopy()方法是Java中的一个静态方法,用于在数组之间进行元素的复制。它可以将一个数组的一部分或全部元素复制到另一个数组中,并且可以在目标数组的指定位置开始放置复制的元素。
代码示例:
int[] source = {1, 2, 3, 4, 5};
int[] target = new int[5];System.arraycopy(source, 1, target, 2, 3); // 将 source[1] 到 source[3] 复制到 target[2] 到 target[4]
70. 什么是Arrays类的fill()方法?
回答:
Arrays.fill()方法是java.util包中的一个静态方法,用于将指定的值填充到数组的所有元素中。这可以在初始化数组或清除数组内容时很有用。
代码示例:
int[] array = new int[5];
Arrays.fill(array, 42); // 将数组的所有元素填充为 42
71. 什么是Arrays类的stream()方法?
回答:
Arrays.stream()方法是java.util包中的一个静态方法,用于将数组转换为一个流(Stream)对象。通过将数组转换为流,你可以利用流的各种操作来处理数组中的元素。
代码示例:
int[] array = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array); // 将数组转换为 IntStream 流
72. 什么是Arrays类的parallelSort()方法?
回答:
Arrays.parallelSort()方法是java.util包中的一个静态方法,用于对数组元素进行并行排序。与普通的Arrays.sort()方法相比,parallelSort()方法会在多个线程上并行执行排序操作,从而加快排序速度。
代码示例:
int[] array = {5, 2, 8, 1, 3};
Arrays.parallelSort(array); // 并行排序数组
73. 什么是Arrays类的mismatch()方法?
回答:
Arrays.mismatch()方法是java.util包中的一个静态方法,用于查找两个数组中第一个不匹配的元素的索引。如果数组完全相等,则返回-1。
代码示例:
int[] array1 = {1, 2, 3, 4, 5};
int[] array2 = {1, 2, 3, 6, 7};int mismatchIndex = Arrays.mismatch(array1, array2); // 返回 3
74. 什么是Collections类的frequency()方法?
回答:
Collections.frequency()方法是java.util包中的一个静态方法,用于计算集合中指定元素出现的次数。
代码示例:
List<String> list = Arrays.asList("apple", "banana", "apple", "orange");
int frequency = Collections.frequency(list, "apple"); // 返回 2
75. 什么是Collections类的disjoint()方法?
回答:
Collections.disjoint()方法是java.util包中的一个静态方法,用于判断两个集合是否没有共同的元素。如果两个集合没有共同的元素,则返回true,否则返回false。
代码示例:
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(4, 5, 6);boolean areDisjoint = Collections.disjoint(list1, list2); // 返回 true
76. 什么是Collections类的reverse()方法?
回答:
Collections.reverse()方法是java.util包中的一个静态方法,用于反转集合中的元素顺序。
代码示例:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.reverse(list); // 将集合元素的顺序反转
77. 什么是Collections类的shuffle()方法?
回答:
Collections.shuffle()方法是java.util包中的一个静态方法,用于随机打乱集合中的元素顺序。
代码示例:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.shuffle(list); // 随机打乱集合元素的顺序
78. 什么是Collections类的min()和max()方法?
回答:
Collections.min()和Collections.max()方法是java.util包中的两个静态方法,用于找到集合中的最小和最大元素。
代码示例:
List<Integer> list = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6);
int minValue = Collections.min(list); // 返回 1
int maxValue = Collections.max(list); // 返回 9
79. 什么是Collections类的addAll()方法?
回答:
Collections.addAll()方法是java.util包中的一个静态方法,用于将一组元素添加到集合中。这个方法接受一个目标集合和一组元素作为参数,并将这些元素添加到目标集合中。
代码示例:
List<String> list = new ArrayList<>();
Collections.addAll(list, "apple", "banana", "orange");
80. 什么是Collections类的synchronizedXXX()方法?
回答:
Collections.synchronizedXXX()方法是java.util包中的一系列静态方法,用于创建线程安全的集合,其中XXX可以是List、Set或Map。这些方法返回一个包装后的集合,可以在多线程环境下安全使用。
代码示例:
List<String> list = new ArrayList<>();
List<String> synchronizedList = Collections.synchronizedList(list);// synchronizedList 可以在多线程环境下安全操作
81. 什么是Arrays类的spliterator()方法?
回答:
Arrays.spliterator()方法是java.util包中的一个静态方法,用于创建数组的分割迭代器(Spliterator)。分割迭代器可以将数组的元素划分为多个部分,以便进行并行处理。
代码示例:
int[] array = {1, 2, 3, 4, 5};
Spliterator.OfInt spliterator = Arrays.spliterator(array);// 使用 spliterator 进行并行处理
82. 什么是Collections类的newSetFromMap()方法?
回答:
Collections.newSetFromMap()方法是java.util包中的一个静态方法,用于从现有的Map实例创建一个Set实例。这个Set实例的元素将与Map的键关联,因此只能包含唯一的元素。
代码示例:
Map<String, Boolean> map = new HashMap<>();
Set<String> set = Collections.newSetFromMap(map);// set 中的元素将与 map 的键关联
83. 什么是Collections类的checkedMap()方法?
回答:
Collections.checkedMap()方法是java.util包中的一个静态方法,用于创建一个类型安全的Map,其中的键和值都需要符合特定的类型。这可以帮助你在编译时捕获类型错误。
代码示例:
Map<String, Integer> map = new HashMap<>();
Map checkedMap = Collections.checkedMap(map, String.class, Integer.class);// 只能将符合类型的键值对添加到 checkedMap
84. 什么是Collections类的emptyXXX()方法?
回答:
Collections.emptyXXX()方法是java.util包中的一系列静态方法,用于创建空的集合,其中XXX可以是List、Set或Map。
代码示例:
List<String> emptyList = Collections.emptyList();
Set<Integer> emptySet = Collections.emptySet();
Map<String, Integer> emptyMap = Collections.emptyMap();
85. 什么是Collections类的singletonMap()方法?
回答:
Collections.singletonMap()方法是java.util包中的一个静态方法,用于创建只包含一个键值对的不可修改Map实例。
代码示例:
Map<String, Integer> singletonMap = Collections.singletonMap("key", 42);
86. 什么是Collections类的nCopies()方法?
回答:
Collections.nCopies()方法是java.util包中的一个静态方法,用于创建一个包含指定元素重复多次的不可修改的List实例。
代码示例:
List<String> copies = Collections.nCopies(3, "Hello");
// 创建一个包含 3 个 "Hello" 的 List
87. 什么是Collections类的reverseOrder()方法?
回答:
Collections.reverseOrder()方法是java.util包中的一个静态方法,用于获取一个比较器,该比较器按照元素的逆自然顺序进行比较。
代码示例:
List<Integer> list = Arrays.asList(5, 2, 8, 1, 3);
Collections.sort(list, Collections.reverseOrder()); // 按逆序排序
88. 什么是Collections类的rotate()方法?
回答:
Collections.rotate()方法是java.util包中的一个静态方法,用于循环移动集合中的元素。这个方法接受一个集合和一个距离参数,将集合中的元素循环移动指定的距离。
代码示例:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.rotate(list, 2); // 循环移动 2 个位置
89. 什么是Collections类的replaceAll()方法?
回答:
Collections.replaceAll()方法是java.util包中的一个静态方法,用于将集合中的所有旧值替换为新值。
代码示例:
List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "apple", "orange"));
Collections.replaceAll(list, "apple", "fruit");// 将所有 "apple" 替换为 "fruit"
90. 什么是Collections类的singleton()方法?
回答:
Collections.singleton()方法是java.util包中的一个静态方法,用于创建一个只包含一个元素的不可修改Set实例。
代码示例:
Set<String> singletonSet = Collections.singleton("Hello");
91. 什么是Collections类的enumeration()方法?
回答:
Collections.enumeration()方法是java.util包中的一个静态方法,用于将指定集合转换为一个枚举(Enumeration)对象。枚举是一种旧的迭代方式,通常在遗留代码中使用。
代码示例:
List<String> list = Arrays.asList("apple", "banana", "orange");
Enumeration<String> enumeration = Collections.enumeration(list);
92. 什么是Collections类的indexOfSubList()和lastIndexOfSubList()方法?
回答:
Collections.indexOfSubList()和Collections.lastIndexOfSubList()方法是java.util包中的两个静态方法,用于在一个集合中查找另一个集合子列表的第一个和最后一个索引。
代码示例:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 2, 3);
List<Integer> sublist = Arrays.asList(2, 3);int firstIndex = Collections.indexOfSubList(list, sublist); // 返回 1
int lastIndex = Collections.lastIndexOfSubList(list, sublist); // 返回 5
93. 什么是Collections类的newXXX()方法?
回答:
Collections.newXXX()方法是java.util包中的一系列静态方法,用于创建可修改的空集合,其中XXX可以是List、Set或Map。
代码示例:
List<String> newList = Collections.newLinkedList();
Set<Integer> newSet = Collections.newSetFromMap(new HashMap<>());
Map<String, Integer> newMap = Collections.newHashMap();
94. 什么是Collections类的checkedSortedMap()方法?
回答:
Collections.checkedSortedMap()方法是java.util包中的一个静态方法,用于创建一个类型安全的有序Map,其中的键和值都需要符合特定的类型。这可以帮助你在编译时捕获类型错误。
代码示例:
SortedMap<String, Integer> sortedMap = new TreeMap<>();
SortedMap checkedSortedMap = Collections.checkedSortedMap(sortedMap, String.class, Integer.class);// 只能将符合类型的键值对添加到 checkedSortedMap
95. 什么是Collections类的emptyIterator()和emptyListIterator()方法?
回答:
Collections.emptyIterator()和Collections.emptyListIterator()方法是java.util包中的两个静态方法,用于创建空的迭代器(Iterator)和空的列表迭代器(ListIterator)实例。
代码示例:
Iterator<String> emptyIterator = Collections.emptyIterator();
ListIterator<Integer> emptyListIterator = Collections.emptyListIterator();
96. 什么是Collections类的fill()方法?
回答:
Collections.fill()方法是java.util包中的一个静态方法,用于将指定的值填充到列表中的所有元素。
代码示例:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.fill(list, 0); // 将列表的所有元素填充为 0
97. 什么是Collections类的unmodifiableCollection()方法?
回答:
Collections.unmodifiableCollection()方法是java.util包中的一个静态方法,用于创建不可修改的集合视图,其中的元素与原始集合相同,但不能进行增加、删除或修改操作。
代码示例:
List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "orange"));
Collection<String> unmodifiableCollection = Collections.unmodifiableCollection(list);// 尝试修改 unmodifiableCollection 会引发 UnsupportedOperationException
98. 什么是Collections类的disjoint()方法?
回答:
Collections.disjoint()方法是java.util包中的一个静态方法,用于判断两个集合是否没有共同的元素。如果两个集合没有共同的元素,则返回true,否则返回false。
代码示例:
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(4, 5, 6);boolean areDisjoint = Collections.disjoint(list1, list2); // 返回 true
99. 什么是Collections类的singleton()方法?
回答:
Collections.singleton()方法是java.util包中的一个静态方法,用于创建只包含一个元素的不可修改Set实例。
代码示例:
Set<String> singletonSet = Collections.singleton("Hello");
100. 什么是Collections类的synchronizedCollection()方法?
回答:
Collections.synchronizedCollection()方法是java.util包中的一个静态方法,用于创建一个线程安全的集合,其中的元素与原始集合相同,但可以在多线程环境中安全操作。
代码示例:
List<String> list = new ArrayList<>();
Collection<String> synchronizedCollection = Collections.synchronizedCollection(list);// synchronizedCollection 可以在多线程环境下安全操作
相关文章:
杰哥教你面试之一百问系列:java集合
文章目录 1. 什么是Java集合?请简要介绍一下集合框架。2. Java集合框架主要分为哪几种类型?3. 什么是迭代器(Iterator)?它的作用是什么?4. ArrayList和LinkedList有什么区别?它们何时适用&#…...
【数据结构】树和二叉树概念
1.树概念及结构 树概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,…...
C盘清理教程
C盘清理教程 首先使用space Sniffer 扫一下c盘,然后看一下到底是哪个文件这么大 第二步,创建软链接。 首先将我们需要移动的文件的当前路径拷贝下来:C:\Users\Tom\Desktop\test-link\abc\ghi.txt 然后假设剪切到D盘下:D:\ghi.…...
【实战-05】 flinksql look up join
摘要 look up join 能做什么? 不饶关子直接说答案, look up join 就是 广播。 重要是事情说三遍,广播。flinksql中的look up join 就类似于flinks flink Datastream api中的广播的概念,但是又不完全相同,对于初次访问…...
C++数据结构--红黑树
目录 一、红黑树的概念二、红黑树的性质三、红黑树的节点的定义四、红黑树结构五、红黑树的插入操作参考代码 五、代码汇总 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过…...
Linux perf使用思考
目录 一、参考资料(建议阅读)二、值得思考的几个问题1、perf使用不同的性能事件进行统计有什么区别呢?2、那使用不同的性能事件统计出来的数据?排序是如何决定的,其中的百分比数值在不同的性能事件进行统计时各自的意义…...
自定义路由断言工厂
我们来设定一个场景: 假设我们的应用仅仅让age在(min,max)之间的人来访问。 第1步:在配置文件中,添加一个Age的断言配置 spring: application:name: api-gateway cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: trueroute…...
Nacos安装及在项目中的使用
目录 概要一、安装 Nacos1、下载 Nacos2、解压3、启动 Nacos 服务器4、自定义Nacos启动脚本5、访问Nacos Web控制台 二、Nacos----服务注册与发现1、添加 Nacos 依赖2、配置 Nacos 服务器地址3、使用 Nacos 注册服务4、启动服务 三、Nacos----配置管理1、创建配置数据2、从 Nac…...
overleaf中latex语法总结
α和bata $\alpha$ $\beta$上标和下标同时使用 $A_{IJ}^{IJ}$\\ %上标^下标_多个使用{}行内公式 \noindent $abc$\\ %行内公式\documentclass{article} \usepackage[utf8]{inputenc} \usepackage[namelimits]{amsmath} %数学公式 \usepackage{amssymb} %数学公式…...
Grafana配置邮件告警
1、创建一个监控图 2、grafana邮件配置 vim /etc/grafana/grafana.ini [smtp] enabled true host smtp.163.com:465 user qinziteng05163.com password xxxxx # 授权码 from_address qinziteng05163.com from_name Grafanasystemctl restart grafana-serv…...
setup中的nextTick函数
await nextTick() 是 Vue 3 的一个异步函数,用于等待 DOM 更新完成后执行回调函数, 它在 setup 函数中非常有用,可以确保在对 DOM 进行操作之前,先等待 Vue 完成相关的 DOM 更新。 下面是一个示例,演示了 await nextT…...
Matlab信号处理3:fft(快速傅里叶变换)标准使用方式
Fs 1000; % 采样频率 T 1/Fs; % 采样周期:0.001s L 1500; % 信号长度 t (0:L-1)*T; % 时间向量. 时间向量从0开始递增,0s~1.499sS 0.7*sin(2*pi*50*t) sin(2*pi*120*t); % 模拟原信号 X S 2*randn(size(t)); …...
Python|合并两个字典的几种方法
在Python中,有多种方法可以通过使用各种函数和构造函数来合并字典。在本文中,我们将讨论一些合并字典的方法。 1. 使用方法update() 通过使用Python中的update()方法,可以将一个列表合并到另一个列表中。但是在这种情况下,第二个…...
ElementUI浅尝辄止24:Message 消息提示
常用于主动操作后的反馈提示。与 Notification 的区别是后者更多用于系统级通知的被动提醒。 1.如何使用? Message 在配置上与 Notification 非常类似,所以部分 options 在此不做详尽解释,可以结合 Notification 的文档理解它们。Element 注…...
让照片动起来的软件,轻松制作照片动效
随着社交媒体的日益普及,我们对于照片的要求也越来越高。普通的照片已经不能满足我们的需求,我们希望照片更加生动有趣。照片动效便应运而生,它可以让照片动起来,吸引更多的注意力,让照片更加生动有趣。 照片动效制作起…...
【图解RabbitMQ-7】图解RabbitMQ五种队列模型(简单模型、工作模型、发布订阅模型、路由模型、主题模型)及代码实现
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...
Linux命令200例:write用于向特定用户或特定终端发送信息
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师࿰…...
javaee spring整合mybatis spring帮我们创建dao层
项目结构 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
修改Tomcat的默认端口号
1、找到Tomcat的安装路径。 2、打开conf文件夹。 3、用记事本打开server.xml文件 4、找到 <Connector port"8080" protocol"HTTP/1.1",其中的8080就是tomcat的默认端口,将其修改为你需要的端口即可。...
Open3D Ransac拟合空间直线(python详细过程版)
RANSAC拟合直线 一、算法原理1、算法简介2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法简介 见:Open3D——RANSAC 三维点云空间直线拟合 2、参考文献...
题目:2729.判断一个数是否迷人
题目来源: leetcode题目,网址:2729. 判断一个数是否迷人 - 力扣(LeetCode) 解题思路: 对 n,2*n,3*n 中的数字出现次数计数,若数字 0 出现 0 次,数字 1~9…...
微服务模式:服务发现模式
由于微服务应用的动态性,很难调用具有固定 IP 地址的服务。这就是服务发现的概念出现的背景。服务发现有助于客户端了解服务实例的位置。在这种情况下,服务发现组件将充当服务注册表。 服务注册表是一个包含服务实例位置的集中式服务器/数据库。在微服务…...
9.4 数据库 TCP
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库if(!db.contains("Stu.db")){//不存在数据库࿰…...
普通用户使用spark的client无法更新Ranger策略
普通用户使用spark的client无法更新Ranger策略 报错图片: WARN org.apache.ranger.admin.client.RangerAdminRESTClient: Error getting Roles. secureModetrue, usercaojianxiangUCDIPA.VIATRIS.CC (auth:KERBEROS),responsef"httpStatusCode&quo…...
Git超详细教程
文章目录 一、安装并配置Git二、Git的基本操作三、Github/GitLab/Gitee四、分支 一、安装并配置Git 查看所有的全局配置项 git config --list --global查看指定的全局配置项 git config user.name git config user.email配置用户信息 git config --global user.name "…...
C++ 回调函数
一、使用方法 1.定义一个函数指针 typedef int (*pCallback)(int a, int b);2.定义一个带参的回调函数(注释部分是普通回调函数,不用定义第一步里的函数指针) //带参 int oneCallback(int a, int b, pCallback p) //int oneCallback(int a, i…...
xilinx FPGA IOB约束使用以及注意事项
文章目录 一、什么是IOB约束二、为什么要使用IOB约束1、在约束文件中加入下面约束:2、直接在代码中加约束, 三、IOB约束使用注意事项 一、什么是IOB约束 在xilinx FPGA中,IOB是位于IO附近的寄存器,是FPGA上距离IO最近的寄存器&am…...
如何统计iOS产品不同渠道的下载量?
一、前言 在开发过程中,Android可能会打出来很多的包,用于标识不同的商店下载量。原来觉得苹果只有一个商店:AppStore,如何做出不同来源的统计呢?本篇文章就是告诉大家如何做不同渠道来源统计。 二、正文 先看一下苹…...
大模型学习
大模型 大规模语言模型(Large Language Model)简称,具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域,指具有数百万到数十亿参数的神经网络模型。 优点: 更强大、更准确的模型性能,可面对复杂…...
Redis原理:IntSet
(笔记总结自b站黑马程序员课程) 一、结构 IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。 结构如下: typedef struct intset {uint32_t encoding; //编码方式uint32_t l…...
怎样给网站做百度推广/百度网址输入
本节书摘来自异步社区《Python数据分析》一书中的第1章,第1.9节,作者【印尼】Ivan Idris,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.9 从何处寻求帮助和参考资料 在流行的软件开发论坛Stack Overflow上,也有数以百计…...
聊城网站建设公司/石首seo排名
")怎样用Python实现FTP自动上传请看PYTHON FTP模块的用法。怎么样通过Python实现自动添加脚本头信息的示例代码#!/usr/bin/python#title :test4.py#description :I am test script#author :python技术#date :20160902#version :0.1#…...
网页设计师必须知道的网站/汕头seo服务
HQChart使用教程29-走势图如何对接第3方数据6-websocket分钟数据介绍流程图部分代码设置网络协议回调获取分时图实例和更新回调websocket接收到数据注意点demo地址介绍 hqchart内部没有websocket数据源,所有只能通过外部数据源挂接的方式,挂接第3方webs…...
做电影网站犯罪吗/百度官网下载
摘 要:针对《计算机应用基础》传统课堂教学存在的弊端,文章提出《计算机应用基础》课程要转变教学环境,实施机房教学模式,从创设情境、提出问题、主动探究、交流反馈四个步骤开展机房教学改革,目的在于培养学员的自主探…...
建设中小企业网站/网络营销专业如何
but we cant use it unless you put visual studio in 64bit mode.最近装dlib时候遇到这个问题,很简单就能解决掉 Visual Studio用户通常应该以64位模式执行所有操作。默认情况下,Visual Studio是32位,在其输出和自己的执行中都是如此&…...
wordpress评论无法/购物网站
在工作中经常看某一个项目的日志进行分析问题,一般都是日志文件最后多少行有需要的日志当然也需要实时查看日志的最后的多少行,那么这篇就把命令记录一下 临时准备了一个文件来演示 seq 20 > nginx.log1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 查看最后10行记…...