前言
对于java来说比较两个变量是不是相等有两种方式 第一种通过等号运算符,第二种通过equals()方法
==运算符
==运算符比较分为两种情况 一种是比较的是基本类型的变量,一种是引用类型的变量,在比较基本数据类型的时候 只要是数值相等就返回true ,否则返回false,而引用类型的变量只有他们指向同一个对象的时候才会返回true。
public class EqualsTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 64;
float f1 = 65.0f;
System.out.println("64h和64.f是不是相等"+(i==f1));
char ch = 'A';
System.out.println("64h和'A'是不是相等"+(i==ch));
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是不是相等"+(str1==str2));
System.out.println("str1和str2是不是相等"+(str1.equals(str2)));
// System.out.println("str1和str2是不是相等"+("hello"==new EqualsTest());
}
}
备注:"hello"和 new String(“hello”)的区别
hello会直接使用常量池来保存当前的字符串
new String(“hello”) 先会通过常量池保存当前的对象然后通过new 关键字创建一个String对象
String 常量的创建和重复的使用
只要你定义了的字符串在下载使用的时候就不会在创建而是从常量池中取
public class StringCompantTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
/***
* s1直接引用常量池中的常量 编译的时候就存在了
*/
String s1 = "栾小黑";
/***
* s2直接使用常量池中的常量
*/
String s2 = "栾";
/***
* s3直接使用常量池中的常量
*/
String s3 = "小黑";
String s4 = "栾"+"小黑";
String s5 = "栾"+"小"+"黑";
String s6 = s2+s3;
/***
* 新建的一个字符串对象
*/
String s7 = new String("栾桂明");
System.out.println(s1==s4);
System.out.println(s1==s5);
System.out.println(s1==s6);
System.out.println(s1==s7);
}
equals方法的使用
equals方法是object对象提供的一个方法,他的作用是和==相同的不过我们可以对这个方法进行覆盖,实现在即认为的相等的机制,如String类中重写了这个方法实现的是比较两个字符串的数值是不是相等
public class PrintObject {
public static void main(String[] args) {
Person person = new Person("xiaohei",23);
Person person2 = new Person("xiaohei",43);
/***
* 此处调用的是Object对象的toString()方法返回的是 类名 +@ +hashCode
* 如果向调用某个类的toString()来获取对象的描述需要重写toString()方法
*/
System.out.println(person);
/***
* 由于重写的equals没有实现逻辑而是直接返回true
* 因此 person是和什么对象都相等的
*/
System.out.println(person.equals(new EqualsTest()));
System.out.println(person.equals(new PrintObject()));
System.out.println(person.equals(person2));
}
}
equals方法应该满足的条件
- 自反性:
- 对称性:
- 传递性:
- 一致性:
- 对于任何部位null的对象和equals()做比较均返回false