1.说一说Java提供的常见集合?(画一下集合结构图)
在 java 中提供了量大类的集合框架,主要分为两类:第一个是Collection 属于单列集合,第二个是 Map 属于双列集合 在Collection 中有两个子接口 List 和 Set 。在我们平常开发的过程中用的比较多像 list 接口中的实现类ArrarList 和 LinkedList 。 在 Set 接口中有实现类 HashSet 和TreeSet。在map 接口中有很多的实现类,平时比较常见的是 HashMap 、 TreeMap ,还有一个线程安全的map:ConcurrentHashMap
2.ArrayList底层是如何实现的?
底层是数组
当创建ArrayList对象时,会初始化一个默认大小的数组,通常是10个元素的大小。随着元素的添加,如果数组容量不够,ArrayList会自动进行扩容,一般会按照一定的策略增加数组的长度(如原长度的1.5倍)。这样可以保证在大部分情况下,ArrayList不需要频繁进行扩容操作。
3.如何实现数组和List之间的转换
数组——>List Arrays.asList()方法 底层指向同一个内存地址
List——>数组 list.toArray()方法 底层是拷贝
4.HashMap的实现原理
底层是数组+链表|红黑树,添加元素时,对key进行key进行二次hash,确认元素的下表,
如果key相同替换,不同就放到链表或者红黑树。
JDK1.8 之后采用数组 + 链表 + 红黑树,链表长度大于 8 且数组长度大于 64 则会从链表转化为红黑树
5.HashMap扩容机制
初始化数组长度为16,达到扩容阈值(*0.75)每次扩容都是之前的2倍
6.聊一下并行和并发有什么区别
并发是同一时间应对多件事情的能力并行是同一时间动手做多件事情的能力
7.如果在java中创建线程有哪些方式?
继承Thread类,实现runnable接口,实现Callable接口和线程池
8.runnable 和 callable 两个接口创建线程不同
runnable接口实现run方法无返回值, 只能抛出异常
callable接口实现call方法有返回值 可以抛出,可以捕获
9.线程包括哪些状态,状态之间是如何变化的?
10 .wait 和 sleep方法有什么不同
wait是Object的方法,sleep是Thread的静态方法
sleep到时间就可以唤醒, wait需要被notify唤醒
11.线程池种类
第一个是:newCachedThreadPool 创建一个可缓存线程池,如果线程池长度 超过处理需要,可灵活回 收空闲线程,若无可回收,则新建线程。第二个是:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发 数,超出的线程会在队列 中等待。第三个是:newScheduledThreadPool 创建一个定长线程池,支持定时及周 期性任务执行。第四个是:newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任 务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级) 执行
12.线程池的核心参数有哪些
核心线程数
最大线程数目
线程工厂
拒绝策略
线程生存时间
时间单位
队列
13.线程池的执行原理知道吗
首先判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任 务。如果已经满了,则交给拒绝策略来处理这个任务