面试题复习(二)

2021-04-25  本文已影响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区分不同的类,不仅根据类名,还有加载路径。不同加载器加载出的类就是不同的两个类。

上一篇下一篇

猜你喜欢

热点阅读