前言
最近在写代码时,总是犯一个低级的错误,在对象比较时直接用比较运算符来进行比较,造成了看起来没有问题,实则问题很大,经过学习,把什么时候可以直接用比较运算符,什么时候不可以运用进行总结。
1.基本数据类型与引用数据类型的区别:
纬度 | 基本数据类型 | 对象类型 |
---|---|---|
存储位置 | 栈(Stack) | 栈中存地址,堆(Heap)中存对象 |
值的内容 | 真实的数值 | 对象的地址(指针) |
赋值行为 | 值传递(拷贝值) | 地址拷贝(共享对象) |
举个简单的例子:
-
基本数据类型:
栈内存 (Stack) a -> 2 b -> 2
就可以类比成你手里(栈)拿了两个🍎,小张手里(栈)也拿了两个🍎,比较的时候我们知道只需要比较这两个🍎的数量是否相同。
-
引用数据类型:
栈内存 (Stack) 堆内存 (Heap) s1 ──> [0x1001] ───► 2 (对象1) s2 ──> [0x1002] ───► 2 (对象2)
同样也可以类比成你手里(栈)有个快递取件码,小张手里(栈)也有个快递取件码,每个快递取件码取的📦中(堆)都有两个🍎,所以比较的时候我们要区分清楚比较的是这个取件码还是苹果的数量。
2.基本数据类型
基本数据类型可以直接使用比较运算符,比较运算符包括小于(<),大于(>),等于(==),不等于(!=),大于等于(>=),小于等于(<=)。
基本数据类型包括八大类:
- int,long,short,byte
- float,double
- char
- boolean(只能用==和!=)
以三个基本数据类型为例:
public class Main {
public static void main(String[] args) {
// 1. int
int i1 = 1000;
int i2 = 2000;
System.out.println("int 比较: " + (i1 == i2));
// 2. char
char c1 = 'A'; // Unicode: 65
char c2 = 'B'; // Unicode: 66
System.out.println("char 比较: " + (c1 < c2));
// 3. boolean
boolean bool1 = true;
boolean bool2 = false;
System.out.println("boolean 比较: " + (bool1 == bool2));
}
}
打印结果:
int 比较: false
char 比较: true
boolean 比较: false
以int为例子,我们这里比较的是1000个🍎和2000个🍎的数量是否一样。
3.对象类型
对象类型可分为四类:
- String(字符串类型)
- 包装类型
- 数组
- 自定义类型
这里以前两个为例子:
1.String(字符串类型):
以代码为例:
public class Main {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println("打印结果:" + (s1 == s2));
}
}
我们心里可能有超过50%的可能觉得打印出来的是true,但是实际上:
打印结果:false
不考虑变量类型,我们可以知道这个==比较的只是栈的大小,也就是📦对应的取件码的比较,自然不同。
那么如何比较呢?
1️⃣ 使用 equals 方法比较内容(说明:equals 比较的是堆的内容,也就是🍎的数量,而不是栈的大小,也就是📦的取件码)
2️⃣ 使用 compareTo 方法比较,与equals方法同理,但是它可以根据返回值的大小来进行判断大小
- 等于0 → 两个数值相等
- 小于0 → 当前对象小于参数对象
- 大于0 → 当前对象大于参数对象
正确的比较:
public class Main {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println("使用equals方法比较:" + s1.equals(s2));
boolean isEqual = s1.compareTo(s2) == 0;
System.out.println("使用compareTo方法比较:" + isEqual);
}
}
打印结果:
使用equals方法比较:true
使用compareTo方法比较:true
这次终于是比较📦箱里面的内容了(不考虑类型)。
2.包装类型:
我们经常会用到包装类型,包装类型和八大基本数据类型一一对应,是把基本类型封装成对象:
基本类型 | 包装类 | 基本类型 | 包装类 |
---|---|---|---|
byte | Byte | float | Float |
short | Short | double | Double |
int | Integer | char | Character |
long | Long | boolean | Boolean |
直接给出例子(以两个为例子):
public class Main {
public static void main(String[] args) {
Double x = 1.0;
Double y = 1.0;
System.out.println("直接比较: " + (x == y));
System.out.println("用equals方法比较: " + x.equals(y));
System.out.println("用compareTo方法比较: " + (x.compareTo(y) == 0));
Long m = 200L;
Long n = 200L;
System.out.println("直接比较 " + (m == n));
System.out.println("用equals方法比较: " + m.equals(n));
System.out.println("用compareTo方法比较: " + (m.compareTo(n) == 0));
}
}
打印结果:
直接比较: false
用equals方法比较: true
用compareTo方法比较: true
直接比较 false
用equals方法比较: true
用compareTo方法比较: true
总结:
在进行比较的时候,我们首先要判断是基本数据类型还是对象类型的来决定是否可以直接运用比较运算符来直接比较,不要犯下低级错误,为以后留下隐患。