本文共 2153 字,大约阅读时间需要 7 分钟。
对于Java中的简单类型int,比较两个值的大小只能使用“==”运算符。因为简单类型的值是直接存储在内存中的,而不是作为对象存在的。
int n1 = 10;int n2 = 10;if (n1 == n2) { System.out.println("n1 == n2");} 输出结果:
n1 == n2 对于JDK自带的类(如ArrayList、HashMap等),比较对象的方式与简单类型有所不同。“==”运算符比较的是两个对象的内存地址,而equals()方法比较的是两个对象的值是否相等。
Listlist1 = Arrays.asList(1, 2, 3);List list2 = Arrays.asList(1, 2, 3);if (list1 != list2) { System.out.println("list1 != list2");}if (list1.equals(list2)) { System.out.println("list1.equals(list2)");}
输出结果:
list1 != list2 list1.equals(list2) 需要注意的是,String类型的对象特殊。对于String类型,如果使用new关键字创建对象,则每个对象都会分配独立的内存;如果仅定义一个对象,则会从字符串池中获取已存在的字符串。
String s = new String("hello");String ss = new String("hello");if (s.equals(ss)) { System.out.println("s.equals(ss)");}if (s != ss) { System.out.println("s != ss");} 输出结果:
s.equals(ss) s != ss 如果直接定义String对象,则两个变量将共享同一内存块:
String s = "hello world";String ss = "hello world";if (s.equals(ss)) { System.out.println("s.equals(ss)");}if (s == ss) { System.out.println("s == ss");} 输出结果:
s.equals(ss) s == ss 对于自定义的类,如果没有继承JDK自带的类或重写Object中的equals方法,则“==”和equals()方法的功能相同,都比较两个对象是否相等。
public class Customer {} 测试代码:
Customer c1 = new Customer();Customer c2 = new Customer();if (c1 != c2) { System.out.println("c1 != c2");}if (!c1.equals(c2)) { System.out.println("!c1.equals(c2)");} 输出结果:
c1 != c2 !c1.equals(c2) 这是因为Customer类默认继承了Object类的equals方法,Object类的equals方法只检查两个对象是否是同一个对象。
如果自定义类重写了equals方法,则equals()方法的逻辑将由类本身定义。例如:
public class Customer { private String name; public Customer(String name) { super(); this.name = name; } @Override public boolean equals(Object obj) { if (null == obj) { return false; } Customer objCustomer = (Customer) obj; if (this.name.equals(objCustomer.name)) { return true; } return false; }} 测试代码:
Customer c1 = new Customer("lzj");Customer c2 = new Customer("lzj");if (c1 != c2) { System.out.println("c1 != c2");}if (c1.equals(c2)) { System.out.println("c1.equals(c2)");} 输出结果:
c1 != c2 c1.equals(c2) 转载地址:http://yaefk.baihongyu.com/