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;
}
}
今天第一次面试,就四个字: