java应用篇近期面试总结

zookeeper系列也接近尾声了,这里笔者希望在2月份再发表几篇文章,笔者从去年12月下半个月开始面试,接触了很多大厂,被问了很多问题,笔者也在面试过程中对其做了总结和分类。以面试官的口吻对各个知识点进行面对面的交流。有些笔者是后面给的答案所以并不代表笔者当时的回答,所以要继续加油了。上一篇是:性能优化与调优近期面试总结,本章则总结Java应用方向上的面试内容,包括很多方面因此分为上下两章。

四、java应用篇(上)
1.java调用Python怎么实现(主京东)
答:
1.直接通过Runtime进行调用
2.通过Jython调用
3.HTTP调用

2.java容器中请问concurrentHashMap在1.7与1.8中的区别和实现
答: java7的chm中的元素中是基于链表+数组的,然后使用分段锁(segment数组+Lock)进行并发访问控制,
java8是基于(数组+链表/红黑树)实现的,如果超过8个元素则转换为红黑树.否则还是链表结构
(准确的来说是数组+链表,数组+红黑树).java 8取消了分段锁,使用CAS和Synchrnazid实现并发访问控制的。

3.ConcurrentHashMap怎么提高并发访问性能的?
答:这里涉及到jdk版本变更的问题?所以一开始就应该表达chm是hm的并发安全版本,这里笔者认为有3大原因:
1.分段锁的思想,读写可以达到并行执行
2.底层数据结构,数组+链表,
3.在get/put等实现中1.7使用lock的方式,
1.8使用synchronized 关键字同步代码块和 cas操作提高访问性能,1.8中取消了分段锁的机制

4.Java并发包下的线程池有用到吗?有哪些
答:有,1.使用ThreadPoolExecutor创建线程池执行异步任务
2.使用Executors.scheduledPool创建带有周期性执行任务的线程池
3.使用Fork/Join框架对导出报表进行并行转换

5.Java中的CycleBarrier用过吗?原理是啥
答:没用过,原理(恶补):CycleBarrier用于一组线程之间的相互等待,
让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。
构造方法中有个计数器,当执行await()方法的时候计数器加1,直到加到线程数,然后进行下一步,可以同过reset方法进行重置,从而达到可重用的目的。

6.Java中的ThreadLocal在项目中用到过吗?怎么用?
答:用到过,使用ThreadLocal对方法的执行时间进行计算,
基于aop的切面编程中将执行方法之前的时间戳记录在ThreadLocal中,执行之后取出与当前时间戳相减即可得到真正的执行时间。

7.说说什么是java类加载
答:Java的类加载是Java程序编译执行过程中的一个步骤,如果一个类还没被加载或者需要加载则通过类加载器加载到内存中并进行验证解析初始化,然后产生与所加载类对应的Class对象。

8.说说双亲委派模型是怎么委派的
答:当需要加载一个类的时候当前的类加载会委托给父类加载器(系统类加载器),如果父类加载器加载不到就委托给根类加载器加载,加载不到再自己加载。

9.说说双亲委派模型的双亲是什么
答:这里的双亲其实不是现实生活中的双亲,而是一种泛指或者比喻,双亲在Java类加载模型中指的是系统类加载器和根类加载器。但是这里
不是继承的意思,双亲委派模型中的实现是以组合的形式起作用的。

10.Syncronized关键字在1.8中的优化有哪些
答:1.无锁 2.偏向锁 3.轻量级锁 4.重量级锁
5.自旋锁 6.自适应自旋锁

11.了解java GC吗?讲讲GC原理和算法
答:了解一些,Java应用程序执行过程中通过JVM管理内存,动态申请内存和释放内存,不需要程序员显示申请和释放,其原理就是JVM通过
对对象的跟踪和引用的情况进行判断,以及当前应用程序占用的内存情况来回收内存,不管哪种方式都会跟引用类型有关,比如有强引用,软引用,弱引用,虚引用。
由于JVM的内存结构或者内存模型的不同以及对象占用空间的分布等有不同的算法,比如标记-清除,标记-整理,复制算法,分代收集算法

12.JVM的内存结构(内存模型JMM)有哪些
答:堆区,程序计数器,本地方法栈,虚拟机线程栈,元数据区/永久代,方法区

13.JVM中怎么判断对象是否需要进行回收?
答:通过可达性分析法和引用计数法判断,可达性分析法是

14.CMS和G1哪个会引起内存碎片?
答:CMS

你可能感兴趣的:(我的面试笔试专题)