Java数组、集合及相关特性深度解析
立即解锁
发布时间: 2025-08-18 02:13:21 阅读量: 2 订阅数: 19 

### Java 数组、集合及相关特性深度解析
#### 一、数组条件判断的微妙之处
在某些代码中,条件判断语句如 `roomNum < 10 && guests[roomNum] != 0` 可能会带来一些棘手的问题。如果将条件顺序调整为 `guests[roomNum] != 0 && roomNum < 10`,可能会引发诸多麻烦。这是因为在 Java 中,逻辑与(`&&`)运算符具有短路特性。当 `roomNum` 大于等于 10 时,若先判断 `guests[roomNum] != 0`,就会尝试访问数组越界的位置,从而导致程序崩溃。
#### 二、对象数组的运用
以 Java 汽车旅馆为例,其改进后的客人登记软件引入了 `Room` 类。一个 `Room` 实例包含三个属性:房间内的客人数量、房间费率以及是否允许吸烟的标识。以下是 `Room` 类的代码实现:
```java
import static java.lang.System.out;
import java.util.Scanner;
import java.text.NumberFormat;
class Room {
private int guests;
private double rate;
private boolean smoking;
private static NumberFormat currency =
NumberFormat.getCurrencyInstance();
public void readRoom(Scanner diskScanner) {
guests = diskScanner.nextInt();
rate = diskScanner.nextDouble();
smoking = diskScanner.nextBoolean();
}
public void writeRoom() {
out.print(guests);
out.print("\t");
out.print(currency.format(rate));
out.print("\t");
out.println(smoking ? "yes" : "no");
}
}
```
要创建一个 `Room` 对象数组,可参考以下代码:
```java
import static java.lang.System.out;
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
class ShowRooms {
public static void main(String args[])
throws IOException {
Room rooms[];
rooms = new Room[10];
Scanner diskScanner =
new Scanner(new File("RoomList.txt"));
for (int roomNum = 0; roomNum < 10; roomNum++) {
rooms[roomNum] = new Room();
rooms[roomNum].readRoom(diskScanner);
}
out.println("Room\tGuests\tRate\tSmoking?");
for (int roomNum = 0; roomNum < 10; roomNum++) {
out.print(roomNum);
out.print("\t");
rooms[roomNum].writeRoom();
}
}
}
```
创建对象数组需要完成三个步骤:
1. **声明数组变量**:`Room rooms[];` 此声明创建了一个 `rooms` 变量,但它尚未指向任何实际的数组。
2. **分配数组存储空间**:`rooms = new Room[10];` 该语句在计算机内存中预留了十个存储槽,并使 `rooms` 变量指向这些存储槽。不过,每个槽目前还未指向任何对象。
3. **创建数组中的每个对象**:`rooms[roomNum] = new Room();` 此语句位于 `for` 循环中,会为每个房间号执行一次,从而使每个槽指向一个实际的 `Room` 对象。
此外,还需要为每个对象的变量填充值,例如通过 `readRoom` 方法从文件中读取数据。与创建基本类型数组类似,也可以将前两个步骤合并,如 `Room rooms[] = new Room[10];`,还能使用数组初始化器。
#### 三、数字格式化的不同方式
在 Java 中,有多种方法可以使数字显示得更美观。例如,`Listing 7 - 7` 使用 `printf`,`Listing 10 - 1` 使用 `DecimalFormat`,而在 `Listing 11 - 5` 中,使用了 `NumberFormat` 类的 `getCurrencyInstance` 方法来显示货币金额。
以下是两种格式化方式的比较:
| 比较项 | `DecimalFormat` | `NumberFormat` |
| ---- | ---- | ---- |
| 创建方式 | 使用构造函数 | 调用 `getCurrencyInstance` 方法 |
| 所属关
0
0
复制全文
相关推荐









