Java基础知识点汇总 六 点滴Java语言基础问题

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. 我们可以覆盖静态方法吗?

        不可以。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/131504310
今日推荐