101.什么是多态?
多态性被定义为能够采用多种形式的能力。它有两种类型,即编译时多态性或方法重载 - 在编译时调用的函数。例如,以“面积”类为例。根据参数数量,它可以计算正方形、三角形或圆形的面积。运行时多态性或方法覆盖 - 在运行时链接。类中的方法会覆盖父类的方法。
102. 什么是运行时多态性或动态方法分派?
动态方法分派是运行时方法重写的解决机制。方法重写是指子类中的方法与超类中的方法具有相同的名称、参数和返回类型。当通过超类引用调用被重写的方法时,java 会根据调用时所引用的对象类型来确定要执行该方法的哪个版本(超类或子类)。因此,决定是在运行时做出的。这称为动态方法分派。
103. 什么是方法覆盖?
方法覆盖,也称为运行时多态性,是指子类包含与父类相同的方法。例如,我们在父类中有一个名为“gfg()”的方法。在子类中再次定义了方法 gfg()。因此,当在子类中调用 gfg() 时,将执行类中的方法。在这里,类中的 gfg() 覆盖了外部的方法。
方法重写是 Java 中实现运行时多态性的一种方法。方法重写是一种功能,允许子类提供其父类之一已提供的方法的特定实现。当子类中的方法与其父类中的方法具有相同的名称、相同的参数或签名以及相同的返回类型(或子类型)时,则称子类中的方法重写了超类中的方法。
104. 什么是方法重载?
在 Java 中,方法重载允许不同的方法具有相同的名称,但具有不同的签名,其中签名可以根据输入参数的数量或输入参数的类型或两者的混合而不同。
Java 中的方法重载也称为编译时多态性、静态多态性或早期绑定。在方法重载中,与父参数相比,子参数将获得最高优先级。
105. 我们可以覆盖静态方法吗?
不可以,因为静态方法是类的一部分而不是对象的一部分,所以我们不能覆盖它们。
106. 我们可以覆盖重载方法吗?
是的,因为在编译器看来,重载方法是一种完全不同的方法。覆盖完全不是一回事。调用哪种方法的决定将推迟到运行时。
107. 我们可以重载main()方法吗?
是的,在 Java 中,我们可以重载 main 方法,借助其预定义的调用方法来调用 main 方法。
108. 什么是方法重载和方法重写?
方法重载:也称为编译时多态性。在方法重载中,两个或多个方法在同一个类中以不同的签名共享。
例子:
// Java Program to demonstrate use of Method Overloading
import java.io.*;
class GFG {
static int multiply(int a, int b) { return a * b; }
static int multiply(int a, int b, int c)
{
return a * b * c;
}
static int multiply(int a, int b, int c, int d)
{
return a * b * c * d;
}
public static void main(String[] args)
{
System.out.println("multiply() with 2 parameters");
System.out.println(multiply(4, 5));
System.out.println("multiply() with 3 parameters");
System.out.println(multiply(2, 3, 4));
System.out.println("multiply() with 4 parameters");
System.out.println(multiply(2, 3, 4, 1));
}
}
输出
multiply() with 2 parameters 20 multiply() with 3 parameters 24 multiply() with 4 parameters 24
方法重写:当子类可以提供父类或超类中已定义的方法的实现时,就会发生方法重写。返回类型、名称和参数必须与超类中的方法相似。
例子:
// Java Program to demonstrate use of Method Overriding
import java.io.*;
class Vehicle {
void drive()
{
System.out.println("drive() method of base class");
System.out.println("driving the Car.");
}
}
class Car extends Vehicle {
void drive()
{
System.out.println(
"drive() method of derived class");
System.out.println("Car is driving.");
}
}
class GFG {
public static void main(String[] args)
{
Car c1 = new Car();
Vehicle v1 = new Vehicle();
c1.drive();
v1.drive();
Vehicle vehicle = new Car();
// drive() method of Vehicle class is overridden by
// Car class drive()
vehicle.drive();
}
}
输出
drive() method of derived class Car is driving. drive() method of base class driving the Car. drive() method of derived class Car is driving.
方法重载 | 方法重写 |
---|---|
当同一个类中两个或多个方法具有不同的参数但名称相同时。 | 当子类提供其自己对父类中已定义的方法的实现时。 |
方法重载只能发生在同一个类中或者子类或父类之间。 | 方法覆盖只能在子类中发生。 |
当发生错误时,它会在程序编译时被捕获。 | 当发生错误时,它会在程序运行时被捕获。 |
编译时多态性的示例。 | 运行时多态性的示例。 |
方法重载可能需要或不需要继承。 | 方法覆盖总是需要继承。 |
它发生在课堂上。 | 它是在两个有继承关系的类中进行的。 |
109. 我们可以覆盖私有方法吗?
Java 中无法覆盖私有方法。方法覆盖是指实现子类中的方法而不是父类中的方法。私有方法只能在声明它的类中访问。由于此方法对其他类不可见且无法访问,因此无法覆盖。
110. 我们可以在子类中改变重写方法的作用域吗?
在 Java 中,无法修改重写方法的范围。子类方法的范围必须等于或大于超类方法的重写方法的范围。例如,如果超类中的重写方法具有公共范围,则子类中的重写方法可以具有公共范围或更易于访问的范围(如 protected 或 default)。但是,它不能具有更排他性的范围(如 private)。
111. 在子类中重写超类方法时,可以修改其 throws 子句吗?
我们可以修改超类方法的 throws 子句,但有一些限制,我们可以在子类中重写超类方法时更改其 throws 子句。如果超类方法未声明任何异常,则子类重写方法只能指定未检查异常。如果超类方法声明了异常,则子类方法可以声明相同的异常、子类异常或根本不声明异常。但是,子类方法不能声明比超类方法中声明的父类异常更广泛的父类异常。
112. Java 中可以使用虚函数吗?
是的,Java 支持虚拟函数。函数默认是虚拟的,可以使用 final 关键字将其变为非虚拟的。
113. 什么是抽象?
抽象是指表示基本特征而不包括背景细节的行为。详细信息或实现被隐藏。最常见的抽象示例是汽车,我们知道如何启动引擎、加速和行驶,但是,引擎的工作方式及其内部组件是隐藏在一般用户之外的复杂逻辑。通常这样做是为了处理复杂性。
114.什么是抽象类?
声明为抽象的类无法实例化,即无法创建对象。它可能包含或不包含抽象方法,但如果类至少有一个抽象方法,则必须将其声明为抽象。
具有抽象方法的抽象类的示例:
// Java Program to implement
// abstract method
import java.io.*;
// Abstract class
abstract class Fruits {
abstract void run();
}
// Driver Class
class Apple extends Fruits {
void run()
{
System.out.println("Abstract class example");
}
// main method
public static void main(String args[])
{
Fruits obj = new Apple();
obj.run();
}
}
输出
Abstract class example
115. 何时使用抽象方法?
当我们想要使用一种方法但希望子类来决定实现时,就会使用抽象方法,在这种情况下,我们对父类使用抽象方法。
116. 如果基类实现了 Serializable 接口,如何避免在子类中序列化?
如果基类实现了 Serializable 接口,那么我们可以通过定义 writeObject() 方法并抛出 NotSerializableException() 来避免子类中的序列化。
117. Java 中的集合框架是什么?
集合是 Java 中的对象单位。集合框架是 Java 中的一组接口和类,用于以各种方式表示和操作对象集合。集合框架包含类(ArrayList、Vector、LinkedList、PriorityQueue、TreeSet)和多个接口(Set、List、Queue、Deque),其中每个接口用于存储特定类型的数据。
118. 解释 Collection 框架中使用的各种接口。
集合框架实现
- Collection 接口
- List 接口
- Set 接口
- Queue 接口
- Deque 接口
- Map 接口
Collection 接口: Collection 是可用的主要接口,可以使用 java.util.Collection 导入。
句法:
public interface Collection<E> extends iterable
119. 如何在 Java 中同步 ArrayList?
ArrayList 可以使用下面提到的两种方法进行同步:
- 使用 Collections.synchronizedList()
- 使用 CopyOnWriteArrayList
使用 Collections.synchronizedList():
public static List<T> synchronizedList(List<T> list)
使用 CopyOnWriteArrayList:
- 创建一个空列表。
- 它实现了 List 接口
- 它是 ArrayList 的线程安全变体
- T 代表通用
120. 当我们在 Java 中拥有 Vectors (它们是同步的)时,为什么我们需要一个同步的 ArrayList?
由于某些原因,即使我们有 Vector,也需要 ArrayList:
- ArrayList 比 Vectors 更快。
- ArrayList 支持多线程,而 Vectors 仅支持单线程使用。
- ArrayList 使用起来更安全,因为 Vectors 支持单线程,而单个操作的安全性较低且同步时间较长。
- 由于向量的同步特性,它在 Java 中被认为已经过时了。
121.为什么我们不能创建一个通用数组?
无法创建泛型数组,因为数组在运行时会携带其元素的类型信息,因此如果元素的类型不相似,则会在运行时抛出“ArrayStoreException”。由于泛型类型信息在编译时被类型擦除所擦除,因此数组存储检查会通过,而它本应失败。
122. 你能解释一下 Java 中常规数组和 ArrayList 的元素在内存中是如何存储的吗?请解释一下。
Java 中常规数组的元素存储在连续的内存位置中,这意味着每个元素都存储在连续的内存块中。这样就可以通过索引轻松访问任何元素,因为可以使用数组的基地址和每个元素的大小来计算地址
相比之下,ArrayList 类实现了动态数组,这意味着其大小可以随着元素的添加或删除而改变。ArrayList 元素也存储在连续的内存位置,类似于数组。但是,当 ArrayList 达到其容量并需要添加更多元素时,将创建一个新的、更大的底层数组。然后将旧数组中的元素复制到新数组中。此过程确保 ArrayList 可以动态增长,同时将元素保持在连续的内存位置中。
123.解释将ArrayList转换为Array以及将Array转换为ArrayList的方法。
将 List 转换为 ArrayList
有多种方法可以将 List 转换为 ArrayList
程序员可以使用 Arrays 类的 asList() 方法将 Array 转换为 ArrayList。它是 Arrays 类的一个静态方法,接受 List 对象。
句法:
Arrays.asList(item)
// Java program to demonstrate conversion of
// Array to ArrayList of fixed-size.
import java.util.*;
// Driver Class
class GFG {
// Main Function
public static void main(String[] args)
{
String[] temp = { "Abc", "Def", "Ghi", "Jkl" };
// Conversion of array to ArrayList
// using Arrays.asList
List conv = Arrays.asList(temp);
System.out.println(conv);
}
}
[Abc, Def, Ghi, Jkl]
ArrayList 到 Array 的转换
Java 程序员可以将 ArrayList 转换为
句法:
List_object.toArray(new String[List_object.size()])
import java.util.List;
import java.util.ArrayList;
// Driver Class
class GFG {
// Main Function
public static void main(String[] args) {
// List declared
List<Integer> arr = new ArrayList<>();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(2);
arr.add(1);
// Conversion
Object[] objects = arr.toArray();
// Printing array of objects
for (Object obj : objects)
System.out.print(obj + " ");
}
}
1 2 3 2 1
124.ArrayList的大小如何动态增长?并说明其内部是如何实现的。
由于 ArrayLists 基于数组的特性,它的大小会动态增长,以确保始终有足够的空间容纳元素。首次创建 ArrayList 元素时,默认容量约为 10-16 个元素,这主要取决于 Java 版本。当原始数组的容量已满时,ArrayList 元素会从原始数组复制到新数组。随着 ArrayList 大小的动态增加,该类会创建一个更大大小的新数组,并将所有元素从旧数组复制到新数组。现在,新数组的引用在内部使用。动态增加数组的过程称为调整大小。
125. Java 中的 Vector 是什么?
Java 中的向量与之类似,可以在其中存储多个元素。向量遵循以下某些规则:
- 可以使用 Java.util.Vector 导入 Vector。
- 向量是使用动态数组实现的,因为向量的大小根据插入到其中的元素而增加或减少。
- 使用索引号的向量元素。
- 向量本质上是同步的,这意味着它们只使用单个线程(在特定时间只执行一个过程)。
- 向量包含许多不属于集合框架的方法。
句法:
Vector gfg = new Vector(size, increment);
126. 如何使 Java ArrayList 为只读?
仅使用 Collections 提供的 Collections.unmodifiableList() 方法即可准备好 ArrayList。
句法:
array_readonly = Collections.unmodifiableList(ArrayList);
例子:
import java.util.*;
public class Main {
public static void main(String[] argv) throws Exception {
try {
// creating object of ArrayList
ArrayList<Character> temp = new ArrayList<>();
// populate the list
temp.add('X');
temp.add('Y');
temp.add('Z');
// printing the list
System.out.println("Initial list: " + temp);
// getting readonly list
// using unmodifiableList() method
List<Character> new_array = Collections.unmodifiableList(temp);
// printing the list
System.out.println("ReadOnly ArrayList: " + new_array);
// Attempting to add element to new Collection
System.out.println("\nAttempting to add element to the ReadOnly ArrayList");
new_array.add('A');
} catch (UnsupportedOperationException e) {
System.out.println("Exception is thrown : " + e);
}
}
}
输出
Initial list: [X, Y, Z] ReadOnly ArrayList: [X, Y, Z] Attempting to add element to the ReadOnly ArrayList Exception is thrown : java.lang.UnsupportedOperationException
127. Java中的优先级队列是什么?
优先级队列是一种类似于常规队列或堆栈数据结构的抽象数据类型。元素中存储的元素取决于从低到高定义的优先级。PriorityQueue 基于优先级堆。
句法:
import java.util.*;
class PriorityQueueDemo {
// Main Method
public static void main(String args[]) {
// Creating empty priority queue
PriorityQueue<Integer> var1 = new PriorityQueue<Integer>();
// Adding items to the pQueue using add()
var1.add(10);
var1.add(20);
var1.add(15);
// Printing the top element of PriorityQueue
System.out.println(var1.peek());
}
}
10
128.解释 LinkedList 类。
LinkedList 类是使用双向链表存储元素的 Java 类。它继承了 AbstractList 类并实现了 List 和 Deque 接口。LinkedList 类的属性如下:
- LinkedList 类是非同步的。
- 保持插入顺序。
- 它可以用作列表、堆栈或队列。
句法:
LinkedList<class> list_name=new LinkedList<class>();
129.Java中的Stack类是什么,它提供的各种方法有哪些?
Java 中的 Stack 类是一种 LIFO 数据结构,它实现了后进先出数据结构。它派生自 Vector 类,但具有特定于堆栈的功能。Java 中的 Stack 类提供以下方法:
- peek():返回堆栈顶部的项目,但不将其移除
- empty():如果堆栈为空,则返回 true,否则返回 false
- push():将一个元素推到堆栈顶部
- pop():移除并返回堆栈顶部的项目
- search():返回对象从堆栈顶部开始的第 1 个基本位置。如果对象不在堆栈中,则返回 -1
130. Java Collections 框架中的 Set 是什么?列出它的各种实现?
集合是不存储重复元素的集合。它们不保留元素的任何顺序。Java 集合框架提供了 Set 接口的几种实现,包括:
- HashSet: Java 中的 HashSet 将元素存储在哈希表中,从而提供更快的查找和插入速度。HashSet 是无序的。
- LinkedHashSet: LinkedHashSet 是 HashSet 的一种实现,它维护元素的插入顺序。
- TreeSet: TreeSet 按照元素的自然顺序或创建时提供的自定义比较器确定的排序顺序存储元素。
131.Java 中的 HashSet 类是什么,它如何存储元素?
HashSet 类实现 Java 集合框架中的 Set 接口,是 HashSet 类的成员。与重复值不同,它存储不同元素的集合。在此实现中,使用哈希函数将每个元素映射到数组中的索引,并使用该索引快速访问元素。它根据输入元素为数组中的元素生成索引,并根据该索引存储元素。假设哈希函数在存储桶之间适当地分配元素,则 HashSet 类为基本操作(添加、删除、包含和大小)提供恒定时间性能。
132. Java 集合框架中的 LinkedHashSet 是什么?
LinkedHashSet 是 Hashset 的有序版本,由所有元素的双向链接列表维护。当需要迭代顺序时,它非常有用。在 LinkedHashSet 中进行迭代时,元素将按照插入的顺序返回。
句法:
LinkedHashSet<E> hs = new LinkedHashSet<E>();
例子:
import java.io.*;
import java.util.*;
// Driver Class
class GFG {
// Main Function
public static void main(String[] args) {
// LinkedHashSet declared
LinkedHashSet<Integer> hs = new LinkedHashSet<Integer>();
// Add elements in HashSet
hs.add(1);
hs.add(2);
hs.add(5);
hs.add(3);
// Print values
System.out.println("Values:" + hs);
}
}
输出
Values:[1, 2, 5, 3]
133.Java 中的 Map 接口是什么?
Map 接口存在于 Java 集合中,可与 Java.util 包一起使用。Map 接口用于以键值形式映射值。Map 包含所有唯一键。此外,它还提供与之相关的方法,如 containsKey()、contains value() 等。
Map集合中有多种类型的Map,如下所述:
- SortedMap
- TreeMap
- HashMap
- LinkedHashMap
134. 解释 Java 中的树形图
TreeMap 是一种以键值对形式存储数据的映射。它使用红黑树实现。TreeMap 的特点是:
- 它仅包含唯一元素。
- 它不能有一个 NULL 键
- 它可以有多个 NULL 值。
- 它是非同步的。
- 它保持升序。
135.什么是EnumSet?
EnumSet 是 Set 接口的专门实现,用于枚举类型。EnumSet 的一些功能如下:
- 它是非同步的。
- 比HashSet更快。
- EnumSet 中的所有元素必须来自单一枚举类型。
- 它不允许空对象,并且会抛出NullPointerException异常。
- 它使用故障安全迭代器。
句法:
public abstract class EnumSet<E extends Enum<E>>
参数: E指定元素。
136.什么是BlockingQueue?
阻塞队列是支持在检索和移除元素时等待队列变为非空的操作,以及在添加元素时等待队列中的空间可用操作的队列。
句法:
public interface BlockingQueue<E> extends Queue<E>
参数: E 是 Collection 中存储的元素类型
137.Java 中的 ConcurrentHashMap 是什么,你实现了它吗?
ConcurrentHashMap是使用Hashtable实现的。
句法:
public class ConcurrentHashMap<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V>, Serializable
参数:K 是键对象类型,V 是值对象类型
138.可以使用任何类作为 Map 的键吗?
是的,如果它遵循下面提到的某些预定义规则,我们就可以将其用作 Map Key:
- 重写 equals() 方法的类也必须重写 hashCode() 方法
- concurrentHashMap 类是线程安全的。
- ConcurrentHashMap的默认并发级别是16。
- 无法在 ConcurrentHashMap 中插入空对象作为键或值。
139. 什么是迭代器?
Iterator 接口提供了在 Java 中迭代任何 Collection 的方法。Iterator 是 Java Collections Framework 中 Enumeration 的替代品。它可以使用 _iterator()_ 方法从 Collection 中获取迭代器实例。它还允许调用者在迭代过程中从底层集合中删除元素。
140. 什么是枚举?
枚举是一种用户定义的数据类型。它主要用于为整数常量分配名称,这些名称使程序易于阅读和维护。枚举的主要目的是定义用户定义的数据类型。
例子:
// A simple enum example where enum is declared
// outside any class (Note enum keyword instead of
// class keyword)
enum Color
{
RED, GREEN, BLUE;
}
141. Collection 和 Collections 有什么区别?
收藏 | 收藏 |
---|---|
该集合是一个接口。 | 集合是一个类。 |
它提供了数据结构的标准功能。 | 就是对集合元素进行排序和同步。 |
它提供了可用于数据结构的方法。 | 它提供了可用于各种操作的静态方法。 |
142. 区分 Java 中的 Array 和 ArrayList。
大批 | 数组列表 |
---|---|
单维或多维 | 单维 |
用于迭代的 for 和 for each | 这里使用迭代器来遍历 riverArrayList |
length 关键字返回数组的大小。 | size() 方法用于计算 ArrayList 的大小。 |
该数组具有固定大小。 | ArrayList 的大小是动态的,可以根据需要增加或减少。 |
正如上面我们看到的固定大小那样,它的速度更快 | 由于其动态特性,它相对较慢 |
原始数据类型可以直接存储在不太可能的对象中。 | 原始数据类型不会直接添加到不太可能的数组中,而是借助自动装箱和拆箱间接添加 |
它们不能在这里添加,因此类型不安全。 | 它们可以添加到这里从而使ArrayList类型安全。 |
赋值运算符仅用于 | 这里使用了一种称为 add() 方法的特殊方法 |
143.Java中Array和Collection有什么区别?
大批 | 收藏 |
---|---|
Java 中的数组具有固定的大小。 | Java 中的集合具有动态大小。 |
在数组中,元素存储在连续的内存位置。 | 在集合中,元素不一定存储在连续的内存位置。 |
对象和原始数据类型可以存储在数组中。 | 我们只能将对象存储在集合中。 |
需要手动操作来调整数组大小。 | 集合中的大小调整是自动处理的。 |
该数组具有操作的基本方法。 | 集合具有先进的操作和迭代方法。 |
数组从 Java 开始就有。 | 集合是在 Java 1.2 中引入的。 |
144.ArrayList和LinkedList的区别。
数组列表 | 链表 |
---|---|
ArrayList 被实现为可扩展数组。 | LinkedList 是作为双向链表实现的。 |
在ArrayList中,元素存储在连续的内存位置 | LinkedList 元素存储在不连续的内存位置,因为每个元素都有对下一个和前一个元素的引用。 |
ArrayLists 的随机访问速度更快。 | LinkedLists 的插入和删除操作速度更快 |
ArrayLists 的内存效率更高。 | LinkedList 内存效率较低 |
ArrayLists 由于维持数组大小而使用更多内存。 | LinkedList 使用较少的内存,因为它仅引用元素 |
ArrayList 中的搜索操作更快。 | LinkedList 中的搜索操作较慢 |
145.区分Java中的ArrayList和Vector。
数组列表 | 向量 |
---|---|
ArrayList被实现为一个可调整大小的数组。 | Vector被实现为一个同步的、可调整大小的数组。 |
ArrayList 不同步。 | 该向量是同步的。 |
ArrayLists 对于非并发操作来说速度更快。 | 由于增加了同步开销,Vector 对于非并发操作来说速度较慢。 |
ArrayLists 是在 Java 1.2 中引入的。 | Vector 是在 JDK 1.0 中引入的。 |
建议在单线程环境中使用。 | 建议在多线程环境中使用向量。 |
ArrayLists的默认初始容量为10。 | 在 Vectors 中,默认的初始容量为 10,但默认增量是其大小的两倍。 |
ArrayList性能高。 | 矢量性能低下。 |
146.Iterator和ListIterator有什么区别?
迭代器 | 列表迭代器 |
---|---|
只能向前遍历 Collection 中的元素。 | 可以正向和反向遍历 Collection 中的元素。 |
用于遍历Map、List、Set。 | 只能遍历List,不能遍历另外两个。 |
无法使用 Iterator 获取索引 | 它具有 nextIndex() 和 previousIndex() 等方法,可以在遍历 List 时随时获取元素的索引。 |
无法修改或替换 Collection 中的元素 | 可以借助 set(E e) 修改或替换元素 |
无法添加元素,并且还会抛出 ConcurrentModificationException。 | 可以随时轻松地将元素添加到集合中。 |
Iterator 的某些方法是 next()、remove() 和 hasNext()。 | ListIterator 的某些方法是 next()、previous()、hasNext()、hasPrevious() 和 add(E e)。 |
147.区分HashMap和HashTable。
哈希表 | 哈希表 |
---|---|
HashMap 未同步 | HashTable 是同步的 |
一个键可以是 NULL 值 | 不允许 NULL 值 |
迭代器用于遍历HashMap。 | Iterator 和 Enumertar 都可以使用 |
HashMap 更快。 | 与 HashMap 相比,HashTable 速度较慢。 |
148. 迭代器 (Iterator) 和枚举 (Enumeration) 有什么区别?
迭代器 | 枚举 |
---|---|
迭代器可以遍历遗留元素以及非遗留元素。 | 枚举只能遍历遗留元素。 |
迭代器是快速失败的。 | 枚举不是快速失败的。 |
迭代器比较慢。 | 枚举速度更快。 |
Iterator 在遍历集合时可以执行删除操作。 | 枚举只能对集合执行遍历操作。 |
149. Comparable 和 Comparator 有什么区别?
可比 | 比较器 |
---|---|
该接口存在于 java.lang 包中。 | 该接口存在于 java.util 包中。 |
提供compareTo()方法对元素进行排序。 | 提供compare()方法对元素进行排序。 |
它提供单一排序序列。 | 它提供了多种排序序列。 |
排序的逻辑必须与要排序的对象属于同一类。 | 排序的逻辑应该放在单独的类中,根据对象的不同属性编写不同的排序。 |
方法按照固定的排序顺序对数据进行排序。 | 方法根据自定义的排序顺序对数据进行排序。 |
它会影响原来的课程。 | 它不会影响原来的课程。 |
在 API 中经常由日历、包装类、日期和字符串实现。 | 它用于对第三方类的实例进行排序。 |
150.Set和Map有什么区别?
放 | 地图 |
---|---|
Set 接口是使用 java.util 包实现的。 | 该地图是使用java.util包实现的。 |
可以扩展采集接口。 | 它没有扩展收集接口。 |
它不允许重复的值。 | 它允许重复的值。 |
该集合只能对一个空值进行排序。 | 该地图可以对多个空值进行排序。 |