02_关系运算符(大于 小于 等于 不等于 大于等于 小于等于)

一、关系运算符概述

关系运算符用于比较两个操作数之间的关系,运算结果为布尔值(true或false)。关系运算符是 Java 中实现条件判断的基础,广泛应用于if语句、while循环、for循环等控制流结构中。

1.1 基本概念

  • 关系运算符属于二元运算符(需要两个操作数)
  • 运算结果为boolean类型
  • 常用于比较数值大小、对象引用或是否相等

1.2 运算符列表

运算符 名称 示例 结果说明
> 大于 5>3 true(5大于3)
< 小于 2<4 true(2小于4)
== 等于 5==5 true(5等于5)
!= 不等于 5!=3 true(5不等于3)
>= 大于等于 5>=5 true(5大于等于3)
<= 小于等于 5>3 false(5小于等于3)

二、关系运算符详解

2.1 大于运算符(>)

  • 功能:判断左操作数是否大于右操作数
  • 语法:操作数1 > 操作数2
  • 示例
int a = 10;
int b = 5;
boolean result = a > b; // result为true
  • 适用类型
    • 所有数值类型(byte、short、int、long、float、double)
    • 不适用于boolean类型和引用类型(除String等特殊类)

2.2小于运算符(<)

  • 功能:判断左操作数是否小于右操作数
  • 语法:操作数1 < 操作数2
  • 示例
double x = 3.14;
double y = 3.15;
boolean result = x < y; // result为true
  • 注意事项
    • 浮点数比较时需注意精度问题
		double a = 0.1 + 0.2;
		double b = 0.3;
		System.out.println(a < b); // 可能输出false(因精度问题a≈0.30000000000000004)

2.3 等于运算符(==)

  • 功能:判断两个操作数是否相等
  • 语法:操作数1 == 操作数2
  • 示例
int num1 = 5;
int num2 = 5;
boolean isEqual = num1 == num2; // true

String str1 = "hello";
String str2 = "hello";
boolean strEqual = str1 == str2; // true(字符串池引用相同)
  • 注意事项
    • 对于基本类型,比较的是值是否相等
    • 对于引用类型,比较的是对象引用地址是否相同(即是否为同一个对象)
		String s1 = new String("hello");
		String s2 = new String("hello");
		System.out.println(s1 == s2); // false(不同对象)
		System.out.println(s1.equals(s2)); // true(值相等)

2.4 不等于运算符(!=)

  • 功能:判断两个操作数是否不相等
  • 语法:操作数1 != 操作数2
  • 示例
int a = 10;
int b = 20;
boolean notEqual = a != b; // true

Object obj1 = new Object();
Object obj2 = new Object();
boolean objNotEqual = obj1 != obj2; // true(不同对象)

2.5 大于等于运算符(>=)

  • 功能:判断左操作数是否大于或等于右操作数
  • 语法:操作数1 >= 操作数2
  • 示例
int age = 18;
boolean isAdult = age >= 18; // true(等于18)

double score = 85.5;
boolean isHighScore = score >= 85.0; // true

2.6 小于等于运算符(<=)

  • 功能:判断左操作数是否小于或等于右操作数
  • 语法:操作数1 <= 操作数2
  • 示例
int temp = 25;
boolean isNormal = temp <= 30; // true(小于等于30)

long filesize = 1024 * 1024;
boolean isSmall = filesize <= 1024 * 1024 * 10; // 10MB以内

三、关系运算符的使用场景

3.1 条件判断

int age = 20;
if (age >= 18) {
    System.out.println("成年");
} else {
    System.out.println("未成年");
}

3.2 循环控制

// for循环
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

// while循环
int count = 0;
while (count <= 5) {
    System.out.println(count);
    count++;
}

3.3 数组边界检查

int[] arr = {1, 2, 3, 4, 5};
int index = 3;
if (index >= 0 && index < arr.length) {
    System.out.println(arr[index]);
} else {
    System.out.println("索引越界");
}

3.4 字符串比较(结合 equals)

String input = "admin";
if (!input.equals("guest") && input.length() >= 5) {
    System.out.println("高级用户");
}

四、关系运算符的注意事项

4.1 基本类型与引用类型的比较差异

  • 基本类型:==比较值是否相等
  • 引用类型:==比较引用地址是否相同,值比较需用equals()方法
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2); // true(使用缓存对象)

Integer num3 = 200;
Integer num4 = 200;
System.out.println(num3 == num4); // false(新建对象)
System.out.println(num3.equals(num4)); // true(值相等)

4.2 浮点数比较的精度问题

  • 浮点数由于精度问题,不能直接使用==比较
  • 推荐使用差值判断(设置误差范围)
double a = 0.1 + 0.2;
double b = 0.3;
double epsilon = 1e-10; // 误差范围
boolean almostEqual = Math.abs(a - b) < epsilon;
System.out.println(almostEqual); // true

4.3 避免误写 == 为 =

  • 关系运算符==用于比较,赋值运算符=用于赋值
  • 误写会导致编译错误或逻辑错误
if (a = 5) { // 错误:a=5是赋值表达式,结果为int,不能作为boolean条件
    // 编译错误:类型不匹配
}

if (a == 5) { // 正确:比较a是否等于5
    // 逻辑正确
}

4.4 复合条件判断

  • 使用逻辑运算符(&&、||)组合多个关系表达式
int score = 85;
boolean isGood = score >= 80 && score < 90; // 80-89分之间

五、关系运算符与其他运算符的优先级

5.1 优先级顺序(由高到低)

  1. 增量运算符(++、--)
  2. 算术运算符(+、-、*、/、%)
  3. 关系运算符(>, <, >=, <=, ==, !=)
  4. 逻辑运算符(!、&&、||)
  5. 赋值运算符(=, +=, -=, 等)

5.2 示例与括号使用

int a = 10;
int b = 5;
int c = 3;
// 正确的优先级计算
boolean result = a + b > c * 2; // (10+5) > (3*2) → 15>6 → true

// 用括号明确顺序
boolean result2 = (a + b) > (c * 2); // 同上,更清晰

六、常见问题与解决方案

6.1 引用类型比较的常见错误

问题:误用==比较引用类型的值是否相等

String s1 = new String("abc");
String s2 = new String("abc");
if (s1 == s2) { // 错误:比较引用地址而非值
    System.out.println("相等");
}

解决方案:使用equals()方法比较值

if (s1.equals(s2)) { // 正确:比较字符串值
    System.out.println("相等");
}

6.2 空指针异常问题

问题:对null对象调用equals()方法

String s = null;
if (s.equals("abc")) { // 运行时异常:NullPointerException
    // ...
}

解决方案:先判断是否为null

if (s != null && s.equals("abc")) { // 先检查null,避免异常
    // ...
}

6.3 整数溢出后的比较问题

问题:溢出的整数比较可能得到错误结果

int max = Integer.MAX_VALUE;
System.out.println(max + 1 > max); // 错误:max+1溢出为负数,结果为false
}

解决方案:使用更大的数据类型

long maxLong = Integer.MAX_VALUE;
System.out.println(maxLong + 1 > maxLong); // 正确:true

6.4 字符与数值的比较

问题:字符与数值比较时的类型转换

char c = 'A'; // 'A'的ASCII码为65
if (c == 65) { // 正确:char自动转为int比较
    System.out.println("等于65");
}

说明:char类型可自动转为int,因此可以直接与整数比较。

七、总结

  1. 关系运算符作用:用于比较操作数之间的关系,结果为boolean
  2. 基本类型比较:==比较值,引用类型需用equals()比较值
  3. 注意事项:
    • 避免==与=混淆
    • 浮点数比较需考虑精度
    • 引用类型比较使用equals()
    • 先判断null再调用方法

掌握关系运算符的使用是 Java 编程的基础,合理运用这些运算符可以实现灵活的条件判断和流程控制,避免常见的编程错误。

posted @ 2025-07-07 08:12  HuCiZhi  阅读(126)  评论(0)    收藏  举报