1、为什么重写了equals还需要重写hashcode
答:hashcode的作用是查找位置,而equals是判断是否两个元素相等,在hashmap中,如果只是重写了equals方法,没有重写hashcode的话,会导致插入重复值,因为在hashmap中是先通过hashcode通过key进行hash,查找插入值的一个位置,然后通过equals方法判断是否相等,如果一样就覆盖原值,如果不一样就add一个entry,在jdk1.7中。在没有hashcode下就会继续插入一个重复值,那么在查找的过程中会出现重复的元素,也就在查找时无法定位到固定的位置了,那么equals方法也就没有什么意义了。
使用hashmap,如果key是一个自定义的类,那么必须重写equals和hashcode方法。
2、map常见的分类和情况
答:map是在java.unit包下的,map有hashmap,hashtabel,??
hashmap允许key,value为null,最多一个key为null,允许多个value为null,线程不安全,因为是不同步的,多线程并发的时候会导致数据的不一致性,可以使用synchronize进行同步,也可以使用concurrenthashmap进行同步。
hashtable线程安全,使用synchronize同步,写入较慢,不允许key or value 为 null
(提问:为什么要用concurrenthashmap而不是用hashtable或者是锁进行同步)
3、不重写hashcode,hashcode如何计算?hashcode相同equals一定相同吗,反之?
答:不重写hashcode,是通过本次方法,直接返回对象的内存地址。不一定,因为可以自己重写,想怎么写就怎么写,只是规定了如果equals相同,hashcode一定相同。
4、== 和 equals比较
答:值不同,返回都是false
值相同,基本类型 == 基本类型 true 基本类型 == 包装类型 true 包装类型 == 包装类型 false
基本类型 equals 基本类型 true 基本类型 == 包装类型 true 包装类型 == 包装类型 true
== 在基本类型中比较的是值,在其他类型中比较的是(是否对同一个对象的引用),object中的== 和 equals比较的都是地址。
5、java8的新特性
答:lamda表达式,不是很理解(补充:允许函数作为一个方法的参数)
hashmap中jdk1.8使用了数组➕红黑树的形式
还需要掌握:方法引用——可以直接引用java类或对象的方法或构造器。√
接口中可以有默认的方法,但是声明前需要加default√
添加了新的stream API,把真正的函数式编程风格引入java√
Date Time API 加强对日期和时间的处理
Optional类,用来解决空指针异常
6、由上述问题引出的问题,lamda表达式的优缺点
答:优点是使得代码简洁并行计算容易
缺点:不用并行计算没有传统的for循环快(并行计算有时需要预热才能显示出效率优势);不容易调试;难懂
7、一个十进制的数字内存在是如何存放的
答:转化为2进制存放,以补码形式。在进行比如4.0-3.6时会出现误差是由于2进制数无法表达10进制数,在进制转化过程中出现误差
作者: whisper肉多多
主页: https://whispertzx.github.io/
个人网站文章链接:https://whispertzx.github.io/8b04e0e1/javaDay1.html
信息: 此文章版权归whisper肉多多所有,如有转载,请註明来自原作者