每日三省Java
Posted morningao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日三省Java相关的知识,希望对你有一定的参考价值。
1、集合
- ArrayList,基于数组Object[] elementData实现,因为是连续内存,所以使用native方法System.arraycopy执行扩容操作,1.5倍扩容
- 迭代器模式,定义Iterable接口表示“可迭代”,Collection extends Iterable,List、Set等实现类各自实现Iterable定义的iterator()方法,实现从外部迭代Collection
- HashMap,基于Node<K, V>数组,通过hash算法直接找到数据进行读写操作,put/get的时间复杂度都是O(1),如果hash结果相同但equals结果不同,则判定为发生了hash冲突,用链地址法解决hash冲突,1.8新增了红黑树,2倍扩容,触发rehash后原数组不释放,实际占用内存会是3倍,所以应尽量避免触发rehash
- LinkedHashMap,按插入顺序有序的HashMap,extends HashMap,内部的Entry也是继承了HashMap.Node,增加before、after两个指针,put逻辑复用了HashMap的put逻辑,额外实现了afterNodeInsertion来操作before、after,put/get的时间复杂度也都是O(1)
- TreeMap,基于红黑树实现,通过root节点 Entry<K,V> root 来操作树,put/get的时间复杂度都是O(logN),按key值大小有序,优先使用TreeMap的成员变量comparator做key值比较,comparator为空的时候使用key的compareTo方法做比较,如果key对象没有实现Comparable将会报错
- ConcurrentHashMap,并发安全的HashMap,1.7使用分段Lock,1.8使用CAS+synchronized,Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
2、多线程&锁
- 引入多线程的原因,CPU和内存、磁盘的性能差异较大,为了尽可能的挖掘CPU的性能,引入多线程
- 多线程操作同一个数据会导致更新丢失等线程安全问题,引入锁解决线程安全问题
- Java线程的生命周期,waiting和block、sleep的区别
- synchronized,JVM实现,可重入、非公平,基于Object的monitor,不需要额外的释放锁操作
- Lock,JDK实现,CAS乐观锁,可重入,默认非公平,基于AQS,策略可选,基于Condition实现wait/notify机制,一个锁可以创建多个Condition,更灵活
- volatile,
3、线程池
框架图,ThreadPoolExecutor, Future, Executors等
ThreadPoolExecutor的构造参数:
corePoolSize, 核心线程数
maximumPoolSize, 最大线程数,任务队列也满员之后才会按此限制继续创建线程
workQueue, 任务的阻塞队列。若线程池已经被占满,则该队列用于存放无法再放入线程池中的Runnable
keepAliveTime, 线程存活时间。当线程数大于core数,那么超过该时间的线程将会被终结
threadFactory, 创建线程的工厂类
handler, 队列满载后的抛弃策略
4、JVM
- 堆区,存放Object实例,Object头部记录了对象的age、monitor等信息,整个堆区划分为Old+Young(Eden+S1+S2),有各自的GC策略
- 栈区,一个线程一个栈,栈帧描述的是方法的执行信息,局部变量表、方法返回地址等信息,线程太多会导致OOM
- 方法区,存放class信息、静态变量、常量。类加载机制:装载(双亲委派ClassLoader)、链接、初始化(静态变量、常量)
- 程序计数器,唯一没有规定OOM的区域,每个线程有自己的程序计数器
5、spring
IOC、AOP,反射原理,jdk动态代理、cglib的动态代理的原理
spring启动过程,bean的生命周期,filter和intercept的区别,factorybean和beanfactory,事务的传播机制与隔离级别,事务实现原理
6、网络编程
NIO,同步/异步、阻塞/非阻塞,
netty,
thrift,
11、mysql
12、Redis
13、Zookeeper
CAP原则,zookeeper在CAP中的取舍,消息的读写原理、选举机制、适用场景;
14、kafka
!-- p.p1>
以上是关于每日三省Java的主要内容,如果未能解决你的问题,请参考以下文章