1.jdk1.8新特性
1.Lambda表达式
2.方法引用
3.函数式接口
4.接口允许定义默认方法和静态方法
5.StringApi
6.日期/时间类改进
7.optional类
8.java8对base64实现
接口和抽象类的区别?
抽象类的子类要用extends继承;实现接口要用implements
抽象类可以定义抽象类可以定义构造函数,而接口不能。
抽象类可以定义main方法,但接口不能有main方法
实现数量:类可以实现很多接口,但只能继承一个抽象类
访问修饰符:接口中的方法默认public 修饰,抽象类中的方法可以是攘夷访问修饰符
2.Java中的io流分为几中?
根据功能分为输入流和输出流,
根据类型分可以分为:字节流和字符流
3.讲述一下Bio、Nio、Aio的区别?
BIO的英语全程Block Io, 同步阻塞式io,就是平常经常使用的传统io,特点是简单方便,但并发处理能力低。
Nio,全名是newIo,同步非阻塞Io,客户端和服务器都通过chaanel(通道)通讯,实现多路复用(由yige线程管理多个通道。默认管理的通道数量是1024个)
Aio,是NIO的升级,实现了一步非堵塞io,他是基于时间和回调机制的。
files的常用方法
4.Collection和Collections的区别
collection是一个单列集合的顶层接口
Collections是集合类的一个工具类,包含了对集合元素进行排序和线程安全等各种操作方法
5.List、Set、Map之间的区别是什么?
List集合
1.属于单列集合,存储的都是一个一个元素
2.List存在重复元素
3..每一个元素都有对应的索引,可以通过索引获取元素
4.每一个元素都应有对应的索引,可以通过索引获取元素。
5.元素的存取顺序一致
6.Set集合
1.属于单列集合,存储的都是一个一个元素
2.元素唯一
3.元素没有索引,不能通过索引获取元素
4.不能保证元素的存取顺序一致
7.Map集合:
属于双列集合,存储的元素是一对一对的。
HashMap和Hashtble有什么区别?
相同点:
1.都实现了**map接口**
2.都可以存储**key-value**
不同点:
1.hashMap可以**把null作为key或value**,
Hashtable**不可以**
2.HashMap**线程不安全,效率高**。
Hashtable**线程安全,效率低。**
8.如何决定使用HashMap还是TreeMap?
TreeMap可以**对元素进行排序**,因此如果需要对元素**按照某一种规则进行排序**,此时可以选择TreeMap。没有特殊要求一般选择HashMap
9.ArrayList和LinkedList的区别是什么?
ArrayList底层实现的**数据结构是数组,
查询元素较快,增删较慢。**
LinkedList的底层数据是**双向循环链表,
查询速度较慢,增删较快。**
10.如何做到数组和List的转换?
List对象转换成数组:
可以调**用ArrayList(或其他List)的toArray方法。**
数组转换成List:
调用**Arrrays的asList方法。**
11.ArrayList和Vector的区别是什么?
Vector是**线程安全**的,而ArrayList不是。
所以如果**是在单线程**下,**建议使用ArrayList**在扩容时,Vector是扩容100%,但ArrayList是50%,
**使用ArrayList可以节省内存。**
结论:**大多数可开发场景是单线程的**,所以建议使用ArrayList
12.哪写集合类是线程安全的?
Vector:比ArrayList多了个**同步化机制**(线程安全)
Stack:**堆栈类**,先进后出,**项目中用的并不多**
Hashtable:比hashmap多了个**线程安全**,所以建议使用HashMap。
13.ConurrentHashMap和Hashtable的区别?
ConcurrentHashMap只锁定map的某个部分,而Hashtable锁定整个map
hashtable(同一把锁):**使用synchronized保证线程安全,效率非常低下**。
当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,
如使用put添加元素,另一个线程不能使用put添加元素,也不能使用get,竞争会原来越激烈,效率越低。
concurrenthashmap(分段锁):
**(锁分段技术)每一把锁只锁容器其中一部分数据,多线程访问容器不同数据段的数据,就不会存在锁竞争,提高并发访问率。**
**首先将数据分为一段一段的进行存储,然后给每段数据配一把锁,每当线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问。**
concurrenthashmap是**由Segment数组结构和hashEntry数组结构组成。**
Segment是一种**可重入锁**ReentranLock,扮演锁的角色。hashEntry用于存储键值对数据。
**一个concurretnhashmap里包含一个Segment数组。**
Segment的结构和hashmap类似,是一种数组和链表结构,一个Segment包含一个HashEntry数组,每个hashEntry是一个链表结构的元素,
每个Segment守护一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改首先必须获得Segment。
在进度款1.8之后进一步优化ConcurrentHashMap的性能,去掉Segment分段锁的设计。在数据结构方面,则跟HashMap一样,使用一个hash表。
table
数组。(数组+链表+红黑树)而线程安全方面是结合CAS机制+局部所实现的,降低锁的粒度,提高性能。
同时在HashMap的基础上,对哈希表table数组和链表节点的value,next指针等是哟个volatitle来修饰,从而呈现线程可见性。
ConcurrentHashMap在及逆行遍历是使用的是安全失败,Hashtable在遍历是使用的是快速失败。
14.jdk1.7到jdk1.8hashmap的底层发生了什么?
1.8之后hashMap的数据发生变化,**从单纯的数组+链表+红黑树**,
也就是说**JVM存储hashMap的键值对时,仅仅通过key来决定每一个entry的存储槽位**。
并且Value以**链表的形式**挂在**对应的槽位上**(1.8以后如果**value长度大于8则转为红黑树**)
15.HashMap的扩容原理?
**初始化扩容量为16**,达到一定**临界值时**进行扩容,而这个**临界值=最大容量*负载因子(0.75)**,
扩**容每次2倍时,总是2的n次方**。
**扩容机制**:使用每一个**容量更大的数组**替代已有的**容量小的数组**,
**transfer()方法**将原有的**Entry数组的元素**拷贝到**新的Entry数组中**。