CoreJava面试技巧1.19.pdf
需积分: 0 5 浏览量
更新于2009-05-23
收藏 205KB PDF 举报
### 数据运算
#### 基本数据类型与赋值规则
- **基本数据类型**:在Java中,基本数据类型主要包括`byte`、`int`、`long`、`double`、`char`等。
- `byte`: 占用1字节,范围-128到127。
- `int`: 占用4字节,范围-2^31到2^31-1。
- `long`: 占用8字节,范围-2^63到2^63-1。
- `double`: 双精度浮点数,占用8字节。
- `char`: 字符类型,占用2字节。
- **直接量赋值**:如果直接量(常量)在`int`范围内,赋值给`long`时需要加上`L`或`l`后缀。例如:
```java
long l = 8888888888L;
float f = 12.3456F;
```
- **自动类型转换**:在进行计算时,较小的数据类型可以自动转换成较大的数据类型,但需要注意以下情况:
- ```java
byte b1 = 1;
byte b2 = 2;
byte b3 = (byte) (b1 + b2); // 需要显式类型转换
```
- 运算时使用的是整型,因此需要将结果显式转换回`byte`类型。
#### 补码与进制转换
- **补码表示**:负数的二进制表示采用补码形式,其中最高位代表符号位,1表示负数,0表示正数。
- **进制转换**:可以使用`Integer.toBinaryString()`方法将整数转换为二进制字符串。
- 对于`byte`类型的值进行二进制转换时,需要先将其转换为`int`类型,通常使用按位与运算来保留低8位的有效信息:
```java
byte b = 127;
String binaryString = Integer.toBinaryString(b & 0xFF);
```
#### 数学运算
- **科学运算**:Java提供了`Math`类来进行数学运算,例如:
- `Math.floor(double a)`:返回不大于a的最大整数。
- `Math.ceil(double a)`:返回不小于a的最小整数。
- `Math.round(double a)`:对浮点数进行四舍五入处理。对于负数,-1.5会被舍入为-1而不是-2。
- **大数值运算**:
- **整数运算**:当整数超过`long`类型所能表示的最大范围时,可以使用`BigInteger`类来处理。
```java
BigInteger big = new BigInteger("9");
big = big.pow(99); // 计算9的99次方
```
- **小数运算**:对于小数运算,尤其是需要精确控制舍入方式的情况,可以使用`BigDecimal`类。
```java
BigDecimal b1 = new BigDecimal("1");
BigDecimal b2 = new BigDecimal("3");
BigDecimal b3 = b1.subtract(b2, BigDecimal.ROUND_HALF_UP); // 使用四舍五入方式
```
### 面向对象
#### 设计模式
- **设计模式**:设计模式是解决软件开发过程中常见问题的最佳实践。通过使用设计模式可以使代码更易于维护,提高编程效率。
#### 访问修饰符
- **public**: 公共方法表示该方法是类对外提供的功能。为了减少未来的维护成本,应尽量减少使用`public`方法的数量。
- **protected**: 当考虑未来可能会有子类继承当前类时,需要重写父类的公共方法,但仍需访问父类的方法时,可以使用`protected`访问修饰符。
#### final与static
- **final**: 用于防止方法被重写或者防止类被继承。
- **static**: 用于声明不依赖于任何对象状态的方法或变量。例如,在单例模式或多例模式中使用`static`修饰变量。
#### 接口与抽象类
- **interface**: 接口主要用于定义行为规范,实现接口的类必须实现接口中定义的所有方法。
- **abstract class**: 抽象类可以包含抽象方法和具体方法。抽象类的主要用途之一是作为模板方法模式的基础,即提供一个基本框架,让子类根据需要覆盖某些步骤。
### Collection框架
#### 集合框架概述
- **List**: 动态数组,支持重复元素。
- **Queue**: 头进尾出的队列,支持先进先出的原则。
- **Set**: 存储唯一的元素,不支持重复元素。
- **Map**: 存储键值对映射。
#### ArrayList与LinkedList
- **ArrayList**: 基于动态数组实现,适用于频繁查询的场景。
- **LinkedList**: 基于双向链表实现,适用于频繁插入和删除的场景。
#### ArrayList与Vector
- **ArrayList**: 线程不安全,性能较高,适合单线程环境。
- **Vector**: 线程安全,适合多线程环境。如果需要使`ArrayList`线程安全,可以使用`Collections.synchronizedList`方法。
#### Collections类
- **sort()**: 对列表进行排序。
- **binarySearch()**: 使用二分法查找列表中的元素。
- **synchronizedList/Set/Map()**: 将集合转换为线程安全的集合。
- **shuffle()**: 打乱列表中元素的顺序。
#### List操作技巧
- **交换列表元素**:可以使用`List.set(int index, E element)`方法交换列表中的元素。
```java
list.set(2, list.set(5, list.get(2)));
```
- **删除子列表**:使用`List.subList(int fromIndex, int toIndex)`获取子列表,并调用`clear()`方法清空该子列表。
```java
list.subList(2, 6).clear();
```
- **遍历删除元素**:为了防止并发修改异常,删除列表中的元素时应从后向前遍历。
#### Deque(双端队列)
- **Deque**: 是`Queue`的子接口,支持两端的插入和删除操作。
zhangsunj081109
- 粉丝: 0
- 资源: 3