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的更多相关文章

  1. scala判断数据类型

    scala判断一个数据或者对象的类型只需要在该对象后面添加 .getClass.getSimpleName : scala> 222.getClass.getSimpleName res1: S ...

  2. Java中判断对象是否为空的方法

    首先来看一下工具StringUtils的判断方法:    一种是org.apache.commons.lang3包下的:    另一种是org.springframework.util包下的.这两种S ...

  3. List集合去除重复对象及equals()、hashCode()方法的作用

    原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...

  4. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  5. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  6. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

  7. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  8. java虚拟机判断对象是否存活的方式

    引用计数算法:   给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component ob ...

  9. 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法

    获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...

随机推荐

  1. 7.zookeeper集群搭建(windows环境下)

    转自:https://www.cnblogs.com/xuxiuxiu/p/5868481.html 本次zk测试部署版本为3.4.6版本,下载地址http://mirrors.cnnic.cn/ap ...

  2. Mongodb总结3-稍微封装一下

    上次发表的2,纯粹是Demo,演示API的用法. 今天,稍微封装了下,看得更清楚. 考虑到不容易做得很有通用性,所以封装的一般,换种场景需要直接修改代码,但是有一部分是可以复用的. 最近项目,很可能只 ...

  3. 三个水杯(BFS)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...

  4. Ab工具基本使用

    Ab简介 ab是apache自带的压力测试工具,ab是apachebench命令的缩写. ab不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试. ab是一个ht ...

  5. 【Codeforces Round #299 (Div. 2) A】 Tavas and Nafas

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟题 [代码] #include <bits/stdc++.h> using namespace std; map & ...

  6. Linear to physical address translation with support for page attributes

    Embodiments of the invention are generally directed to systems, methods, and apparatuses for linear ...

  7. C# 进程同步,通信

    进程之间通讯的几种方法:常用的方法有:1.使用内存映射文件2.通过共享内存DLL共享内存3.使用SendMessage向另一进程发送WM_COPYDATA消息.   发送WM_COPYDATA消息 比 ...

  8. ExtJs4学习(七)MVC中的Store

    Ext.data.Store是extjs中用来进行数据交换和数据交互的标准中间件,不管是Grid还是ComboBox,都是通过它 实现数据读取.类型转换.排序分页和搜索等操作的. Ext.define ...

  9. angular4开发过程中遇到的问题和知识点记录

    1. angular2中的属性有什么区别,为什么会报错呢? 元素上有两种属性:property和attribute,attribute是通过getAttribute()和setAttribute()方 ...

  10. STATUS CODE: 91, occurs when trying to move media from one volume pool to another.

    Overview:Symantec NetBackup (tm) will not allow a tape with active images to be moved from one volum ...