1、 什么是多线程&多线程的优点
多线程是指程序中包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行不同的任务。
优点:可以提高cpu的利用率。多线程中,一个线程必须等待的时候,cpu可以运行其它的线程而不是等待,这样大大提高了程序的效率。
2、如何创建多线程
Java 3种常见创建多线程的方式
(1)继承Thread类,重run()方法
(2)实现Runnable接口,重写run()方法
(3)通过创建线程池实现
3、如何创建线程池
Executors提供了线程工厂方法创建线程池,返回的线程池都实现了ExecutorServer接口。
newSingleThreadExecutor
newFixedThreadExecutor
newCachedThreadPool
newScheduledThreadPool
虽然Java自带的工厂方法很便捷,但都有弊端,《阿里巴巴Java开发手册》中强制线程池不允许使用以上方法创建,而是通过ThreadPoolExecutor的方式,这样处理可以更加明确线程池运行规则,规避资源耗尽的风险。
4、ThreadPoolExecutor构造函数参数解析
(1)corePoolSize 创建线程池的线程数量
(2)maximumPoolSize 线程池的最大线程数
(3)keepAliveTime 当线程数量大于corePoolSize ,空闲的线程当空闲时间超过keepAliveTime时就会回收;
(4)unit { keepAliveTime} 时间单位
(5)workQueue 保留任务的队列
5、列举线程安全的Map集合
SynchronizedMap、ConcurrentHashMap
6、StringBuffer和StringBuilder的区别
(1)StringBuffer中的方法大都采用synchronized关键字进行修饰,是线程安全的,效率低。
(2)StringBuilder是线程不安全的,效率高。
7、ArrayList和LinkedList的区别
(1)ArrayList基于动态数据实现,LinkedList基于链表实现,两者都是线程不安全的
(2)ArrayList基于数组,查询快;linkedList基于链表,新增和删除更快
(3)LinkedList不支持高效的随机访问
8、HashMap和HashTable的区别
1)继承的父类不同
HashMap继承AbstractMap类
HashTable继承Dictionary类(已经废弃的类),用比较少
2)是否线程安全
HashMap是线程不安全的效率高,HashTable是线程安全的,效率低。
3)key和value是否允许null值
Hashtable中,key和value都不允许出现null值。HashMap中,都可出现null。
9、HashMap的底层原理
1)HashMap的实现原理
HashMap实际上是一个数组和链表的结合体,HashMap基于Hash算法实现的;
(1)当我们向HashMap中Put元素时,利用key的hashCode重新计算出当前对象的元素在数组中的下标
(2)写入时,如果出现Hash值相同的key,此时分类,如果key相同,则覆盖原始值;如果key不同,value则放入链表中
(3)读取时,直接找到hash值对应的下标,在进一步判断key是否相同,进而找到对应值
2)HashMap在JDK1.7和JDK1.8中有哪些区别
JDK1.7:数组 + 链表
JDK1.8:数组+红黑树
3)HashMap的Put方法具体流程
4)HashMap的扩容
HashMap中的键值对大于阈值或者初始化时,就调用resize()进行扩容。
每次扩展的时候都是扩展2倍。
10、HashMap里面放100条数据,初始化应该是多少
扩容因子0.75
100/0.75≈133.3
初始化134