Java 进阶知识之旅-day01:异常、泛型、集合及底层原理

在 Java 学习的漫漫长路中,掌握异常处理、泛型、集合遍历以及常用集合类的底层原理,是从初学者迈向进阶开发者的关键一步。这些知识不仅能让我们编写出更健壮、灵活和高效的代码,还能加深对 Java 语言运行机制的理解。​

一、异常:优雅地处理错误​

在程序运行过程中,错误难以避免。Java 通过异常机制为我们提供了一种统一且强大的错误处理方式。​

1. 异常处理​

Java 的异常处理基于try - catch - finally块。try块中放置可能会抛出异常的代码,catch块用于捕获并处理特定类型的异常,finally块则无论是否发生异常都会执行,常用来释放资源。例如:

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("除数不能为零");
} finally {
    System.out.println("这是finally块");
}

2. 自定义异常​

当 Java 内置的异常类型无法满足业务需求时,我们可以创建自定义异常。自定义异常需继承Exception类或其子类。假如我们开发一个银行系统,当账户余额不足时,就可以自定义一个异常:

class InsufficientBalanceException extends Exception {
    public InsufficientBalanceException(String message) {
        super(message);
    }
}

class BankAccount {
    private double balance;

    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    public void withdraw(double amount) throws InsufficientBalanceException {
        if (amount > balance) {
            throw new InsufficientBalanceException("余额不足");
        }
        balance -= amount;
    }
}

二、泛型:编写通用代码​

泛型是 Java 5.0 引入的重要特性,它允许我们在类、接口和方法的定义中使用类型参数,从而实现代码的通用性。​

1. 泛型类和接口​

通过在类或接口名后添加类型参数,可以创建泛型类和接口。例如,一个简单的泛型栈类:

class Stack<T> {
    private T[] elements;
    private int top;

    public Stack(int size) {
        elements = (T[]) new Object[size];
        top = -1;
    }

    public void push(T element) {
        elements[++top] = element;
    }

    public T pop() {
        if (top < 0) {
            throw new RuntimeException("栈为空");
        }
        return elements[top--];
    }
}

2. 通配符与上下限​

通配符?用于表示不确定的类型。上界通配符<? extends T>表示类型必须是 T 或 T 的子类,下界通配符<? super T>表示类型必须是 T 或 T 的父类。例如,当我们需要一个方法来打印集合中的元素,且该集合可以是任何类型的 Number 及其子类时,可以使用上界通配符:

void printNumbers(List<? extends Number> list) {
    for (Number number : list) {
        System.out.println(number);
    }
}

三、集合遍历:高效访问集合元素​

在 Java 中,集合遍历是处理集合数据的常用操作,有多种遍历方式可供选择。​

1. 迭代器​

迭代器是一种设计模式,它为遍历集合提供了统一的接口。通过Iterator接口的next()和hasNext()方法,我们可以按顺序访问集合中的元素,并且可以在遍历过程中安全地删除元素。

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    Integer i = iterator.next();
    if (i == 1) {
        iterator.remove();
    }
}

2. 增强 for 循环​

增强 for 循环(foreach)是 Java 5.0 引入的语法糖,简化了集合和数组的遍历操作。

for (Integer i : list) {
    System.out.println(i);
}

3. Lambda 表达式​

Java 8 引入的 Lambda 表达式,为集合遍历提供了更简洁、更灵活的方式。借助Stream API,我们可以进行并行处理,提高遍历效率。

list.forEach(System.out::println);

四、ArrayList 和 LinkedList:底层原理与应用​

ArrayList和LinkedList是 Java 集合框架中常用的两种列表实现,它们在底层数据结构和性能上有所不同。​

1. ArrayList 底层原理​

ArrayList基于动态数组实现。在添加元素时,如果数组容量不足,会进行扩容操作,创建一个新的更大的数组,并将原数组的元素复制到新数组中。这使得ArrayList在随机访问时效率较高,但在插入和删除元素时,需要移动大量元素,效率较低。​

2. LinkedList 底层原理​

LinkedList基于双向链表实现。每个节点包含元素值、前驱节点和后继节点的引用。这使得LinkedList在插入和删除元素时,只需修改节点的引用,效率较高,但在随机访问时,需要从链表头或尾开始遍历,效率较低。​

3. 实现队列与栈​

LinkedList实现了Queue接口,可以直接作为队列使用。同时,我们也可以使用Stack类或LinkedList来实现栈。通过push()和pop()方法,我们可以实现栈的基本操作。​

通过学习这些 Java 知识,我们能够更好地应对复杂的编程任务,编写出高质量的代码。在实际开发中,合理运用这些知识,将显著提升程序的性能和可维护性。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

禹曦a

你的鼓励就是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值