首先说明在java语言中“==”的用法。
-
“==”的用法
“==”用于判断两个元素是否相等,用于基本数据类型比较和引用比较会产生不同的效果。
(1)基本数据类型比较:只要两个数据的值相等,就返回true,否则返回false。在这里是比较的是数值。
(2)引用比较:如果引用指向同一块内存区域,则返回true,否则为flase。 - equals()方法
equals()方法是确定两个对象的引用是否相等。
首先在这里讲一下String类的equals()方法。字符串常量存储在字符串池中,存储机制为首先会在池中查找有没有相同的字符串,如果没有则存入,如果有则将已有的字符串的引用赋给常量,即字符串池中的字符都是不同的。如下
String w = "name";
String l = "name";
System.out.println(w==l);执行结果是true。因为w和l指向内存的同一块地址。
System.out.println(w.equals(l));//因此这个地方也返回true。
String h = new String("KKK");
String x = new String("KKK");
System.out.println(h==x);//返回值为false。
因为new一个变量,是在堆中分配内存,因此h和x指向的是不同的内存区域,所有返回值为false。然而System.out.println(h.equals(x));
//返回true,为什么呢?那是因为String类覆盖了equals()方法,使equals()方法是比较的是值相等。
- 一般类的equals()方法
public List courseToSelect=new ArrayList();;
Course c = (Course) it.courseToSelect.get(0);
System.out.println(c);
System.out.println(it.courseToSelect.get(0).equals(new Course("1","数据结构")));
System.out.println(it.courseToSelect.get(0).equals(c));
执行结果如下:
第一行为打印的是c对象的引用,第二行返回值为false,那是因为引用那个不同,第三行为true是因为c指向序列的第0元素。
3. contains()方法
JAVA API中对List的contains()方法的解释如下:可以看出在contains()内部也是调用的equals()方法进行判断的,因此它也是判断的对象的引用是否相同。
如果此列表中包含指定的元素,则返回 true。更确切地讲,当且仅当此列表包含至少一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,则返回 true。
看一下的代码:
Course c = (Course) it.courseToSelect.get(0);
System.out.println(c.id + c.name);
System.out.println(it.courseToSelect.contains(new Course("1","数据结构")));
System.out.println(it.courseToSelect.contains(c));
运行结果是
4.因此当我们需要判断序列中是否包含具有某个属性的对象时需要自己重写equals()方法。
热门评论
写的挺详细的,解释的也很清晰