目录
String、StringBuilder 与 StringBuffer:
一:
内存泄漏与内存溢出:
- 内存泄漏是指程序中已不再使用的对象仍占用着内存,导致可用内存逐渐减少。
- 内存溢出是指程序申请的内存超过了系统能提供的最大内存量。
迭代器与增强 for 循环:
- 迭代器可以遍历集合,提供了对元素进行操作的方法。
- 增强 for 循环是一种简洁的遍历方式,但不能在遍历过程中修改集合结构。
注解与反射的结合:
- 通过注解可以为代码添加元数据,然后利用反射来获取和处理这些注解信息。
事件监听机制:
- 定义事件源、事件对象和事件监听器,当特定事件发生时触发相应的处理。
阻塞队列与非阻塞队列:
- 阻塞队列在队列为空或满时,相关操作会阻塞等待。
- 非阻塞队列则会立即返回相应的结果。
二:
分布式计算与单机计算:
- 单机计算局限于单个计算机的资源和处理能力。
- 分布式计算通过网络将多个节点组合起来,共同完成计算任务,提高处理能力和扩展性。
RPC(远程过程调用)与本地方法调用:
- RPC 用于在不同的进程或机器之间进行方法调用。
- 本地方法调用则是在同一进程内的方法调用。
类加载机制中的链接与初始化:
- 链接包括验证、准备和解析等步骤,主要是对类进行检查和准备工作。
- 初始化则是执行类中的静态初始化代码。
对象序列化与反序列化:
- 序列化是将对象转换为字节流以便存储或传输。
- 反序列化则是从字节流中恢复出对象。
内部类与外部类:
- 内部类是定义在另一个类内部的类,可以分为成员内部类、局部内部类等不同类型。
- 外部类可以访问内部类的成员,内部类也可以访问外部类的成员(根据具体情况)。
三:
IO 流中的字节流与字符流:
- 字节流用于处理字节数据。
- 字符流用于处理字符数据,它基于字节流进行了一定的编码处理。
进程与线程:
- 进程是程序的一次执行过程,有独立的内存空间。
- 线程是进程中的执行单元,多个线程共享进程的资源。
反射机制中的获取类信息与动态调用方法:
- 通过反射可以获取类的各种信息,如属性、方法等。
- 还可以动态地调用类中的方法。
构造方法与普通方法:
- 构造方法用于创建对象时初始化对象的状态,没有返回类型。
- 比如
public MyClass() {...}
。- 普通方法用于执行特定的功能,可以有返回值。
泛型与通配符:
- 泛型可以在定义类、接口、方法时指定类型参数,增加代码的类型安全性。
- 如
List<String>
。- 通配符
?
可以用于表示不确定的具体类型,比如List<?>
。
四:
同步与异步:
- 在多线程环境中,同步意味着执行过程按顺序进行,一个任务完成后才进行下一个。
- 异步则是任务可以同时进行,结果可能在之后处理。
深拷贝与浅拷贝:
- 浅拷贝只是简单地复制对象的引用,原始对象和拷贝对象指向相同的内存区域。
- 深拷贝会创建全新的对象,包括对象内部的所有引用对象也会被复制。
堆内存与栈内存:
- 基本类型的值和对象的引用通常在栈内存中。
- 对象本身在堆内存中分配空间。
多态的静态多态与动态多态:
- 静态多态主要通过方法重载来实现。
- 动态多态是通过继承和方法重写,在运行时根据对象实际类型来确定调用的方法。
静态变量、实例变量与局部变量:
- 静态变量属于类,被所有实例共享。
- 实例变量属于对象。
- 局部变量在方法内定义。
五:
异常处理中的 try-catch 和 throws:
try-catch
用于捕获并处理异常。throws
用于声明方法可能抛出的异常,将异常处理的责任上移。
String、StringBuilder 与 StringBuffer:
String
是不可变的,每次操作会产生新的对象。StringBuilder
和StringBuffer
是可变的,适合频繁修改字符串的操作,它们的区别在于StringBuffer
是线程安全的,而StringBuilder
不是。
数组与集合:
- 数组大小固定,创建后不能改变长度。
- 如
int[] arr = {1, 2, 3}
。- 集合可以动态添加、删除元素,有多种实现类如
ArrayList
、HashSet
等。
**== 与 equals()**:
==
对于基本类型比较值是否相等,对于引用类型比较引用地址是否相等。equals()
方法在Object
类中默认也是比较引用地址,但很多类(如String
)重写了该方法来比较实际内容。
final、finally 和 finalize:
final
修饰变量表示其值不能再改变,修饰类不能被继承,修饰方法不能被重写。finally
一般用于异常处理,保证无论是否发生异常,其中的代码都会执行。finalize
是 Object 类的一个方法,在垃圾回收前可能会被调用。
六:
抽象类与接口:
- 抽象类可以包含抽象方法和非抽象方法,也可以有属性。
- 像一个
Shape
抽象类,具体形状类去继承它。- 接口主要定义行为规范,通常只有方法声明,没有方法体。
- 如
Serializable
接口。
重写(覆盖)与重载:
- 重写是子类重新定义父类中已有的方法,方法签名(名称、参数列表)必须相同,返回类型要兼容。
- 如父类有
void show()
,子类也可以有同名的void show()
。- 重载是在同一个类中,方法名相同,但参数列表不同(参数个数、类型或顺序不同)。
- 比如可以有
void doSomething(int a)
和void doSomething(String b)
。
继承与实现:
继承是子类继承父类的属性和方法。
- 例如,一个
Animal
类,Dog
类可以继承它。- 实现是类实现接口中定义的方法。
- 比如一个
Flyable
接口,Bird
类可以实现它来具备飞行的能力。