结丹期

8. 什么是异常处理?Java 中如何使用 try-catchthrows 进行异常处理?

异常处理Java 中用于处理运行时错误的机制,确保程序在遇到异常时不会崩溃。

通过 try-catch 块捕获异常,使用 throws 关键字将异常抛给调用者。

try-catch:用于捕获并处理异常。

throws:用于将异常抛出给调用该方法的外部方法。

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0); // 触发异常
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) { // 捕获异常
            System.out.println("Error: " + e.getMessage());
        }
    }

    // 使用 throws 抛出异常
    public static int divide(int a, int b) throws ArithmeticException {
        if (b == 0) {
            throw new ArithmeticException("Cannot divide by zero");
        }
        return a / b;
    }
}

divide 方法中,throws 关键字抛出了 ArithmeticExceptiontry-catch 块捕获并处理了异常。


9. Java 中有哪些常见的异常类型?如何自定义异常?

Java 中的异常分为已检查异常Checked Exception)和未检查异常Unchecked Exception)。

常见的异常类型有:

  • 已检查异常

    • IOException

    • SQLException

    • ClassNotFoundException

  • 未检查异常

    • NullPointerException

    • ArrayIndexOutOfBoundsException

    • ArithmeticException

自定义异常:可以通过继承 Exception 类来创建自己的异常类型。

// 自定义异常
class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            checkAge(15);
        } catch (InvalidAgeException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

    // 抛出自定义异常
    public static void checkAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("Age must be 18 or older");
        }
        System.out.println("Age is valid");
    }
}

InvalidAgeException 是自定义异常,checkAge 方法在年龄不合法时抛出该异常。


10. 什么是泛型(Generics)?如何在 Java 中使用泛型?

泛型Java 中的一个机制,允许在定义类、接口和方法时使用类型参数,从而提高代码的重用性和安全性。

泛型使得类型在编译时检查,减少了类型转换的错误。

// 示例:泛型类
class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

public class GenericsExample {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>(); // 泛型指定为 String
        stringBox.setItem("Hello");
        System.out.println("String Box: " + stringBox.getItem());

        Box<Integer> intBox = new Box<>(); // 泛型指定为 Integer
        intBox.setItem(100);
        System.out.println("Integer Box: " + intBox.getItem());
    }
}

Box<T> 是一个泛型类,可以通过不同的类型参数在同一个类中处理不同的数据类型。


11. 什么是 Java 的 ArrayListLinkedList?它们的区别是什么?

ArrayListLinkedList 都是 Java 集合框架中的常见列表实现,但它们的底层结构不同,适合不同的应用场景:

ArrayList

  • 基于动态数组实现,支持快速随机访问。

  • 适合频繁读取数据的场景,但插入和删除元素较慢,尤其是在列表的中间位置。

LinkedList

  • 基于双向链表实现,适合频繁插入和删除元素的场景。

  • 不支持快速随机访问,因为查找元素时需要从头遍历。

import java.util.ArrayList;
import java.util.LinkedList;

public class ListExample {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("Apple");
        arrayList.add("Banana");
        System.out.println("ArrayList: " + arrayList);

        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("Cat");
        linkedList.add("Dog");
        System.out.println("LinkedList: " + linkedList);
    }
}

12. 什么是 HashMapTreeMap?它们的使用场景和区别是什么?

HashMapTreeMap 都是用于存储键值对的 Map 实现,但它们的内部结构和行为不同。

HashMap

  • 基于哈希表实现,提供常数时间的插入和查找。

  • 不保证元素的顺序,适用于快速查找和更新的场景。

TreeMap

  • 基于红黑树实现,元素按键的自然顺序或指定的比较器排序。

  • 适用于需要按键排序或范围查询的场景。

import java.util.HashMap;
import java.util.TreeMap;

public class MapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> hashMap = new HashMap<>();
        hashMap.put("Apple", 1);
        hashMap.put("Banana", 2);
        System.out.println("HashMap: " + hashMap);

        TreeMap<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Apple", 1);
        treeMap.put("Banana", 2);
        System.out.println("TreeMap: " + treeMap);
    }
}

13. Java 中的 StringStringBuilderStringBuffer 有什么区别?

String:不可变的字符序列,任何对 String 的修改都会生成新的对象。

StringBuilder:可变字符序列,适用于在单线程环境下执行字符串操作,效率高。

StringBuffer:与 StringBuilder 类似,但是线程安全的,适用于多线程环境。

public class StringExample {
    public static void main(String[] args) {
        // String(不可变)
        String str = "Hello";
        str = str + " World"; // 生成新的对象
        System.out.println("String: " + str);

        // StringBuilder(可变)
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World");
        System.out.println("StringBuilder: " + sb);

        // StringBuffer(线程安全)
        StringBuffer sbf = new StringBuffer("Hello");
        sbf.append(" World");
        System.out.println("StringBuffer: " + sbf);
    }
}

14. 什么是线程(Thread)?如何在 Java 中创建和管理线程?

线程(Thread) 是程序执行的最小单位,Java 支持多线程编程,使得多个任务可以并发执行。

创建线程有两种主要方式:

  • 继承 Thread 类。

  • 实现 Runnable 接口。

// 示例 1:继承 Thread 类
class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}
// 示例 2:实现 Runnable 接口
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable is running");
    }
}

public class RunnableExample {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start(); // 启动线程
    }
}

MyThread 类继承了 Thread,并重写了 run 方法;MyRunnable 实现了 Runnable 接口,同样定义了 run 方法。

results matching ""

    No results matching ""