### Java高级软件工程师考试知识点概览
#### 一、访问修饰符:`public`, `protected`, `private`, 默认(friendly)
在Java中,类成员(如变量、方法等)的可见性是通过访问修饰符来控制的。这些修饰符包括`public`、`protected`、`private`以及默认修饰符(通常称为“包私有”或“友好”)。
- **`public`**:公开访问,意味着类成员可以在任何地方被访问。
- **`protected`**:受保护的访问,表示类成员可以在同一包内或子类中被访问。
- **`private`**:私有访问,表示类成员只能在定义它的类内部被访问。
- **默认(friendly)**:如果没有明确指定任何访问修饰符,则默认为包访问权限,即仅在同一包内的类可以访问。
#### 二、集合类比较:`ArrayList` vs `Vector`;`HashMap` vs `Hashtable`
1. **`ArrayList` vs `Vector`**
- **相似点**:
- 两者都实现了`List`接口,用于存储元素列表。
- 都是基于动态数组实现的,可以根据需要自动扩展大小。
- 提供了基本的列表操作,如添加、删除、查找等。
- **不同点**:
- `Vector`是线程安全的,而`ArrayList`不是。这意味着在多线程环境中,使用`Vector`更加安全,但性能较低。
- `Vector`的默认增长策略是在当前容量的基础上增加一倍,而`ArrayList`的默认增长策略是在当前容量的基础上增加50%。
2. **`HashMap` vs `Hashtable`**
- **历史背景**:
- `Hashtable`是在Java早期版本中引入的,它是基于`Dictionary`类的实现。
- `HashMap`是在Java 1.2中引入的,作为`Map`接口的一个实现。
- **相似点**:
- 两者都实现了`Map`接口,提供了键值对的存储。
- 支持基本的映射操作,如添加、删除、查找等。
- **不同点**:
- `Hashtable`是线程安全的,而`HashMap`不是。这意味着`Hashtable`更适合多线程环境。
- `HashMap`允许键和值为`null`,而`Hashtable`不允许。
#### 三、字符与Unicode编码
Java中的`char`类型占用16位,这主要是因为Java采用了Unicode编码标准。Unicode是一种国际化的编码标准,旨在支持世界上所有的语言和文字。因此,一个`char`类型能够表示Unicode中的任何字符。这种设计使得Java程序具有良好的国际化特性。
#### 四、对象与内存
1. **对象引用**:在Java中,对象引用是指向对象实例的内存地址。例如,当我们创建一个新的对象时,实际上是在堆内存中分配空间,并返回一个指向该空间的引用。
2. **同步机制**:`synchronized`关键字可以用于确保代码块或方法的线程安全性。当多个线程试图访问同一个资源时,`synchronized`可以防止出现数据不一致的问题。
3. **等待/通知机制**:`wait()`和`notify()`方法用于实现线程之间的通信,它们都是`Object`类的方法。`wait()`方法使当前线程暂停执行并释放锁,而`notify()`方法唤醒正在等待的对象锁的线程之一。
#### 五、构造函数调用顺序
当创建子类的对象时,会首先调用父类的构造函数。这是因为在子类构造函数的首行,有一个隐式的`super()`调用,用于初始化父类。如果父类没有无参构造函数,那么必须显式地调用父类的有参构造函数。
#### 六、非静态内部类
非静态内部类(也称为成员内部类)是定义在另一个类内部的类。它可以访问外部类的所有成员,包括私有的成员。然而,由于它依赖于外部类的实例,因此不能声明为静态。
在给出的示例中,正确答案是选项C和E。选项C定义了一个私有的非静态内部类,并且该类可以访问外部类的成员变量`d1`。选项E定义了一个抽象的非静态内部类,这是一个合法的定义。选项A、B和D都是错误的,因为它们试图在非静态内部类中声明静态成员,这是不允许的。
#### 七、浮点数转换
将整型值赋给浮点型变量时,需要进行显式类型转换。例如,将整型值3.4赋给`float`类型的变量时,应该使用显式类型转换:`float f = (float)3.4;` 这是因为3.4默认被视为`double`类型,而`float`类型的精度较低。
#### 八、Java集合框架
Java的集合框架提供了一系列用于存储和操作对象集合的标准接口和类。主要包括:
- **`Collection`接口**:代表一组对象,包括`List`、`Set`等子接口。
- `List`接口:有序集合,元素可以重复。
- `ArrayList`:基于动态数组实现。
- `LinkedList`:基于双向链表实现。
- `Vector`:与`ArrayList`类似,但线程安全。
- `Set`接口:不允许重复元素的集合。
- **`Map`接口**:用于存储键值对映射,包括`Hashtable`、`HashMap`等实现类。
- `Hashtable`:线程安全的哈希表。
- `HashMap`:非线程安全,性能更高。
- `WeakHashMap`:允许键弱引用,有助于垃圾回收。
Java集合框架的设计非常灵活,支持多种数据结构和访问模式,可以满足不同场景的需求。
#### 九、异常处理
Java中的异常处理机制允许开发者以一种结构化的方式捕获和处理程序运行时可能出现的错误情况。主要机制包括:
- **异常抛出**:当程序检测到错误情况时,可以抛出异常。
- **异常捕获**:使用`try-catch`语句块来捕获和处理异常。
- **自定义异常**:可以通过继承`Exception`类来定义自定义异常。
- **异常传播**:如果没有被捕获,异常会被传递给上层调用者。
- **资源管理**:使用`try-with-resources`语句自动关闭资源,避免资源泄露。
通过有效的异常处理,可以提高程序的健壮性和可维护性,确保程序能够在遇到问题时优雅地恢复或退出。