大厂最爱问的97道面试题——基础篇①

抽象类和接口有什么区别

接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。

说说反射的用途及实现

Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成

员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架

Java反射的主要功能:

确定一个对象的类

取出类的modifiers,数据成员,方法,构造器,和超类.

找出某个接口里定义的常量和方法说明.

创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).

取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.

在运行时刻调用动态对象的方法.

创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.

反射的应用很多,很多框架都有用到

spring 的 ioc/di 也是反射…

javaBean和jsp之间调用也是反射…

struts的 FormBean 和页面之间…也是通过反射调用…

JDBC 的 classForName()也是反射…

hibernate的 find(Class clazz) 也是反射…

反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用

使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。

来源:http://uule.iteye.com/blog/1423512

HashMap 和 ConcurrentHashMap 的区别

ConcurrentHashMap是线程安全的HashMap的实现。

(1)ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上

都用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更

好,而HashMap没有锁机制,不是线程安全的。

(2)HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

HashMap 的工作原理及代码实现

参考:https://tracylihui.github.io/2015/07/01/Java集合学习1:HashMap的实现原理/

ConcurrentHashMap 的工作原理及代码实现

HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,

当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时

间。

ConcurrentHashMap算是对上述问题的优化,其构造函数如下,默认传入的是16,0.75,

16。

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

ConcurrentHashMap引入了分割(Segment),上面代码中的最后一行其实就可以理解为把一

个大的Map拆分成N个小的HashTable,在put方法中,会根据hash(paramK.hashCode())来

决定具体存放进哪个Segment,如果查看Segment的put操作,我们会发现内部使用的同步

机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只

是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个

Map(HashTable就是这么做的),相对于HashTable提高了多线程环境下的性能,因此

HashTable已经被淘汰了。

线程池的几种方式

newFixedThreadPool(int nThreads)

创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数

量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的

线程

newCachedThreadPool()

创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当

需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制

newSingleThreadExecutor()

这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会

创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行

newScheduledThreadPool(int corePoolSize)

创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

举个栗子

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

线程的生命周期

新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态

(1)生命周期的五种状态

新建(new Thread)

当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。

例如:Thread t1=new Thread();

就绪(runnable)

线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队

等候得到CPU资源。例如:t1.start();

运行(running)

线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有

优先级更高的线程进入,线程将一直运行到结束。

死亡(dead)

当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态

等待执行。

自然终止:正常运行run()方法后终止

异常终止:调用**stop()**方法让一个线程终止运行

堵塞(blocked)

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过

去可进入就绪状态。

正在等待:调用wait()方法。(调用motify()方法回到就绪状态)

被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

关于面试题系列,每日更新。

完整系列面试题+Q2118797017

面试目录

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享

大厂最爱问的97道面试题——基础篇①

关注,私信获取更多Java技术资料免费分享


分享到:


相關文章: