CoreJava面试技巧1.19.pdf

preview
需积分: 0 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`的子接口,支持两端的插入和删除操作。