java后台面试题整理及解答(一)java基础篇

 问题链接::http://www.jsondream.com/2016/12/04/java-interview-question.html

 

1.Arrays.sort实现原理和Collection实现原理 

Collection.sort()底层会调用Arrays.sort(),Arrays.sort()底层实现是TimeSort,TimeSort的算法就是先找到已经排好序数据的子序列,然后对剩余部分数据进行排序,然后在合并起来。

2.foreach和while的区别(编译之后) 

while会读一行输入,把它存入某个变量并执行循环体,然后再找其他行的输入,适用于不确定循环次数的情况;foreach是增强for循环,它是逐条读取,在循环开始前会将所有输入全部读入,适用于数组、集合等确定长度的情况;当输入内容非常大的时候foreach会非常占内存。

 

3.线程池的种类,区别和使用场景 

 

a.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

 

b.newFixedThreadPool创建一个定长线程池,可控制线程的最大并发数,超出的线程会进入阻塞队列中等待。

 

c.newScheduledTreadPool创建一个定长线程池,支持定时或者周期性任务执行。

 

d.newSingleThreadPool创建一个单线程化的线程池,它只会用唯一的线程来执行任务,保证所有任务按照指定顺序执行。

4.线程的调度过程 

 

a.当线程池小于corePoolSize时,新提交的任务会创建一个新的线程执行,技术此线程池中有空闲线程;

 

b.当线程池达到corePoolSize时,新提交的任务将被放入workQueue,等待线程池中任务调度执行;

 

c.当workQueue已满,并且maximunPoolSize > corePoolSize时,新提交的任务会创建新的线程执行;

 

d.当提交的任务数超过maximunPoolSize时,新提交的任务将被拒绝;

 

e.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程;

 

f.当线程池中设置allowCoreThreadTimeOut=true时,线程池中corePoolSize线程超过keepAliveTime时也将被关闭;

 

5.线程池如何调优 

 个人觉得比较ok:https://www.cnblogs.com/jianzh5/p/6437315.html

 

6.线程池的最大线程数目根据什么确定 

 

int maxthread = Runtime.getRuntime().availableProcessors() * 25;//最大线程数=cpu个数*25,超过这个值系统运行会不稳定(仅限于服务器,自己的电脑不能达到这个数)。

 

Runtime.getRuntime().totalMemory();// Java 虚拟机中的内存总量

 

Runtime.getRuntime().freeMemory()//Java 虚拟机预留内存

 

Runtime.getRuntime().maxMemory()//Java 虚拟机试图使用的最大内存量

 

计算线程可有使用的内存  理论上:最大内存量- 虚拟机预留内存,实际上:虚拟机中的内存总量-虚拟机预留内存。

 

7.动态代理的几种方式 

jdk动态代理和cglib动态代理。jdk动态代理是有java内部的反射机制实现的,前提是代理类和目标类必须实现统一的接口;cglib动态代理是借助asm来实现的。
8.HashMap的并发问题 

HashMap是线程不安全的,当size超过一定大小需要扩容时,会重新计算hashcode值,在多线程的情况下可能会产生死循环。可以使用HashTable和ConcurrentHashMap。
9.了解LinkedHashMap的应用吗

10.反射的原理,反射创建类实例的三种方式是什么? 

java反射机制实在运行当中,对任意一个类来说,能够知道它的所有属性和方法,都能调用它的任意一个属性和方法。

三种方式:getClass()方式,调用类的静态属性class,Class.forName()。

11.cloneable接口实现原理,浅拷贝or深拷贝 

      https://www.cnblogs.com/tonyluis/p/5778266.html
12.Java NIO使用 

      https://blog.csdn.net/qq_18860653/article/details/53406723
13.hashtable和hashmap的区别及实现原理,hashmap会问到数组索引,hash碰撞怎么解决 

 1.

       https://blog.csdn.net/double2hao/article/details/53411594 

 2.hashmap会问到数组索引,hash碰撞怎么解决 

      1.开放地址法
           开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
           其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
           如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。
           如果di取值可能为伪随机数列。称伪随机探测再散列。
      2.再哈希法
          当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
          比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止
      3.链地址法(拉链法)
          将所有关键字为同义词的记录存储在同一线性链表中。
      4.建立一个公共溢出区
          假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

14.arraylist和linkedlist区别及实现原理 

    arraylist是基于动态数组的数据结构,而linkedlist是基于链表的数据结构;对于查询来说arraylist优于linkedlist,而对于删除和新增则linkedlist更好些。
15.反射中,Class.forName和ClassLoader区别 

    java类加载的过程包括:加载->验证->准备->解析->初始化->使用->卸载,而初始化就是激活java类中静态变量初始化代码和静态代码块,并初始化程序设置的变量值。


    原文作者:Yjf_C-o
    原文地址: http://www.cnblogs.com/YjfDIY/p/9603334.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞