有趣的java面试题-基础篇(一)
一、 运算符 &和&&、|和||的区别
& 按位与操作 只有对应的两个二进制数为1时,结果位才为1
1&1 = 1
1&0 = 0
0&1 = 0
0&0 = 0
| 按位或操作 有一个为1的时候,结果位就为1
1|1 = 1
1|0 = 1
0|1 = 1
0|0 = 0
&&和||称之为短路运算符
1、& 和 && 都可以实现 和 这个功能
区别:& 两边都运算,而 && 先算 && 左侧,若左侧为false 那么右侧就不运算,判断语句中推荐使用 &&,效率更高
2、| 和 || 和上面类似
区别:||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断
在以下判断中,如果只使用 & 或者 | 会出现运行异常
空指针异常
String s = null;
if(null != s & s.equals(""))
如果使用 && 的话,当第一个条件满足时,就直接判定为false 第二个条件不会执行,程序则正常运行。
二、用最有效率的方法计算2乘以8
这里涉及到计算机基础知识 位运算符 << 左移 和 >> 右移 。
答案:2<<3
原理:将一个数左移n位,相当于乘以2的n次方,位运算是CPU直接支持的,所以效率高
常见的JDK源码里面HashMap的默认容量16
直接是二进制操作了,表示1左移4位,变成10000,转为10进制也就是16, 直接以二进制形式去运行,效率更高
相反将一个数右移n位,相当于除以2的n次方
三、传递两个非0的int数值进去,实现变量交换的方式,有几种方式?
方式一
public static void test(int a, int b){
System.out.printf("a=%d, b=%d",a,b);
a = a + b;
b = a - b ;
a = a - b;
System.out.printf("\na=%d, b=%d",a,b);
}
方式二 异或运算 (一个数与另一个数异或两次是其本身, 一个数和自身异或结果是0 )
public static void test2(int a, int b){
System.out.printf("a=%d, b=%d",a,b);
a = a^b; // a1 = a^b
b = b^a; // b = b^a^b
a = a^b; // a = a1^b = a^b^a
System.out.printf("\na=%d, b=%d",a,b);
}
四、java数据类型分类
8种基础数据类型:byte、short、int、long、float、double、char、boolean
引用数据类型:除8种数据类型外其他都是引用类型
String和Enum也是引用类型
五、++ --运算符
int i = 5;
return i++; 和 return ++i; 返回结果是什么?
第一个先返回后运行++ 所以返回5, 第二个先运算后返回 所以返回6.
六、== 和equals的区别
8个基本数据类型比较 要用 == 判断是否相等
引用数据类型: == 比较的是内存地址是否一样,不同对象的内存地址不一样,equals本质上也是==,
但String类重写了equals方法,把内容拆成char类型的数组,先比较长度,如果相同,再逐个比较内容,如果完全相同返回true。
开发者也可以自己重写equals方法去定义什么条件去判断两个对象是否一样。