java面试题基础知识一:运算符操作以及一些基础问题

1. java面试题基础知识一:运算符操作以及一些基础问题

1.1. 运算符

  1. 或运算|

将数字转成二进制,全0位0,否则为1

0xaa | 0x55 例如:0xaa转成二进制为:10101010 0x55转为二进制为01010101 取或后为11111111,十进制为255,16进制为0xFF

  1. 与运算&

将数字转为二级制,全1位1,其他为0

15 等于1111 ,240等于 11110000,15前面用0补齐为00001111 ,按位与之后为 00000000 ,即结果为0

  1. 异或运算^

将数字转为二级制,相同取0,不同取1.

1010 ^ 1100 =0110 , 十进制表示为6,十六进制表示为 0x06

  1. 带符号右移>>

将数字转为二进制,在右移时,如果为负数,补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

  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());
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章