1. 导入语句是否存在于编译的代码中?
不存在!
2. 通配符导入会减慢程序的性能吗?
不会。编译器确定需要哪些类并仅导入这些类。import 语句对类的运行时效率没有影响。是否使用通配符导入是个人偏好。
3. short数据类型和char数据类型有什么区别?
两者都密切相关,它们的大小都是 16 位。主要区别在于,short 是有符号的(可以存储正数和负数),而 char 是无符号的,只能存储包括 0 的正数。
4. 增强型for循环是否适用于迭代器?
不适用,仅适用于数组和集合。它不支持迭代器的原因,因为添加了增强的 for 循环本身,以避免使用迭代器循环集合。阅读 JSR-201 和增强型循环规范草案了解更多信息。
5. 为什么finalize()方法在 Java 中被弃用了?
finalize()方法不保证被 JVM 调用。这取决于 JVM 实现。finalize()方法可能会引入瓶颈并降低性能。
6. CopyOnWrite 类与其他并发类(如 ConcurrentHashMap)有何不同?
每当在集合中添加、删除或更改引用时,这些类都会创建集合的副本,然后更新原始集合引用以指向副本。这些类通常用于确保迭代器看不到对集合的修改。
7. 字符串类中的strip()和trim()方法有什么区别?
这两种方法都用于删除字符串开头和结尾的空格。trim() 只支持 ASCII 字符,而 strip() 方法是在 Java 11 中引入的,它支持 Unicode 和所有内容。
8. 什么是实例初始值设定项?
实例初始值设定项是类中的代码块,可用于初始化其成员。每次创建类的对象时以及在调用构造函数之前都会调用它。
class Animal {
int legs;
{
this.legs = 10;
System.out.println("Instance initializer block");
} // This block is called as an instance initializer.
public Animal() {
System.out.println("Constructor");
}
}
输出
Instance initializer block
Constructor
9. 当我们可以初始化构造函数中的实例变量时,“实例初始值设定项块”的真正用途是什么?
- 在具有多个构造函数的类中,必须在每个构造函数中重复代码。使用实例初始值设定项,只需编写一次代码,无论使用什么构造函数来创建对象,它都将被执行。
- 实例初始值设定项在匿名内部类中也很有用,这些类根本无法声明任何构造函数。
10. fillInStackTrace()方法在可抛掷类中做什么?
fillInStackTrace()方法重置可抛出对象中的堆栈跟踪信息,并使用当前方法信息开始新的堆栈跟踪。
没有 fillinStackTrace() 的示例
void methodOne() throws Throwable {
methodTwo();
}
void methodTwo() throws Throwable {
methodThree();
}
void methodThree() throws Throwable {
throw new Exception("Error occurred");
}
public static void main(String[] args) {
try {
new Test().methodOne();
} catch (Throwable e) {
e.printStackTrace();
}
}
输出
java.lang.Exception: Error occurred
at com.test.Test.methodThree(Test.java:14)
at com.test.Test.methodTwo(Test.java:10)
at com.test.Test.methodOne(Test.java:6)
at com.test.Test.main(Test.java:19)
使用 fillInStackTrace()的示例
void methodOne() throws Throwable {
try {
methodTwo();
} catch (Throwable e) {
throw e.fillInStackTrace();
}
}
void methodTwo() throws Throwable {
methodThree();
}
void methodThree() throws Throwable {
throw new Exception("Error occurred");
}
public static void main(String[] args) {
try {
new Test().methodOne();
} catch (Throwable e) {
e.printStackTrace();
}
}
输出
java.lang.Exception: Error occurred
at com.test.Test.methodOne(Test.java:9)
at com.test.Test.main(Test.java:23)
11. 什么是字符串重复数据消除?
字符串重复数据删除可帮助我们节省 Java 应用程序中重复字符串对象占用的内存。它通过使重复或相同的字符串值共享相同的字符数组来减少 Java 堆内存中字符串对象的内存占用。
12. 您可以使用“super”关键字调用已实现类中接口的静态方法吗?
无法编译
interface A {
public static void print() {
System.out.println("Hello World");
}
}
class MyClass implements A {
public void hello() {
super.print(); // COMPILATION ERROR!!!
}
}
但是,您可以使用“super”关键字调用继承类中类的静态方法。
class A {
public static void print() {
System.out.println("Hello World");
}
}
class MyClass extends A {
public void hello() {
super.print(); // Valid!
}
}
13. 你能从final 类中创建一个匿名类吗?
不能!创建匿名类与继承类相同。因此,当我们不能继承一个“最终”类时,我们也不能创建一个匿名类。
final class Bird {
}
class MyClass {
public static void main(String[] args) {
Bird b = new Bird() {}; // 这句话编译错误
}
14. switch语句是否接受空值?
如果将空值传递给 switch 语句,它会引发 NullPointerException。
15. 枚举可以有公共构造函数吗?
枚举中只允许私有构造函数。
16. 异常和错误有什么区别?
java.lang.Error 表示通常无法处理的错误。它们通常是指灾难性故障,例如系统资源耗尽。一些例子是java.lang.OutOfMemoryError,java.lang.NoClassDefFoundError和java.lang.UnSupportedClassVersionError
另一方面,java.lang.Exception表示可以捕获和处理的错误,例如IOException,ArithmeticException等。
17. 实例运算符何时产生编译错误?
- 他们无法检查基元
- 必须实例化变量。
- 对象必须位于同一继承树中。否则,它将无法编译。
class A {
}
class B {
}
class C extends A {
}
class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a instanceof B); // COMPILATION ERROR
System.out.println(a instanceof C); // Valid
System.out.println(a instanceof A); // Valid
C c = new C();
System.out.println(c instanceof A); // Valid since C extends A
}
}
18. 什么是短路计算?
短路计算使您能够在可以从左侧值预测总体结果时不计算 AND 和 OR 表达式的右侧。
int a = 3, b = 2;
boolean c = false;
c = (a > b && ++b == 3); // c is true, b is 3
c = (a > b && ++b == 3); // c is false, b is 3
c = (a > b || ++b == 3); // c is false, b is 4
c = (a < b || ++b == 3); // c is true, b is 4
c = (a < b | ++b == 3); // c is true, b is 5
19. 您可以在构造函数中同时使用“this()”和“super()”吗?
不能
class Car extends Vehicle {
public Car() {
this(20);
super(10); // COMPILATION ERROR!!!
}
public Car(int x) {
super(x);
}
}
20. 以下程序的输出是什么?
class Test {
static int myMethod() {
try {
throw new RuntimeException();
} catch (Exception e) {
System.out.println("Error");
return 3;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(myMethod());
}
}
它首先打印“错误”,然后打印 2。总是最终块被执行。
21. 为什么 switch 语句不支持长整型、浮点型、布尔型和双精度型?
- 浮点数不准确。switch 语句用于执行完全匹配。因此,对浮点数进行精确匹配并不总是一个好主意。
- 不支持布尔值,因为它可以通过使用 if 语句轻松完成。
- 不允许长。 因为,switch 语句是使用 JVM 中的 tableswitch 或查找开关虚拟机指令代码实现的。它们仅对 32 位操作码(整数)进行操作,而长操作码为 64 位(8 字节)。
22. 什么是WeakHashMap ?
WeakHashMap 是 Java 中三个专用map实现之一。它的键类型为 WeakReference,当程序中不再引用映射条目的键时,它允许对映射条目进行垃圾回收。它有助于实现“类似注册表”的数据结构或简单的内存缓存实现,当任何线程不再可以访问其键时,条目就会消失。
23. 什么是IdentityHashMap ?
Map 接口要求在键比较中使用 equals()方法。但是 IdentityHashMap 使用 == 符号检查对象是否相等,而不是调用 equals()方法,而不是使用 hashCode(),它使用 System.identityHashCode()来计算哈希代码。
24. 什么是ConcurrentHashMap ?
ConcurrentHashMap 是 HashMap 的增强功能,因为我们知道,在我们的应用程序中处理线程时,HashMap 不是一个好的选择,因为性能方面的 HashMap 达不到标准。
25. 什么是LinkedHashMap ?
LinkedHashMap 将其元素保持插入顺序,并通过哈希提供快速访问。此外,支持按 LRU(最近最少使用的第一个)顺序对元素进行排序,如下所示。
LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true);
linkedHashMap.put(0, "a");
linkedHashMap.put(1, "b");
linkedHashMap.put(2, "c");
System.out.println(linkedHashMap); // {0=a, 1=b, 2=c}
System.out.println(linkedHashMap); // {0=a, 1=b, 2=c}
linkedHashMap.get(0);
System.out.println(linkedHashMap); // {1=b, 2=c, 0=a}
26. ConcurrentHashMap 和 Hashtable 有什么区别?
哈希表对整个数据使用单个锁。ConcurrentHashMap 在段级别(默认为 16 个)而不是对象级别(即整个 Map)使用多个锁。
ConcurrentHashMap 锁定仅适用于更新。在检索的情况下,它允许完全并发,检索反映最近完成的更新操作的结果。因此,当写入是使用锁完成时,读取可以非常快地发生。
27. Java 中可用的四种类型的引用是什么?
Java 提供了四种类型的引用。它们是,StrongReference,WeakReference,SoftReference和PhantomReference。
28. isInstance()方法和 instanceof 运算符有什么区别?
instanceof 运算符和 isInstance() 方法都用于检查对象的类。但是当我们想要动态检查对象的类时,主要区别就在于此。在这种情况下,isInstance() 方法将起作用。我们无法通过实例运算符来做到这一点。
29. 我们可以覆盖静态方法吗?
不可以。