1、为什么重写equals还要重写hashcode

首先equals与hashcode间的关系是这样的:

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)

为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那就没必要再进行equals的比较了,这样就大大减少了equals比较的次数,在需要进行大量比较的情况下可以显著的提高效率,一个很好的例子就是在集合中的使用;我们都知道java中的List集合是有序的、可以重复的,而set集合是无序的、不能重复的。如果单靠equals方法比较的话,假设原来集合中已经有10000个元素了,那么放入第10001个元素时,要将前面所有的元素都进行equals比较,看看是否有重复,这个效率就会很慢,因此hashcode应运而生,java采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,如果有,再用equals比较,如果没有则直接插入,这样就大大减少了equals的使用次数,执行效率就大大提高了。

简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确不相同,这样就违背了Java API中对hashCode方法的描述。

2、说一下map的分类和常见的情况

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap。Map主要用于存储健值对,不允许键重复(重复了会覆盖掉),但允许值重复。

Hashmap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的;HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致;如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

Hashtable与HashMap类似,不同的是,它不允许记录的键或者值为空,支持线程同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。

LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢;不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap实现了SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序比较器,遍历得到的记录是排过序的。

一般情况下,我们用的最多的是HashMap,在Map中插入、删除和定位元素,HashMap是最好的选择;但如果想要按自然顺序或自定义顺序遍历键,那么TreeMap会更好;如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现。

3、Object若不重写hashCode()的话,hashCode()如何计算出来的?

Object的hashcode方法是本地方法,也就是用c语言或c++实现的,该方法返回的是一个由内存地址经过散列得到的整数值。

4、==比较的是什么?

==比较的是两个对象的内存地址是否相同。

5、若对一个类不重写,它的equals()方法是如何比较的?

和==比较是一样的,都是比较两个对象的内存地址是否相同。

转载于:https://www.cnblogs.com/liumilk/p/10599471.html

JavaSE之Java基础(1)相关推荐

  1. javase之java基础语法0基础版

    前期准备: 1.快捷键:win+l 锁屏 alt+f4 关闭当前窗口 多个窗口切换 ctrl+tab 多选删除文件ctrl+x 2.dos命令:常用dos命令:dir查看当前目录中的文件 cd 路径 ...

  2. JavaSE 18 Java基础语法 → 标识符关键字

    4.2 标识符和关键字 4.2.1 标识符 标识符是 $.下划线和字母开头,然后又由下划线.字母.数字组成,不能有特殊符号,也不能是关键字!标识符 对大小写是 非常敏感的.(当然可以 使用 中文 命名 ...

  3. JavaSE入门0基础笔记 第二章Java基础语法

    JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...

  4. javaSE——Java基础类库

    一.Java基础类库 Java以基础类库JFC(Java Foundation Class)的形式为程序员提供编程接口API,类库中的类按照用途归属于不同的包中. 1.Java.lang包 Java最 ...

  5. Java基础入门语法和安装

    1. Java概述 1.1 Java语言背景介绍(了解) 语言:人与人交流沟通的表达方式 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford Un ...

  6. (一)Java基础巩固

    抽象类: 抽象类遵循的原则: (1)abstract关键字只能修饰类和方法,不能修饰字段. (2)抽象类不能被实例化(无法使用new关键字创建对象实例),只能被继承. (3)抽象类可以包含属性,方法, ...

  7. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会 直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有"01 ...

  8. java基础知识总结,绝对经典

    写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...

  9. Java基础:String类

    相关阅读 Java基础:String类 Java字符串格式化 Java基础:正则表达式 1. 概述 字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组. 在实际开发中,字符串的操作 ...

最新文章

  1. 独家 | 用归纳偏置来增强你的模型性能
  2. veth-pair技术在docker中的应用(docker网络通信)及tomcat Dockerfile示例
  3. c语言wb和wb 区别,C语言文件 w+与wb+区别
  4. kali 创建php可执行文件_利用树莓派在kali环境下搭建Web环境(Apache+Php7.3+Mysql)...
  5. Exception in Tkinter callback
  6. OEM XP 让你的盗版xp像品牌机一样华丽
  7. 微软MSDN订阅用户已可提前手工下载Windows 10安装包
  8. Linux zip与unzip:通过正则式解压压缩包内指定的文件
  9. windows下载安装ElasticSearch
  10. IPQ8072A 如何通过AT指令跟SDX55交互
  11. golang 内存管理
  12. ORACLE数据库查询锁表语句sql脚本,以及删除锁信息脚本(数据库开发ETL、DBA必备)
  13. 史上最强!目标检测数据集标注工具网页版
  14. 分享量化交易接口之网格交易的选股策略
  15. java Spring的AOP理解和动态代理
  16. 有关面试八股文的一些难点
  17. win7电脑右键菜单选项的顺序怎么调整
  18. NENU 17级算法学习小组 Roun4 0620
  19. BUAA OO Unit1 单元总结
  20. IBM T43 刷bios 装win7教程

热门文章

  1. uC/OS-II源码分析(总体思路 二)
  2. 在Spring MVC中使用Velocity
  3. taskset设置CPU affinity
  4. 京东白条要上征信了!你用还是不用
  5. 2017年度总结:迷茫。
  6. 得意而忘乎形:谈葛水平的水墨画
  7. “象征界”的奇观:刘天怜花鸟工笔作品印象
  8. 一只紧握笔的手:地震中的感人图片之二
  9. 新体验小说:作家重新卷入当代历史的一种方式——纪念“新体验小说”倡导一周...
  10. macos ntfs插件_Mac下NTFS读写插件NTFS for Mac介绍