1. java面试题基础知识一:运算符操作以及一些基础问题
文章目录
1.1. 运算符
- 或运算|
将数字转成二进制,全0位0,否则为1
0xaa | 0x55 例如:0xaa转成二进制为:10101010 0x55转为二进制为01010101 取或后为11111111,十进制为255,16进制为0xFF
- 与运算&
将数字转为二级制,全1位1,其他为0
15 等于1111 ,240等于 11110000,15前面用0补齐为00001111 ,按位与之后为 00000000 ,即结果为0
- 异或运算^
将数字转为二级制,相同取0,不同取1.
1010 ^ 1100 =0110 , 十进制表示为6,十六进制表示为 0x06
- 带符号右移>>
将数字转为二进制,在右移时,如果为负数,补1,如果为正数补0。
-2>>1
负数转二进制的方法:正数取反,加1。因此2的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0010,取反加1为:1111 1111 1111 1111 1111 1111 1111 1110 。即-2的二级制表示。
注: >> , << , >>> , 运算符只针对int型和long型,byte ,short ,char型需要转换成Int型在进行操作。
所以: 带符号右移之后为 1111 1111 1111 1111 1111 1111 1111 1111 ,除符号位之外,减一取反,得到带符号十进 制数为 -1
- 无符号右移>>>
将数字转为二进制,无论正负数,右移之后都补0
-2 的二进制无符号右移一位之后为 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方减一。
1.2. 用最有效率的方法计算2乘以8
原理:将一个数左移n位,相当于乘以2的n次方,位运算是cpu直接支持的,所以效率高。
一个数右移n位,相当于这个数除以2的n次方。常见的jdk源码里面HashMap的默认容量16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
1.3. 传递两个非0的int数值进去,实现变量交换的方式,有几种方式?
1、通过代码的加减尽心交换。
private static void swap(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("a=%d,b=%d",a,b);
}
2、通过异或运算解决。
**注意:**一个数与另一个数异或两次是其本身,一个数与自身异或结果是0。
private static void swap2(int a,int b) {
a=a^b;
b=b^a;//b^a^b
a=a^b;//a^b^a
System.out.printf("a=%d,b=%d\n",a,b);
}
1.4. 数据类型分类:
基础数据类型:byte(1),short(2),int(4),char(2),boolean(1),long(8),double(8),float(4)
引用类型:除了基础类型,都是引用类型。
1.5. 返回值问题
如果int i=1;
return ++i和return i++有什么区别?
前者i先自增1然后返回。后者先返回再自增1,故结果是2,1
1.6. ==和equals的区别
基本数据类型比较要用==来判断是否相等。
引用数据类型比较用equals来判断具体的内容是否相等。如果用==比较的是内存地址是否一样。
1.7. try-catch-finally的返回值问题
问题:try-catch-finally语句里面,try里面有个return,finally里面也有个return,结果会返回什么?为什么?
public static int test1() {
int a=1;
try {
System.out.println(a/0);
a=2;
} catch (Exception e) {
//这里确定了返回值是3,再执行finally,虽然finally里面a=4,但是前面已经确定是3了,所以返回3.
a=3;
return a;
}finally {
a=4;
}
return a;
}
public static int test2() {
int a=1;
try {
System.out.println(a/0);
a=2;
} catch (Exception e) {
//catch里面已经确定返回值为3,然后执行finally,finally里面a=4,但是有新的return,重新确定了返回值,所以是4
a=3;
return a;
}finally {
a=4;
return a;
}
}
在执行try-catch中的return之前,一定会执行finally中的代码,如果finally中有return语句,就会直接执行finally中的return方法,所以finally中的return语句一定会被执行。
执行流程:finally执行前的代码里面包含return,会先确定return的返回值,然后再执行finally的代码,最后再执行return语句。
1.8. 新版jdk代理IO流,编写基础代码,从一个txt文本里面,拷贝里面的内容到另一个txt文本里面。
jdk7之后的写法,jdk9进行了改良,需要关闭的资源只要继承了java.lang.AutoCloseable,就可以自动关闭,try()可以定义多个资源,他们的关闭顺序是最后在try里面定义的最新关闭。
public static void test() {
try(
FileInputStream fis=new FileInputStream("/Users/xxx.xxx.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("/Users/xxxx/xxx.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
) {
int size;
byte[] buf=new byte[1024];
while((size=bis.read(buf))!=-1) {
bos.write(buf,0,size);
}
} catch (Exception e) {
// TODO: handle exception
}
}
1.9. 找出某目录下的所有子目录以及子文件并打印到控制台
考察递归调用
private static void getAllFilePaths(File filePath,List<String> paths) {
//列出所有的文件
File[] files=filePath.listFiles();
if(files==null) {
return;
}
for(File f:files) {
if(f.isDirectory()) {
paths.add(f.getPath());
getAllFilePaths(f, paths);
}else {
paths.add(f.getPath());
}
}
}