2020-09-15HTXX一面

一、Java基础

1、集合
image.png
  • HashMap底层实现
    数组+链表(JDK1.8引入红黑树,当链表长度超过8时,会将链表转为红黑树)
  • HashMap扩容
    当HashMap中的元素个数超过数组大小*负载因子时,会进行扩容,负载因子默认为0.75。也就是说,默认情况下,数组大小为16,当HashMap中的元素个数超过16*0.75=12时,就会进行扩容,把数组大小扩展为16*2,即原来的2倍。
  • 红黑树性质
    (1)每个节点要么是红色,要么是黑色;
    (2)根节点必须是黑色;
    (3)红色节点不能连续;
    (4)对于每个节点,从该点至叶子节点的任何路径,都含有相同个数的黑色节点;
    在插入和删除时,往往会破坏上述条件(3)和(4),需要通过调整使得树重新满足红黑树的条件。调整可以分为两类:一类是颜色调整,即改变某个节点的颜色;另一类是结构调整,即改变树的结构,结构调整包含两个基本操作:左旋和右旋。
  • TreeMap
    (1)TreeMap底层通过红黑树实现,这意味这containsKey(),get(),put(),remove()都有着log(n)的时间复杂度。
    (2)TreeMap是非同步的,可以通过SortedMap m= Collections.synchronizedSortedMap(new TreeMap<>());包装成同步的。
    (3)TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序,也可以通过构造时传入的比较器。
  • HashSet
    HashSet底层是HashMap
  • ArrayList和LinkedList的区别
    (1)ArrayList的底层是数组,LinkedList底层是双向链表;
    (2)对于随机访问,ArrayList优于LinkedList;
    (3)对于插入和删除操作,LinkedList优于ArrayList;
    (4)LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
2、线程池
image.png
  • Executor,ExecutorService以及Executors的区别
    (1)Executor和ExecutorService是接口,Executors是类;
    (2)ExecutorService接口继承了Executor接口,是Executor的子接口;
    (3)Executor接口定义了execute()方法用来接收一个实现 了runnable接口的对象,而ExecutorService接口中的submit()方法可以接收实现了Runnable和Callable接口的对象;Executor中的execute的方法不返回任何结果,ExecutorService中的submit方法可以通过一个future对象返回运算结果。
    (4)ExecutorService还提供了用来控制线程池的方法,比如调用shutdown方法终止线程。
    (5)Excutors类提供工厂方法用来创建不同类型的线程池,返回类型为ExecutorService。Executors提供四种线程池:newCachedThreadPool,创建一个可缓存线程池,如果线程池长度超过需要,可灵活回收空闲线程,若无可回收,则创建新线程;newFixedThreadPool,创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待;newScheduledThreadPool,创建一个定长线程池,支持周期性任务执行;newSingleThreadExecutor,创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。
  • 线程池生命周期
    绘图1.png

    RUNNING:接收新的任务并处理队列中的任务;
    SHUTDOWN:不接收新任务,但是处理队列中的任务;
    STOP:不接收新任务,不处理队列中的任务,同时中断处理中的任务;
    TIDYING:所有的任务处理完成,有效线程数是0;
    TERMINATED:terminated()方法执行完毕。
  • 自定义线程池
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler);

corePoolSize:核心线程数量。
maximumPoolSize:最大线程数量。
keepAliveTime:空闲线程存活时间。当一个线程处于空闲状态,且当前线程数量大于核心线程数量,那么在keepAliveTime时间后,这个线程将被销毁。
unit:线程存活时间单位。
workQueue:等待队列。ArrayBlockingQueue:基于数组的有界阻塞队列,按FIFO排序;LinkedBlockingQueue:基于链表的无界阻塞

  • 线程池工作流程
    绘图6.png
  • 创建线程的三种方式
    (1)继承Thread类创建线程:a.继承Thread类并重写run方法;b.创建线程对象;c.调用该线程对象的start()方法来启动线程。
class ThreadTest extends Thread{
  @Override
  public void run(){
    //TODO:
  }
};

new ThreadTest().start();

(2)实现Runnable接口创建线程:a.定义一个类实现Runnable接口,并重写该接口的run()方法;b.创建Runnable实现类的对象,作为创建Thread对象的target参数,此Thread对象才是真正的线程对象;c.调用线程对象的start()方法来启动线程。

class RunnableTest implements Runnable{
  @Override
  public void run(){
    //TODO:
  }
}

RunnableTest runnableTest=new RunnableTest();
new Thread(runnableTest,"线程1").start();

(3)使用Callable和Future创建线程:a.定义一个类实现Callable接口,并重写call()方法,该call()方法将作为线程的执行体,并且有返回值;b.创建Callable实现类的实例,使用FutureTask类来包装Callable对象;c.使用FutureTask对象作为Thread对象的target创建并启动线程;d.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

class CallableTest implements Callable{
  @Override
  public Integer call() throws Exception{
    //TODO:
  }
}

CallableTest callableTest=new CallableTest();
FutureTask<Integer> futureTask=new FutureTask<>(callableTest);
new Thread(futureTask).start();
futureTask.get();
3、JVM
  • JVM内存结构
    JVM内存结构可分为:方法区、堆、栈、本地方法栈、程序计数器。方法区和堆是所有线程共享的,栈、本地方法栈和程序计数器是线程私有的。
    image.png


    几乎所有的对象实例都是在堆上分配内存,分为新生代和老年代,新生代又分为Eden区,from区和to区。
    方法区
    用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
    本地方法栈
    本地方法栈和虚拟机栈的作用类似,其区别在于虚拟机栈是为虚拟机执行Java方法服务,而本地方法栈则是为使用到的Native方法服务。
    程序计数器
    程序计数器是一个记录着当前线程所执行的字节码的行号指示器。
  • 如何判断对象是否存活
    引用计数法
    给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1,如果引用失效,计数器的值减1。当计数器的值为0时,表示该对象可以被回收。但存在两个对象相互循环引用的问题。
    可达性分析算法
    将“GC ROOTS”作为起始点,从这些GC ROOTS开始向下搜索,当GC ROOTS到这个对象不可达时,说明这个对象已经不再使用了,可以被回收。
  • 垃圾回收算法
    标记-清理算法
    首先标记出需要清理的对象,然后进行清理。存在内存碎片的问题。
    标记-整理算法
    首先标记出需要清理的对象,然后清除的时候会把所有存活的对象向一端移动,然后清除掉端边界以外的内存。
    复制算法
    把内存分为两部分,每次只使用其中的一部分,当这一部分的内存空间用完了,就把这部分还存活的对象复制到另一部分内存中,然后把之前那一部分的内存空间一次性清理掉。
  • 垃圾回收器
    CMS垃圾回收器
    a. 初次标记:标记GC ROOTS直接引用的对象
    b. 并发标记:标记所有old对象,不会STW
    c. 重新标记:修正第二步的并发标记,会STW
    d. 并发清理:采用标记-清理算法,不会STW
    G1垃圾回收器
    a. 初次标记:标记 GC ROOTS直接引用的对象,会STW
    b. 并发标记:扫描old区,标记不可达对象,不会STW
    c. 重新标记:修正第二步的并发标记,会STW
    d. 标记整理:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343