博彦科技面试2-10

      1. 什么是反射,怎么用的,为什么要用反射,哪里用到过?
        § 反射:在运行状态下,对于一个类,可以知道这个类的所有属性和方法;对于一个对象,可以调用这个对象中的所有方法和属性。这种动态获取类的信息和动态的调用对象的方法和属性的机制叫做java语言的反射机制。
        § 反射其实也就是创建对象,不过反射是在运行状态下创建的对象,是动态的。
        § IOC容器用反射去创建bean对象,注解也使用的反射机制。
    2. hashmap怎么扩容的,hash冲突怎么解决。
        § hashmap采用的是数组+链表的数据结构,因为数组是固定长度的,所以要扩容。
        § hashmap的初始容量是16,扩容因子0.75,也就是hashmap容量达到12时,就会扩容,
        16*2=32,第一次扩容后,容量变为32.
        哈希冲突:同一个key计算出的hash值可能是一样的,就会引起hash冲突。发生哈希冲突后,采用链表加红黑树存储元素,一个哈希桶中的链表大于8时,链表转为红黑树,小于6时,又转为链表。红黑树是为了解决hashmap发生hash冲突元素过多导致读写性能太差的时候才用的。
    3. 线程池的几种创建方式,有什么区别
    4. Executors创建线程池的方式可能会发生什么问题?
        § newSingleThreadExecutor:单例线程池,只有一个核心线程,核心线程满了,将任务放在队列中,队列默认是MAX_VALUE无限大,队列任务过多,会发生OOM
        § newCachedThreadPool:缓存线程池,也就是可以需要创建线程的线程池,核心线程为0,非核心线程空闲60s被回收,非核心线程默认MAX_VALUE,无穷大,如果非核心线程过多,会发生oom。
        § newFixedThreadPool:固定核心线程数的线程池,非核心线程默认最多创建一个,阻塞队列默认MAX_VALUE,队列任务过多可能会发生OOM.
        § 为什么任务过多先存在队列中,再创建核心线程?
            因为线程的频繁创建和销毁会获取全局锁,导致其他线程不可用。频繁的创建销毁线程对内存的消耗比较大。
    5. 为什么核心线程数满了,先用缓存队列再去创建新的线程
        因为线程的频繁创建和销毁会获取全局锁,导致其他线程不可用。频繁的创建销毁线程对内存的消耗比较大。
    6. springioc是怎么实现的?
        beanFactory创建的,底层采用反射+工厂模式实现的。
    7. spring的作用域,单例是线程安全的吗
        spring五大作用域:
        Singleton:容器中只创建一个bean,bean以单例的方式存在
             Prototype:每次从容器中调用bean时,都会返回一个新的实例,相当于每次都会执行一        
                次new ,每次获取的对象都不是同一个对象。
        Request:每次http请求都会创建一个bean
        Session:同一个http session共享一个bean,不同session共享不同的bean
        Globalsession:一般用于portlet应用环境
            后面三个都是用在web环境,只能用于web的ApplicationContext环境。
        单例线程是否安全:
            多线程下,如果一个单例对象带有状态,也就是说它的成员变量存储数据,就是线程不安全的,如果对象不带状态就是安全的。
    8. 强引用、弱引用、虚引用、软引用?
        ▪ 强引用:new的对象都是强引用,最多的一种引用,即使即将发生oom也不会对对象进 行回收。
        ▪ 软引用:还有用但是不必要的对象,在系统即将发生内存溢出时会回收。
        ▪ 弱引用:一个虚引用的声明周期,最多持续到下一次垃圾回收之前,是没有用的对象。
        ▪ 虚引用:最弱的引用无法根据一个虚引用来取得对象的实例,设置虚引用的目的是这个对象被回收时收到一个系统的通知
    9. threadlocal和volitile,threadlocal是什么引用?
    10. @Autowired和@Resource的区别,如何接口有多实现,@Autowired可能会发生什么问题
        @Autowired是根据类型注入的,如果一个接口有多个实现类可能会发生问题
    11. springaop切面怎么定义和实现的
        首先要有一个通知类,然后要有一些需要通知的方法,也就是切入点,在用切入点表达式来建立通知和切入点之间的关系,是一种面向切面编程的思想,采用的动态代理模式,是在不改变原始方法的基础上,对原始方法进行增强。
    12. springboot如何实现自定义的start
    13. springboot多配置文件怎么处理的
        可能会包含测试环境、开发环境、生产环境等多个环境。每个环境都包含了各自的ip和端口号,可以直接配置在一个yml文件中,采用---分割性分开。用profiles标签对配置进行起名作区分,如果使用哪个环境,就设置为active状态。也可以采用命令的方式选择使用哪个环境。
    14. redis的分布式锁
    15. 介绍一下jvm,垃圾回收机制是怎么样的?
    16. 双亲委派模型

你可能感兴趣的:(面试,java)