美文网首页
面试题复习(二)

面试题复习(二)

作者: 垂直居中的句号 | 来源:发表于2021-04-25 22:23 被阅读0次

    1.list有序,可重复,允许多个null

    set无序,不可重复,允许一个null

    2.arraylist 动态数组,连续的内存存储,通过下标访问。

    扩容机制,当超出数组长度后,将老数组拷贝到新数组,插入时如果不是尾插法会复制移动元素。当指定容量后,尾插法插入元素,性能提升会比linkedlist好。

    linkedlist是链表结构,分散在内存中,遍历必须用迭代器。适合做数据插入和删除。

    3.hashmap线程不安全,JDk8当链表高度为8,数组长度超64时链表转换为红黑树。

    hashtable线程安全,是全局锁。不允许key,value为null.

    concurrenthashmap  是分段锁

    1.7reentrantlock+segment+hashentry

    一个segment中有一个hashentry数组,一个hashentry里有一个链表结构。

    元素查询时是二次hash,第一次找到segment,第二次hash定位链表所在的头部。

    对每个segment加锁时,不影响其他segment。

    get方法不加锁,volatile保证可见性。

    1.8synchronized+CAS+NODE+红黑树

    数组和node的val和next都用volatile修饰,保证可见性。

    读不加锁,替换查找赋值加cas锁.

    锁只锁了链表的头部,不影响其他元素,锁粒度更细,效率更高。

    扩容时阻塞所有的读写操作,并发扩容。

    4.IOC容器

    (1)先配置需要扫描的包路径

    (2)定义注解,和配置文件读取的注解

    (3)从配置文件读取需要扫描的包路径,将所有的.class结尾的文件加到一个set集合存储

    (4)遍历set,获取类上的注解,并交给IOC容器,定义一个安全的map来存储对象。

    (5)遍历这个IOC容器获取每个类的实例,判断里面有依赖其他类的实例,然后注入。

    5.字节码,提高了执行效率,实现了跨平台。

    Java源代码经过编译器变成字节码,jvm虚拟机通过解释器,将字节码变成机器可执行的二进制机器码,程序运行。

    6.Java类加载器

    bootstrapclassloader,是extclassloader的父类加载器,加载%Javahome%/lib下的jar包和class文件。

    extclassloader是APPclassloader的父类加载器,负责加载%Javahome%/lib/ext下的jar包和class文件。

    APPclassloader自定义加载器的父类,负责加载classpath下类文件,系统类加载器,线程上下文加载器。

    继承classloader实现自定义加载器。

    7.双亲委派

    向上委派,查找缓存,有则返回,没有继续向上,委派到顶层,还是没有则到加载路径中查找,向下查找,查找加载路径,有则加载返回,无,则继续向下查找。

    好处,为了安全性,避免用户自定义编写的类动态替换Java中的一些核心类。

    同时避免了重复加载。

    jvm区分不同的类,不仅根据类名,还有加载路径。不同加载器加载出的类就是不同的两个类。

    相关文章

      网友评论

          本文标题:面试题复习(二)

          本文链接:https://www.haomeiwen.com/subject/trwjrltx.html