scala 判断对象相等/equals
package scala_enhance.scalaextends import scala.collection.mutable.HashMap /**
* scala中判断对象相等
* 原则:
* 如果两个对象相等,那么其hashcode必定相同,所以重写equals方法,要重写hashcode(默认情况下hashcode是根据内存地址计算出来的值)
* 但如果hashcode相同(即使用 == 比较为true),却不能证明他们相等
* 关于重写equals为什么需要重写hashCode请参考https://www.cnblogs.com/wang-meng/p/7501378.html
*
* 对于基本数据类型,== 在java和scala中均比较的是两个变量的值。
*
* 在scala中,对于引用对象,如果有一个对象为null,== 调用的是eq(比较对象的内存地址),如果均不为null,则调用equals,
* 注意这个equals是调用java中的equals,所以默认比较的还是内存地址,综上 == 默认情况下在scala中依然比较的是内存地址
* 此外scala中的String就是java中的String,所以在scala中,如对"ok" == "ok",调用的是java String的equals
*
* 而在java中,== 永远比较的是内存地址,与你是否重写该对象的equals无关
*
*/ class Student(val name:String) {
val age = ; override def equals(obj:Any):Boolean = {
if(!obj.isInstanceOf[Student]) {
false;
}else {
val x = obj.asInstanceOf[Student];
this.name == x.name; //这个地方也可以使用equals比较,这样写的话就是直接调用java String的equals了(当然现在也是,因为name是String)
}
} override def hashCode():Int = {
name.length();
} } object Demo2 { val s1 = new Student("hello");
val s2 = new Student("hello"); //重写equals之前的测试
println("ok" == "ok")//true,调用的是equals,但由于是String类型,其重写了equals方法,比较的是值
println("ok" == null)//false,调用eq,比较的是内存地址
println(null == null)//true,调用eq,比较的是内存地址
println("ok".equals("ok")); //true println(s1 == s2);//false,未重写equals,比较的地址 //只重写equals的测试
println(s1 == s2); //true,此时调用的是重写后的equals,比较的是name字符串是否相同,即调用java String的equals,比较的是值
println(s1.equals(s2))//true,也是调用其内部重写的equals println(s1.eq(s2));//false, eq比较的是地址,而我们还没有重写eq方法 /*而在java中, == 只比较内存地址
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(s1 == s2);//false
*/ //此时测试hashMap,即s1与s2相同,hashCode却不同,此时对于HashMap来说s1与s2是两个不同的对象
println(s1.hashCode() == s2.hashCode());//false
val map = new HashMap[Student,Int]();
map.put(s1,);
map.put(s2,);
println(map.get(s1));//Some(100)
println(map.get(s2));//Some(200) //重写hashCode后重新测试,此时对于HashMap来说s1与s2是同一个对象,s2的值会覆盖s1的值
println(map.get(s1));//Some(200)
println(map.get(s2));//Some(200) def main(args: Array[String]): Unit = { }
}
关于重写equals为什么需要重写hashCode请参考https://www.cnblogs.com/wang-meng/p/7501378.html
总结:在scala中,== 默认比较内存地址,但如果重写了equals,则调用该类型重写的equals进行比较(前提是两个对象均不为null,否则仍然比较的是地址)
附未重写时的方法来源,但是很奇怪,java Object中并没有eq,只有equals

scala 判断对象相等/equals的更多相关文章
- scala判断数据类型
scala判断一个数据或者对象的类型只需要在该对象后面添加 .getClass.getSimpleName : scala> 222.getClass.getSimpleName res1: S ...
- Java中判断对象是否为空的方法
首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种S ...
- List集合去除重复对象及equals()、hashCode()方法的作用
原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...
- Java 如何重写对象的 equals 方法和 hashCode 方法
前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- java虚拟机判断对象是否存活的方式
引用计数算法: 给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component ob ...
- 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...
随机推荐
- python关于字典的操作
https://www.cnblogs.com/RENQIWEI1995/p/7931374.html 最常用的代码举例: dict = {'Name': 'Zara', 'Age': 7, 'Cla ...
- Python编写Appium测试用例(2)
#coding=utf-8import os,sysimport unittestfrom appium import webdriverimport timefrom selenium.webdri ...
- loadrunner--设置代理录制
为了解决loadrunner录制不到脚本或录制经常无响应等情况,可以选用代理录制方式,步骤如下. 打开配置好代理的浏览器,输入要录制的服务器ip,开始操作,录制完成后点击Shutdown
- php字符串函数分类总结
php字符串函数分类总结 一.总结 explode str_split str_word_count strtolower 二.php字符串函数分类总结 php内置了98个字符串函数(除了基于正 ...
- 一个IP建多个Web站点
TCP端口法 由于各种原因,我们有时候需要在一个IP地址上建立多个web站点,在IIS5中,我们可能通过简单的设 置达到这个目标. 在IIS中,每个 Web 站点都具有唯一的.由三个部分组成的标识 ...
- SVN—怎样安装SVNclient软件
一.怎样安装TortoiseSVN-1.7.12.24070-win32-svn-1.7.9版本号的SVNclient软件: a.下载TortoiseSVN-1.7.12 ...
- java中的switch用String作为条件
在开发java程序的过程中,我们遇到了条件推断首选就是switch,可是java中的switch功能不支持字符串作为条件.这时我们该怎么办呢? --使用枚举. 一.枚举简单了解 1.enum是一 ...
- OC学习篇之---协议的概念和用法
这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...
- 【SPOJ 694】Distinct Substrings
[链接]h在这里写链接 [题意] 给你一个长度最多为1000的字符串 让你求出一个数x,这个x=这个字符串的不同子串个数; [题解] 后缀数组题. 把原串复制一份,加在 ...
- Oracle内存管理(之四)
[深入解析--eygle]学习笔记 1.3 SGA管理 SGA指系统全局区(System Global Area),是一块用于载入数据.对象并保存执行状态和数据库控制信息的一块内存区域,在数据库实例启 ...