scala 判断对象相等/equals

 1 package scala_enhance.scalaextends
 2
 3 import scala.collection.mutable.HashMap
 4
 5 /**
 6  * scala中判断对象相等
 7  * 原则:
 8  * 如果两个对象相等,那么其hashcode必定相同,所以重写equals方法,要重写hashcode(默认情况下hashcode是根据内存地址计算出来的值)
 9  * 但如果hashcode相同(即使用 == 比较为true),却不能证明他们相等
10  * 关于重写equals为什么需要重写hashCode请参考https://www.cnblogs.com/wang-meng/p/7501378.html
11  *
12  * 对于基本数据类型,== 在java和scala中均比较的是两个变量的值。
13  *
14  * 在scala中,对于引用对象,如果有一个对象为null,== 调用的是eq(比较对象的内存地址),如果均不为null,则调用equals,
15  * 注意这个equals是调用java中的equals,所以默认比较的还是内存地址,综上 == 默认情况下在scala中依然比较的是内存地址
16  * 此外scala中的String就是java中的String,所以在scala中,如对"ok" == "ok",调用的是java String的equals
17  *
18  * 而在java中,== 永远比较的是内存地址,与你是否重写该对象的equals无关
19  *
20  */
21
22 class Student(val name:String) {
23   val age = 100;
24
25   override def equals(obj:Any):Boolean = {
26       if(!obj.isInstanceOf[Student]) {
27         false;
28       }else {
29         val x = obj.asInstanceOf[Student];
30         this.name == x.name; //这个地方也可以使用equals比较,这样写的话就是调用java String的equals了
31       }
32   }
33
34
35   override def hashCode():Int = {
36      name.length();
37   }
38
39
40 }
41
42 object Demo2 {
43
44    val s1 = new Student("hello");
45    val s2 = new Student("hello");
46
47
48    //重写equals之前的测试
49    println("ok" == "ok")//true,调用的是equals,但由于是String类型,其重写了equals方法,比较的是值
50    println("ok" == null)//false,调用eq,比较的是内存地址
51    println(null == null)//true,调用eq,比较的是内存地址
52    println("ok".equals("ok")); //true
53
54    println(s1 == s2);//false,未重写equals,比较的地址
55
56
57    //只重写equals的测试
58    println(s1 == s2); //true,此时调用的是重写后的equals,比较的是name字符串是否相同,即调用java String的equals,比较的是值
59    println(s1.equals(s2))//true,也是调用其内部重写的equals
60
61    println(s1.eq(s2));//false, eq比较的是地址,而我们还没有重写eq方法
62
63
64    /*而在java中, == 只比较内存地址
65     String str1 = new String("hello");
66         String str2 = new String("hello");
67         System.out.println(s1 == s2);//false
68    */
69
70    //此时测试hashMap,即s1与s2相同,hashCode却不同,此时对于HashMap来说s1与s2是两个不同的对象
71    println(s1.hashCode() == s2.hashCode());//false
72    val map = new HashMap[Student,Int]();
73    map.put(s1,100);
74    map.put(s2,200);
75    println(map.get(s1));//Some(100)
76    println(map.get(s2));//Some(200)
77
78    //重写hashCode后重新测试,此时对于HashMap来说s1与s2是同一个对象,s2的值会覆盖s1的值
79    println(map.get(s1));//Some(200)
80    println(map.get(s2));//Some(200)
81
82
83   def main(args: Array[String]): Unit = {
84
85   }
86 }

关于重写equals为什么需要重写hashCode请参考https://www.cnblogs.com/wang-meng/p/7501378.html

附未重写时的方法来源,但是很奇怪,java Object中并没有eq,只有equals

原文地址:https://www.cnblogs.com/tele-share/p/10128804.html

时间: 2024-10-14 13:52:35

scala 判断对象相等/equals的相关文章

hashcode 和equals 及HashSet判断对象相等

hashcode()和equals()及HashSet判断对象相等.1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的.public boolean equals(Object obj)    指示某个其他对象是否与此对象“相等”.     equals 方法在非空对象引用上实现相等关系:      * 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true.      * 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equa

判断对象是否在视线内

// Cast a sphere with the desired distance. Check each collider hit to see if it is within the field of view. Set objectFound // to the object that is most directly in front of the agent /// <summary> /// Withins the sight. /// </summary> ///

Java对象的equals,hashCode方法

今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的. equals()方法在object类中定义如下:   public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同).但是我们必

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

javascript 判断对象的内置类型

判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法.在toString方法被调用时,会执行下面的操作步骤:1. 获取this对象的[[Class]]属性的值.2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.3. 返回第二步的操作结果Result(2).Object.prototype.toString方法返回的字符串,去掉前面固定的"[

判断对象类型

1.typeof不能区分数组类型和对象,只能区分原始类型与function 2.判断父级对象: isPrototypeOf -- 判断对象本身数据类型,及可能继承自原型的数据类型 let bool = Array.prototype.isPrototypeOf(obj) 3. 判断构造函数: 检查整个原型链 obj.constructor==Array 是数组,也可能继承自数组 let bool = obj instanceof Array 是数组,也可能继承自数组 4. 判断对象的内部clas

Python中 isinstance()用法 判断对象的类型

isinstance(p_object, class_or_type_or_tuple):判断对象的类型 a=123 ret=isinstance(a,int) print(ret) #输出:True li=[2,57,4] ret1=isinstance(li,list) print(ret1) #输出:True  

浅谈java对象的equals方法

作为一个被问的很多的一个面试题:java中==和equals有什么区别? 网上普遍的回答都是:==比较的是内存地址,equals比较的是值. 其实这种回答是很不标准的,稍微标准一点的回答应该JDK自带的一些类对equals的实现各不同,例如 Object对象的equals的定义是这样的: public boolean equals(Object obj) { return (this == obj); } 所以在Object中==和equals是没有任何区别的. 但在String中,重写的equ

javascript判断对象是否为空

JavaScript是一种弱类型的脚本语言,在开发中经常会因为语法不严谨而出现一些错误. 下面的方法是判断对象是否为空的方法,包括对 null.undefind.空字符等类型. //判断是否为空 为空返回 false 不为空返回true function isNotEmpty(_value) { return ((_value === undefined || _value === null || _value === "" || _value === "undefined&