1.简述HashMap实现原理
每次新建一个 HashMap 时,都会初始化一个 table 数组。table 数组的元素为 Entry 节点;
保存数据的过程为:首先判断 key 是否为 null,若为 null,则直接调用 putForNullKey 方法。若不为空则先计算 key 的 hash 值,然后根据 hash 值搜索在 table 数组中的索引位置,如果 table 数组在该位置处有元素,则通过比较是否存在相同的 key,若存在则覆盖原来 key 的 value,否则将该元素保存在链头(最先保存的元素放在链尾);若没有,直接保存
2.简述HashSet实现原理
HashSet 是基于 HashMap 来实现的,操作很简单,更像是对 HashMap 做了一次“封装”,而且只使用了HashMap的key来实现
Set 相当于在 map 中存储 key 为 set 的值,map 中的值为一个虚拟[dummy]值value: Object(id=78)
3.数组和List的转换
数组-->List:
List-->数组:
4.Queue:线性结构 先进先出
1)offer() add():添加;如果想在一个满的队列中加入一个新元素,后者会抛出一个 unchecked 异常,而前者会返回 false
2)peek() element():在不移除的情况下返回队头;在队列为空时,前者返回null,后者会抛出 NoSuchElementException 异常
3)poll() remove():移除并且返回对头;在队列为空时,前者返回null,后者会抛出 NoSuchElementException 异常
5.ListIterator和 Iterator
5.ListIterator和 Iterator
.ListIterator:.add();hasPrevious()和 previous()方法,可以实现逆向(顺序向前)遍历;可以定位当前的索引位置,nextIndex()和 previousIndex()可以实现;可以实现对象的修改,set()方法可以实现;
Iterator:不可添加;不可以逆向遍历;无法定位;只能遍历,不可修改;
6.并行和并发
并发:指两个或多个事件在同一个时间段内发生。
并行:指两个或多个事件在同一时刻发生(同时发生)。
7.线程三大特性 1)原子性:在执行一个或者多个操作的过程中,要么全部执行完不被任何因素打断,要么不执行,保证数据一致,线程安全
2)可见性:当多个线程访问同一个变量时,一个线程修改了变量的值,其他的线程能立即看到
3)有序性:程序的执行顺序会按照代码先后顺序进行执行,一般情况下,处理器由于要提高执行效率,对代码进行重排序,运行的顺序可能和代码先后顺序不同,但是结果一样
8.守护线程
8.守护线程
new Thread().setDaemon(true);
专门服务于其他线程,如用户自定义线程都执行完毕,main线程也执行完毕,则jvm停止运行,守护线程也停止执行
又被称为“服务进程”“精灵线程”“后台线程”,是指在程序运行是在后台提供一种通用的线程,这种线程并不属于程序不可或缺的部分。 通俗点讲,任何一个守护线程都是整个 JVM 中所有非守护线程的“保姆”。
9.线程创建方式
1)extends Thread 类
定义子类,重写run方法--》创建子类实例--》调用start(),启动线程
2)implements Runnable 接口
定义子类,重写run方法--》创建子类实例,依此实例作为 Thread 的 target 来创建 Thread 对象--》调用start(),开启线程
3)通过Callable和Future创建线程
创建 Callable 接口的实现类,并实现 call()方法,该 call()方法将作为线程执行体,并且有返回值。
创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象
的 call()方法的返回值。
使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。
调用 FutureTask 对象的 get()方法来获得子线程执行结束后的返回值。
10.Runnable Callable
1)Runnable:执行方法是run()方法;无返回值;异常内部消化
2)Callable:执行方法是call()方法;存在返回值;可以抛出异常
11.sleep() wait()
12.什么是死锁
指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进
形成死锁的四个必要条件(缺一不可):
互斥条件:一个资源每次只能被一个进程使用,若有其他进程请求此资源,则需等待
请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放
不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)
循环等待条件:若干进程间形成首尾相接循环等待资源的关系
13.synchronized volatile
13.synchronized volatile
14.synchronized ReentrantLock