Java编程中的表达式、语句与块详解
立即解锁
发布时间: 2025-08-18 02:21:31 阅读量: 2 订阅数: 12 

### Java编程中的表达式、语句与块详解
#### 1. 位运算符的杂项应用
在Java编程里,位运算符有着诸多不那么为人熟知却十分实用的用途。
##### 1.1 判断奇偶性
在二进制表示中,若一个数为奇数,其第0位(最低位)必定为1,利用这一特性,可以借助按位与运算符(`&`)轻松判断一个数是奇数还是偶数。示例代码如下:
```java
class Test {
public static void main(String[] args) {
for (int i = 0; i <= 5; i++) {
if ((i & 1) == 0)
System.out.println(i + " is even");
if ((i & 1) != 0)
System.out.println(i + " is odd");
}
}
}
```
运行该程序,输出结果为:
```
0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
```
因此,在判断奇偶性时,应当始终使用按位与运算符。
##### 1.2 判断是否为2的幂次方
可以使用`(n & -n) == n`这一条件来判断一个数`n`是否为2的幂次方。示例代码如下:
```java
class Test {
public static void main(String[] args) {
for (int n = 0; n < 5000; n++)
if ((n & -n) == n)
System.out.println(n);
}
}
```
运行此程序,输出结果为:
```
0
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
```
这种位运算符的运用在重新哈希哈希表的方法中极为常见。例如:
```java
void rehash(int newCapacity) {
assert (newCapacity & -newCapacity) == newCapacity;
…
}
```
若需要判断一个数是否为2的幂次方,这是最为高效的方法。
##### 1.3 文本对齐到4字节边界
核心API中采用了至少三种不同的编程技巧来将文本对齐到4字节边界。
- **方法一:使用取余运算符**
```java
class Test {
public static void main(String[] args) {
String string = "123456";
int align = 4 - (string.length() % 4);
if (align == 4)
align = 0;
int length = string.length();
length = length + align;
System.out.println(length);
}
}
```
运行该程序,输出结果为8。
- **方法二:使用位运算**
```java
class Test {
public static void main(String[] args) {
String string = "123456";
int length = string.length();
int incr = length & 3;
if (incr != 0) {
incr = (4 - incr);
length += incr;
}
System.out.println(length);
}
}
```
运行此程序,同样输出8。
- **方法三:更优雅的解决方案**
使用`string.length() + 3 & ~3`,其值始终是4的倍数。该公式适用于任何2的幂次方。例如:
```java
int minwidth = labelWidth + 4;
minwidth = (minwidth + 15) & ~15;
```
此表达式的计算结果是16的倍数。
##### 1.4 屏蔽符号位
对于任何基本数值数据类型,可以使用以`0x80`开头的十六进制字面量来屏蔽符号位。示例代码如下:
```java
if ((temp[0] & 0x80) != 0)
throw new IllegalArgumentException("negative BigInteger");
```
这是核心API中的一个参数检查,也可以写成:
```java
if (temp[0] < 0)
throw new IllegalArgumentException("negative BigInteger");
```
此代码来自`java.math`包,编写者对位运算编程十分精通。
除符号位之外的所有其他位,可以使用以`0x7f`开头的十六进制字面量进行屏蔽。例如,对于`int`类型,使用`& 0x80000000`屏蔽符号位,使用`& 0x7fffffff`屏蔽其他位。需要注意的是,`0x7fffffff`用于初始化`Integer.MAX_VALUE`,当与按位或运算符(`|`)一起使用时,可以去除整数类型中的符号位,这种用法在计算存储在哈希表中的对象索引的方法中较为常见。例如:
```java
int index = (hashCode & 0x7FFFFFFF) % table.length;
```
##### 1.5 位运算符的可疑使用
在核心API中,存在一些位运算符的使用值得商榷。任何使用`++`运算符递增的变量,若不为零,其最低位必定为1,因此可以通过屏蔽最低位来判断该变量是否被递增过。示例代码如下:
```java
return ((hits & 1) != 0);
```
若`hits`在方法执行期间被递增过,此方法将返回`true`。另一个更复杂的示例如下:
```java
int crossings = 0;
…
while (--roots >= 0) {
if (x < res[roots]) {
crossings++;
}
}
return ((crossings & 1) == 1);
```
在这两种情况下,返回语句中的表达式本可以写成`hits > 0`或`crossings > 0`,这样会更具可读性。
#### 2. Java语句概述
Java程序是逐语句执行的,Java中的语句可分为以下几类:
- 控制流语句(`if`、`switch`、`for`、`while`和`do`)
- 控制转移语句(`return`、`throw`、`break`和`continue`)
- 表达式语句
- 声明语句(局部变量和类)
- `synchronized`语句
- `try`语句
- 空语句
迭代语句(即循环)是控制流语句的一个子集。控制流语句以及与之密切相关的`break`和`continue`语句将在后续小节中详细讨论;声明语句和空语句将在本节剩余部分进行探讨;表达式语句在其他章节有详细讨论;`synchronized`语句在未出版的内容中有涉及;`throw`和`try`语句在异常处理章节有讨论;`return`语句在结果类型和返回语句相关内容中有讨论。
##### 2.1 声明语句
声明语句既是声明,也是可执行语句(与表达式语句类似)。Java编程语言中仅有两种声明语句:局部变量声明语句和局部类声明语句。正如预期的那样,在声明语句执行之前,无法引用由声明语句创建的实体。例如:
```java
class Test {
public static void main(String[] args) {
LocalClass localClass = new LocalClass();
class LocalClass { }
}
}
```
尝试编译此程序会产生以下编译器错误:
```
Test.java:3: cannot resolve symbol
symbol : class LocalClass
location: class Test
LocalClass localClass = new LocalClass();
^
Test.java:3: cannot resolve symbol
symbol : class LocalClass
location: class Test
LocalClass localClass = new LocalClass();
^
2 errors
```
若将`main`方法中的两行代码顺序颠倒,该程序将能正常编译,不会产生任何编译器错误。局部变量声明语句也是如此。
##### 2.2 空语句
空语句仅仅是一个分号,与抽象或本地方法声明中用于表示缺少方法实现的语法相似。空语句可以在任何使用语句的地方使用,包括作为控制流语句中的包含语句。例如:
```java
class Test {
public static void main(String[] args) {
if (2 + 2 != 4);
System.out.println("akin to the dangling else problem");
for (int i = 0; i > Integer.MAX_VALUE; i++);
System.out.println("better hope this doen't work");
}
}
```
运行此程序,输出结果为:
```
akin to the dangling else problem
better hope this doen't work
```
问题在于程序员习惯在语句结尾输入分号,而在控制流语句中,这样的分号会无意中成为空语句。若在`if-then-else`语句中可以使用无标签的`continue`语句,就无需使用“空”语句了。
##### 2.3 语句的包含关系
所有控制流语句、`synchronized`语句和`try`语句都可以包含其他语句。若两个语句之间没有其他也包含该语句的中间语句,则称一个语句直接包含另一个语句。例如:
```java
public boolean equals(Object obj) {
if (this == obj) return true;
if ((obj != null) && (obj instanceof String)) {
String that = (String)obj;
if (this.count == that.count) {
char v1[] = this.value;
char v2[] = that.value;
int i = this.offset;
int j = that.off
```
0
0
复制全文
相关推荐










