22、两个对象的hashCode()相同,则equals()也一定为true吗?

两个对象的hashCode()相同,equals()不一定为true。因为在散列表中,hashCode()相等,即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等【散列冲突】

23、为什么重写equals()就一定要重写hashCode()方法?

这个问题应该是有个前提,就是你需要用到HashMap、HashSet、HashTable等Java集合,用不到哈希表的话,其实仅仅重写equals()方法就可以。而工作中的场景是常常用到Java集合,所以Java官方建议重写equals()就一定要重写hashCode()方法。

对于对象集合的判重,如果一个集合含有10000个对象实例,仅仅使用equals()方法的话,那么对于一个对象判重就需要比较10000次,随着集合规模的增大,时间开销是很大的。但是同时使用哈希表的话,就能快速定位到对象的大概存储位置,并且在定位到大概存储位置后,后续比较过程中,如果两个对象的hashCode不相同,也不再需要调用equals()方法,从而大大减少了equals()比较次数。

所以从程序实现原理上来讲的话,既需要equals()方法,也需要hashCode()方法。那么既然重写了equals(),那么也要重写hashCode()方法,以保证两者之间的配合关系。

hashCode()与equals()的相关规定;

1、如果两个对象相等,则hashCode一定也相等;

2、两个对象相等,对两个对象分别调用equals方法都返回true;

3、两个对象有相同的hashCode值,它们也不一定是相等的;

4、因此,equals方法被重写过,则hashCode方法也必须被重写;

5、hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。

24、&和&&的区别?

Java中&&和&都是表示与的逻辑运算符,都表示逻辑运算符and,当两边的表达式都为true的时候,整个运算的结果才为true,否则为false。

&&:有短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;

&:不管第一个表达式结果是否为true,第二个都会执行。

​ 除此之外,&还可以作为运算符:当&两边的表达式不是Boolean类型的时候,&表示位操作。

运算规则:

两个位都为1时,结果才为1

0&0=0  0&1=0  1&0=0  1&1=1

8的二进制是1000 7的二进制是0111

1000

0111

&运算中1&1=1,1&0=0,0&0=0

并且按位置对应运算的,也就是说第一位和第一位运算,其他类推

所以可以得出0000,故输出的是0。

25、Java中的参数传递时传值呢?还是传引用(数据类型)?

Java的参数是以值传递的形式传入方法中的,而不是引用传递。

1、当传递方法的参数类型为基本数据类型时,一个方法是不可能修改一个基本数据类型的参数。

2、当传递⽅法参数类型为引⽤数据类型时,⼀个⽅法将修改⼀个引⽤数据类型的参数所指向对象的值。即使 Java 函数在传递引⽤数据类型时,也只是拷⻉了引⽤的值罢了,之所以能修改引⽤数据是因为它们同时指向了⼀个对象,但这仍然是按值调⽤⽽不是引⽤调⽤。