1、为什么重写equals()还要重写hashcode()?
(equals()和hashCode()是java Object中两个基本方法)
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false).
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;
我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。
要是重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的情况.
所以,要是你重写了equals()方法,而你的对象可能会放入到散列(HashMap,HashTable或HashSet等)中,那么还必须重写hashCode(), 如果你的对象有可能放到有序队列(实现了Comparable)中,那么还需要重写compareTo()的方法。
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()如何计算出来的?
没有重写的话,只要hashCode不相等那么两个对象一定不相同,
重写的话,首先判断hashCode如果不一样,那么两个对象不相等,如果hashCode一样的话,再比较equals,如果true就相同,否则不相等。
hashCode的值为内存地址的计算哈希结果值
4、==比较的是什么?
equals() 比较的是两个对象的值(内容)是否相同。
"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
5、若对一个类不重写,它的equals()方法是如何比较的?
equals方法最初是在所有类的基类Object中进行定义的,源码是
public boolean equals(Object obj) { return (this == obj); }
默认实现是用“==“运算符比较两个对象的引用地址,而不是比较对象的内容。要想真正比较,必须重写。
重写时候需注意满足以下几点:
(1)自反性:对任意引用值X,x.equals(x)的返回值一定为true.
(2)对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
(3)传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
(4)一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
(5)非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
6、java8新特性
1.Lambda表达式
2.接口的默认方法与静态方法
3.方法引用
4.重复注解
5.扩展注解的支持
6.Optional类
7.Stream API
8.Date Time API
9.JavaScript引擎Nashorn
10.Base64
7、说说Lamda表达式的优缺点。
8、一个十进制的数在内存中是怎么存的?
9、为啥有时会出现4.0-3.6=0.40000001这种现象?
10、Java支持的数据类型有哪些?什么是自动拆装箱?
11、什么是值传递和引用传递?
12、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
13、你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
14、String是最基本的数据类型吗?
15、String 和StringBuffer的区别
16、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
17、int和Integer有什么区别?
18、&和&&的区别?
19、在Java中,如何跳出当前的多重嵌套循环?
20、你能比较一下Java和JavaSciprt吗?
21、简述正则表达式及其用途。
22、Java中是如何支持正则表达式操作的?
23、请你说说Java和PHP的区别?