hashCode和equals
- HashSet如何检查重复
- 两个对象的hashCode()相同,则equals()也一定为true,对吗?## 标题
- hashCode和equals方法的联系
- 面试官可能会问你:“你重写过hashcode和equals吗,为什么重写equals时必须重写hashCode方法?”
hashCode()介绍
hashCode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,这就意味着java中的任何类都包含有hashCode()函数。
散列表存储的是键值对(ke-value),它的特点是:能根据"键"快速的检索出对应的“值”。这其中就是利用到了散列码!(可以快速找到所需要的对象)。
为什么要有hashCode
我们以HashSet如何检查重复为例子来说明为什么要有hashCode
当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时就会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。
hashCode()与equals()的相关规定
如果两个对象相等,则hashcode一定也是相同的。
两个对象相等,对两个对象分别调用equals方法都返回true。
两个对象有相同的hashcode值,它们也不一定是相等的。
因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
对象的相等与指向他们的引用相等,两者有什么不同?
对象的相等比的就是内存中存放的内容是否相等而引用相等比较的是他们指向的内存地址是否相等。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递,Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中是,参数的值就是对该对象的引用。对象的属性可以再被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。
值传递和引用传递有什么区别
值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。
引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
JDK中常用的包有哪些
java,lang:这个是系统的基础类
java.io:这里面是所有输入输出有关的类,比如文件操作等;
java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包;
java.net:这里面是与网络有关的类;
java.util:这个是系统辅助类,特别是集合类;
java.sql:这个是数据库操作的类。
import java 和javax有什么区别
刚开始的时候JavaAPI所必需要的包是Java开头的包,Javax当时只是扩展API包来说使用。然而随着时间的推移,Javax逐渐的扩展成为JavaAPI的组成部分。但是,将扩展从Javax包是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定Javax包将成为标准API的一部分。
所以实际上Java和Javax没有区别,这都是一个名字。
Java中的IO流分为几种?
按照流的流向分:可以分为输入流和输出流
按照操作单元划分:可以划分为字节流和字符流
按照流的角色划分:节点流和处理流
Java Io流共涉及40多个类,这些类看上去很杂乱,但是实际上很有规则,而且彼此之间存在非常紧密的联系。
Java IO流的40多个类都是从如下4个抽象类基类中派生出来的。
InputStream / Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream / Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。
Files的常用方法都有哪些?
FIles.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹
Files.delete():删除一个文件或目录
Files.copy():复制文件。
FIles.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。