java基础面试题续集-学习笔记

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%,但ArrayList50%**使用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数组中**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值