跳到主要内容

一元与二元运算

Java中,运算符可以分为一元运算符和二元运算符。

  • 一元运算符:只作用于一个操作数,例如自增++、自减--、取反!、取负-等。
  • 二元运算符:作用于两个操作数,例如加法+、减法-、乘法*、除法/等。

复合赋值运算符(如+=-=*=/=)是二元运算符的简化形式,但在使用时具备一元运算的特点。

int result = a + 1; // 二元运算符,加法
a += 1; // 复合赋值运算符,等价于 a = a + 1

类型转换

二元运算符在运算时可能会引起类型转换,尤其是在操作不同数据类型时,可能导致数据丢失。

一元运算符只对单个操作数进行操作,类型转换的问题相对简单。

byte a = 1;
byte b = 2;
// 二元运算,byte 类型会提升为 int 类型,需要强制转换回 byte
a = (byte)(a + b);
System.out.println(a); // 输出 3
// 使用复合赋值运算符,自动进行类型转换
a += b;
System.out.println(a); // 输出 5

在上面的例子中,a + b会提升为int类型,因此需要强制转换。而a += b会自动进行类型转换,不需要强制转换。

不兼容的类型

如果需要进行浮点数的除法运算,应确保操作数都是浮点类型,避免类型不兼容的问题。

类型不兼容示例

Java 中的等于运算

Java中,基本类型比较的是值,引用类型比较的是地址。因此,Java没有===运算符。

int num1 = 1;
int num2 = 2;
float num3 = 1.1f;
double num4 = 1.0;

System.out.println(num1 > num3); // false
System.out.println(num4 == num1); // true
System.out.println(num3 > num4); // true
System.out.println(num3 > num2); // false
System.out.println(num1 >= num4); // true
int num = 2;
float numF = 1.1f;
char letter = 'a'; // 字符 'a' 的 Unicode 编码为 97

System.out.println(num < letter); // true,因为 2 < 97
System.out.println(numF < letter); // true,因为 1.1 < 97

与字符串的比较

字符串比较示例

String str1 = "abc";
String str2 = "abc";
String str3 = "ccc";

System.out.println(str1 == str2); // true,指向同一字符串常量池中的对象
System.out.println(str3 == str2); // false,指向不同的对象

新建对象的地址不同

要判断字符串内容是否相等,应使用equals方法。==比较的是对象的引用地址。

String s1 = new String("abc");
String s2 = new String("abc");

System.out.println(s1 == s2); // false,不同的对象
System.out.println(s1.equals(s2)); // true,内容相同

使用new关键字创建的字符串对象,位于堆内存中,每次创建都会生成新的对象。

字符和数字的比较

char charNum = '1'; // 字符 '1' 的 Unicode 编码为 49
int intNum = 1;

System.out.println(charNum == intNum); // false,比较的是 49 和 1

逻辑运算

与、或、非运算

逻辑运算符用于布尔逻辑判断:

  • 逻辑与:&&
  • 逻辑或:||
  • 逻辑非:!

这些运算符常用于控制流语句中,根据条件执行不同的代码块。