第一篇CSDN博客,记录最近准备暑期实习的种种,不定期更新。
前几天重新看完Java基础,深深感受到自己还有很多东西需要掌握,今天开刷网上找来的葛总面试笔试题,再次惨死,这里将今天刷到的一些比较有意义的题记录下来:
1.HashMap的底层实现?如何解决Hash冲突?为什么HashMap不安全?如何保证HashMap的安全性?concurrentHashMap的实现原理?
HashMap的底层实现是通过Hash表实现的,解决Hash冲突的方式共有4种
HashMap对于多线程是不安全的,应为读取和写入的操作并没有进行同步,想要保证线程安全,可以使用concurrentHashMap类,concurrentHashMap底层通过将Map分为多个segment(默认为16个),在多线程访问时分别进行上锁去锁的过程,提高了效率,并且保证了同步
2.结束一条线程的方法有哪些?线程的状态是怎样的?interrupt的底层实现原理?
停止线程的办法有3种:
通过stop方法停止线程是不安全的,应为stop方法会造成无法估计的错误,这一点和resume方法一样,所以在新的jdk中,这两个方法已经不被推荐使用了。
interrupt底层实现原理:
这里需要介绍一下Java中的中断机制,Java中的中断机制是一种协作机制,也就是说当我们使用interrupt方法时,并不是立即就将线程中断了,而是需要等待线程自己对这个中断进行相应。而interrupt的底层实现原理就是这样的,针对于每个线程都有一个中断的标志位,当线程处于非阻塞的状态时,调用interrupt方法将使得中断标志位置为true,而当线程处于非阻塞状态时。中断标志位同样被置为true,但是由于sleep,wait等方法会消耗掉这一次中断并且抛出异常。所以在try语句块中获取到的标志位仍为false。
3.什么是BIO,什么是NIO?
BIO:同步阻塞式,每一个请求都有一个线程为其提供,这种模式常常需要一个主线程进行不断的轮训以接受请求,并且没接收到一个请求,便开启一个新的线程为其进行服务,这样的模式有一个很显著的缺陷,如果一个请求不需要任何处理,这样造成了不必要的线程开销。在这中模式下,服务器能够服务的线程数量是有限的。
NIO:同步非阻塞式,这种模式的关键是要实现一个反应器,反应器的作用是当请求中有需要处理的任务时在通知服务器开启线程来处理这个任务,否则不通知服务器。在这这种模式下,往往需要一个线程进行轮训接受请求,但是却不需要为每一个请求创建新的线程,这样能够有效的减少线程的开销,同时提高并发性。
4.如何在Android的4大组件之间进行数据传输?
5.缓存算法处了LRU还知道那些,包括LRU一起解释一下原理:
6.Java中有内存泄漏嘛?什么情况会造成内存泄漏?:
存在,C/C++中内存泄漏的出现主要有两种原因
在Java中,由于采用了垃圾回收机制,第一种内存泄漏不可能产生,主要的内存泄漏原因是第二种。这里举一个内存泄漏的例子:
Vector v = new Vector();
for(int i = 0; i < 100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}
运行上述代码,一旦发生GC,object对象并不会被回收,应为在GC时,会发现vector持有对object的引用,所以不清除object。这样就造成了内存泄漏。
内存泄漏的原因是由于GC判断内存块任为可用的代码,不进行清除。这里简单介绍一下GC的几种算法:
7.ANR的产生原因,如何定位?:
常见的ANR原因分为3种:
ANR一般有三种类型:
1:KeyDispatchTimeout最为常见ANR出现原因,主线程5秒无响应)
按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) –小概率类型
Service在特定的时间内无法处理完成
定位方式推荐一个博文吧,说来话长,传送门点这里
8.简单描述一下观察者模式,原生jdk中的观察者模式有什么缺陷:
观察者模式,实现一个被观察者的父类,声明几个用于更新和获取状态的抽象函数。维护一个观察者的集合。被观察者需要继承该父类。当状态更新时通过更新函数通知每一个观察者。实现一个观察者的接口,其中包含用于传递更新的函数,观察者需要实现这个接口。
原生jdk中的观察者模式的缺陷:原生jdk中的观察者模式是支持多个观察者对一个被观察者的多对一的关系的,很明显当关系模式反过来时,既多个被观察者对一个观察者时就无法支持了。
9.描述一下AIDL,AIDL有什么缺陷: