今年的6月份又到了,又是一年一度的毕业季,可是你真的作好准备了吗?。应届毕业生不少,怎么让你本身在这群人中脱颖而出呢?那你就要作万分的准备,不打没准备的仗,下面小猿圈java讲师为你总结了常见的java面试题,但愿对你的面试有所帮助。java
1.list中存放可重复字符串,如何删除某个字符串面试
调用iterator相关方法删除数组
倒删,防止正序删除致使的数组重排,index跳过数组元素问题多线程
2.concurrenthashmap为什么读不用加锁app
jdk1.7线程
1)HashEntry中的key、hash、next均为final型,只能表头插入、删除结点对象
2)HashEntry类的value域被声明为volatile型排序
3)不容许用null做为键和值,当读线程读到某个HashEntry的value域的值为null时,便知道产生了冲突——发生了重排序现象(put设置新value对象的字节码指令重排序),须要加锁后从新读入这个value值队列
4)volatile变量count协调读写线程之间的内存可见性,写操做后修改count,读操做先读count,根据happen-before传递性原则写操做的修改读操做可以看到内存
jdk1.8
1)Node的val和next均为volatile型
2)tabAt和casTabAt对应的unsafe操做实现了volatile语义
3.ContextClassLoader(线程上下文类加载器)的做用
越过类加载器的双亲委派机制去加载类,如serviceloader实现
使用线程上下文类加载器加载类,要注意保证多个须要通讯的线程间的类加载器应该是同一个,防止由于不一样的类加载器致使类型转换异常(ClassCastException)
4.如何结束一个一直运行的线程
使用退出标志,这个flag变量要多线程可见
使用interrupt,结合isInterrupted()使用
5.如何从FutureTask不阻塞获取结果
get(longtimeout,TimeUnitunit),超时则返回
轮询,先经过isDone()判断是否结束,而后调用get()
6.线程池从启动到工做的流程
刚建立时,里面没有线程
调用execute()添加任务时:
1)若是正在运行的线程数量小于核心参数corePoolSize,继续建立线程运行这个任务
2)不然,若是正在运行的线程数量大于或等于corePoolSize,将任务加入到阻塞队列中
3)不然,若是队列已满,同时正在运行的线程数量小于核心参数maximumPoolSize,继续建立线程运行这个任务
4)不然,若是队列已满,同时正在运行的线程数量大于或等于maximumPoolSize,根据设置的拒绝策略处理
5)完成一个任务,继续取下一个任务处理
6)没有任务继续处理,线程被中断或者线程池被关闭时,线程退出执行,若是线程池被关闭,线程结束
7)不然,判断线程池正在运行的线程数量是否大于核心线程数,若是是,线程结束,不然线程阻塞。所以线程池任务所有执行完成后,继续留存的线程池大小为corePoolSize
7.阻塞队列BlockingQueuetake和poll区别
poll(time):取走BlockingQueue里排在首位的对象,若不能当即取出,则能够等time参数规定的时间,取不到时返回null
take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻塞直到BlockingQueue有新的对象被加入
小猿圈讲师总结java面试题就到这里了,看到这篇文章的小伙伴们必定要好好看看这篇面试题,都是老师用心总结的,最后祝愿各位大学生找到一份满意的工做,加油!