抽象类和接口有什么区别
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如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道面试题——基础篇①](http://p2.ttnews.xyz/loading.gif)
关注,私信获取更多Java技术资料免费分享
![大厂最爱问的97道面试题——基础篇①](http://p2.ttnews.xyz/loading.gif)
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多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。
举个栗子
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多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()方法恢复)
关注,私信获取更多Java技术资料免费分享
关于面试题系列,每日更新。
完整系列面试题+Q2118797017
面试目录
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
关注,私信获取更多Java技术资料免费分享
閱讀更多 Java小優秀 的文章