自我介绍,项目介绍缓冲一下气氛。
1.Java中怎么创建一个新的线程
有三种基本方法,继承Thread类,实现Runnable接口,向Thread对象如果该对象。实现Callable接口,配合FutureTask使用。其中Runnable接口实现和Callable接口实现都是让线程作为一个任务,他两的区别是实现Callable接口的线程在运行结束后会有一个返回值,实现Runnable接口没有返回值。
2.我写一段代码,你看看有没有语法错误(其中的省略号都是其他代码)
class A {
private int a = 0;
public void foo() {
...
new Thread(new Runnable() {
public void run() {
...
a = 1;
...
}
}).start();
System.out.print(a);
}
}
(我看了半天也没发现语法错误)
没有语法错误。
3.在foo方法中打印a的值是什么
(我才明白原来是要考我线程同步方面的知识)
a的值可能是0,可能是1。
4.为什么是这样的情况
主线程执行foo方法,开启了新线程去改变a的值,这时如果新线程在主线程打印a的值之前竞争到了CPU的时间片执行了修改a的操作,那么主线程打印a的值就是1。如果新线程在主线程打印a的值之前这段时间没有竞争到足够的CPU时间片,那么打印a的值就是0。
5.你可以让他打印a的值恒为1吗
使用join方法等待新线程执行完毕再进行主线程
6.修改a的值的代码下面还有很多的代码要执行,我想a的值能在变为1的瞬间就打印出来
(我在打印a的值的上面写了一个自旋等待,如果a的值为0就等待,如果a的值为1就跳出等待循环并打印)
如果只有这两个线程的话,我认为使用自旋等待要比加锁的效率更高。
7.为什么自旋效率要高呢
因为使用synchronized关键字会加一个重量级锁,重量级锁通过互斥量使线程阻塞或运行,这伴随着用户态和运行态的切换,效率较低。自旋只会进行短暂的等待,并不会进行加锁,一般情况下效率高于锁。但是拿这段代码来说,如果新线程中更改a的代码上面有非常多的代码的话,自旋反而不如synchronized关键字效率高。因为自旋操作也是耗费CPU资源的,长时间自旋不但起不到效率优化的作用,反而会浪费CPU资源,拉低代码执行效率。
8.做个题吧,我们在Java编程中常常使用位运算对吧,现在给你一个byte型变量,你通过简单的算法把他的二进制倒置输出即可。例如给10001001,倒置为10010001输出就行
(这不就是提示我要用位运算吗)
思路:通过位运算先把相邻的两位进行交换。然后把相邻的4位进行交换,最后8位整体交换(因为byte最长只有8位)
1 0 0 0 1 0 0 1(把一位看做一个整体,左右交换得到 ↓ )
01 00 01 10(把两位看做一个整体,左右相交换得到 ↓ )
0001 1001 (把4位看做一个整体,左右交换得到 ↓ )
10010001(大功告成)
9.一个int型变量最大是多大
2的31次方
10.一个int型变量几个字节
4个
11.一个字节几位
8位
12.现在有个题,给你两个特别长的数字,把他们相加然后输出
思路:面试官都说了特别长了,肯定不是用int。给的应该是两个String字符串。首先把这两个字符串补长对其,然后给首位加一个0(这个是避免进位后位数不够的,例如999 + 1 = 1000)。接着用一个boolean变量去存储进位信息,两个数字字符串从最小位开始相加,然后修改第一个字符串的每一位字符。如果有进位就用boolean变量保存然后修改该位的值为相加和的余数,如果没有进位就直接把该位的值改为和。循环结束后判断首位字符,如果是0就去除。
这个题之前做过,网上可能有更好的方法。在面试时我忘了最高位补0导致进位时出现了一点小bug。好在面试官说我思路是对的,还不错。
13.什么时候可以开始实习
我现在读大三,学习还有一门必修课,所以我得7月份才能去。
14.那你大四上可以实习吗
我大四没有课,可以实习很长时间,大四下留两个月回学习做毕业设计就好。
15.你有什么想要问我的吗
我:如果我有幸得到了这次机会,在去实习之前的这三个月我需要准备哪些知识与技能,并且实习时我将会负责哪些工作
面试官:每个部门做的工作都不同,比如我是做抖音的,并且工作不固定,你负责的工作只有来了才能确定。现在倒不需要准备什么,首先要保持对Android的兴趣,然后多动手,发现错误改正错误,只有改正错误才是真正的学习。
我:请您对我这次面试做个点评吧,给我一些改进的建议
面试官:你Java基础挺好的,算法也不弱,但也不是特别强,这个不好说哈哈哈。
小结
这次应该是都面完了,面试官说要我接下来保存手机畅通,有消息了HR会联系。希望HR给我的是惊喜而不是惊吓吧2333。这次面试整体还是挺不错的,就是第二个算法题写的出了点小纰漏。接下来不管有没有好消息都继续加油吧。