抖音Android(Java)研发实习三面面经20190404

自我介绍,项目介绍缓冲一下气氛。

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。这次面试整体还是挺不错的,就是第二个算法题写的出了点小纰漏。接下来不管有没有好消息都继续加油吧。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值