1.1小米Android(java方向)_一面_2020.9.23

1.1小米Android(java方向)_一面_2020.9.23.md

synchronized修饰static方法普通方法的区别

  • 在static方法前加synchronizedstatic:静态方法属于类方法,它属于这个类,获取到的锁,是属于类的锁。
  • 在普通方法前加synchronizedstatic:非static方法获取到的锁,是属于当前对象的锁。
  • 结论:类锁和对象锁不同,当同步代码块和同步函数使用相同的锁时,那么数据就会正常输出,而使用不相同的锁时,由于不同步,所以数据错乱。

wait(),sleep()

https://www.cnblogs.com/loren-Yang/p/7538482.html

  • wait继承自Object类,sleep继承自Thread类
  • wait释放锁,sleep不释放锁
  • wait,notify和notifyall只能在同步控制方法或同步控制块里使用,sleep可以在任何地方使用
  • sleep必须捕获异常,wait、notify、notifyAll不用捕获异常
  • sleep是一个静态方法,只对当前对象有效(通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程)
  • sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
  • wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生

new Integer(123) 与 Integer.valueOf(123);

  • new Integer(123)每次都创建一个新对象
  • Integer.valueOf(123)会先判断是否在缓存中,如果在的话就直接返回缓存池中的内容,如果没有才new一个新的对象

java的强弱软引用分别指什么

https://www.cnblogs.com/blueskyli/p/9155106.html

  • 强引用:直接new得到的对象,宁愿抛出OutOfMemoryError错误都不会回收具有强引用的对象。
  • 软引用:当内存不足时JVM会回收该对象。用途:对象缓存。
  • 弱引用:当JVM进行垃圾回收时,无论内存是否充足,都会回收。gc运行时即终止,用途:对象缓存。
  • 虚引用:如果一个对象只有虚引用,就和没有任何引用一样,任何时候都能被垃圾回收。

如何stop一个线程任务. 如copy文件

https://blog.csdn.net/weixin_30359021/article/details/95643427

  • 异常法:try-catch中抓取InterruptedException,在try中判断if(this,interrupted()),抛出新异常
    try { 
            for(int i=0; i<500000; i++){ 
                if(this.interrupted()) { 
                    System.out.println("线程已经终止, for循环不再执行"); 
                    throw new InterruptedException(); 
                } 
                System.out.println("i="+(i+1)); 
            } 
            System.out.println("这是for循环外面的语句,也会被执行"); 
        } 
        catch (InterruptedException e) { 
            System.out.println("进入MyThread.java类中的catch了。。。"); 
            e.printStackTrace(); 
        }
  • 在sleep中停止
    try { 
            System.out.println("线程开始。。。"); 
            Thread.sleep(200000); 
            System.out.println("线程结束。"); 
        } catch (InterruptedException e) { 
            System.out.println("在沉睡中被停止, 进入catch, 调用isInterrupted()方法的结果是:" + this.isInterrupted()); 
            e.printStackTrace(); 
        } 
  • stop()方法,暴力停止
    抛出java.lang.ThreadDeath异常
    使用stop()释放锁将会给数据造成不一致性的结果。
    不建议在程序张使用stop()方法。
  • 使用return停止线程
    while (true){ 
            if(this.isInterrupted()){ 
                System.out.println("线程被停止了!"); 
                return; 
            } 
            System.out.println("Time: " + System.currentTimeMillis()); 
        } 

内存泄露, 内存溢出

  • 内存溢出就是内存不够,需要的超过现在拥有的
  • 强引用所指向的对象不会被回收,可能导致内存泄漏,虚拟机宁愿抛出OOM也不会去回收他指向的对象,内存泄漏次数多了就会导致内存溢出。

一个链表,检测是否有环,有环的计算下环的大小

https://leetcode-cn.com/problems/linked-list-cycle-lcci/solution/kuai-man-zhi-zhen-zheng-ming-bi-jiao-yan-jin-by-ch/
可能是整个链表是环,可能是一段链表是直的,另一段成环。

  • 一个慢指针指向当前节点的next节点,一个快指针指向当前节点next节点的next节点,两者如果能相遇,则有环
  • 环的大小可能没法求吧,,,,,除了自己走一圈没有查到好的方法
  • 可以求环的入点
    设环到入点的距离是m,环的长度是n,快慢指针相遇的点到入环点距离为y
    慢指针必然在进入环后未到一圈的情况下碰到快指针(只要进环就成了追击问题,幻想比你跑的慢一倍的同学在操场上比你晚进门,无论你在哪个位置,你必然在一圈内碰到他),快指针运行环数不一定(想象一下100个链表,只有最后4个成环的情况)
    慢指针走了m+y,快指针已经在环上跑了x圈(大于等于零的整数),又因为快的比慢的多走了一倍,所以2*(m+y)=x*n+m+y,整理后得:m=x*n-y
    现在让指针1从起始点走,指针2位置不变,两个指针改为每次都走一步,当指针1走到m的时候,指针2走了x*n-y(见上式),理解一下就是当指针1入圈的时候,指针2也走到了起始点,不理解就自己画。

已知一个机场所有飞机的起飞时间和降落时间,如何能够快速的查询某个时间点在空中的飞机数?

没有查到相同的题,我不知道除了按降落时间排序一个个往下找之外还有什么办法,但是面试官感觉并不满意。

今天(2020-9-23)是今年中的第几天.

输入: 3个int,( 年,月,日)
输出: 当年的第几天
int dayOfYear(int year, int month, int day){}

public class Main {
    public static void main(String[] args) {
        System.out.println(dayOfYear(2020,9,23));
    }
    public static int dayOfYear(int year, int month, int day){
        int a[]=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
        if(year%100==0&&year%400!=0){
            a[1]=28;
        }
        else if(year%400==0||year%4==0){
            a[1]=29;
        }
        int ans=0;
        for(int i=0;i<month-1;i++){
            ans+=a[i];
        }
        ans+=day;
        return ans;
    }
}

今天第一次面试,就四个字:

我是傻逼。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这个主题的内容之前分三个篇幅分享过,导致网络上传播的比较分散,所以本篇做了一个汇总,同时对部分内容及答案做了修改,...
    JavaQ阅读 23,785评论 9 264
  • 最近因为忙于工作,没时间整理,本篇是下班后晚上抽空整理的,文中部分答案本来是想自己好好整理一份的,但是时间真的很紧...
    JavaQ阅读 10,009评论 27 241
  • 面试专题我放在git上了,地址Github 欢迎fork然后一起更新 Java基础点 0,面对对象OOP和面对过程...
    hloong阅读 852评论 0 3
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,609评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,910评论 4 1