每日三省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

 

以上是关于每日三省Java的主要内容,如果未能解决你的问题,请参考以下文章

前端面试每日 3+1 —— 第772天

前端面试每日 3+1 —— 第701天

前端面试每日 3+1 —— 第693天

前端面试每日 3+1 —— 第869天

前端面试每日 3+1 —— 第803天

前端面试每日 3+1 —— 第736天