1.接口和抽象类有什么区别?
-
抽象类的子类要用 extends 来继承;而实现接口要用 implements 。
-
抽象类可以定义构造函数,而接口不能。
-
抽象类里可以定义 main 方法,但接口不能有 main 方法。
-
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
-
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
上述是从语法上来归纳,然后建议大家再从面向对象思想的角度来说明
-
抽象类是对逻辑的归纳,比如动物类可以是抽象类,人类可以extends动物这个抽象类。
-
而接口是对功能的归纳,比如可以定义一个“提供数据库访问功能”的 接口,在其中封装若干操作数据库的方法。
15. java 中 IO 流分为几种?
按功能来分可以分输入流(input)和输出流(output)。从类型来分可以是字节流和字符流。
16. BIO、NIO、AIO 有什么区别?
-
BIO的英语全称是Block IO, 同步阻塞式 IO,就是平常经常使用的传统 IO,特点是简单方便,但并发处理能力低。
-
NIO,叫New IO, 同步非阻塞 IO,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
-
AIO,Asynchronous IO, 是 NIO 的升级,实现了异步非堵塞 IO ,它是基于事件和回调机制。
17. Files的常用方法都有哪些?
-
Files.exists():检测路径是否存在。
-
Files.createFile():创建文件。
-
Files.createDirectory():创建文件夹。
-
Files.delete():删除文件或文件夹。
-
Files.copy():复制文件。
-
Files.move():移动文件,即复制后删除。
-
Files.size():查看文件的个数。
-
Files.read():读取文件。
-
Files.write():写入文件。
篇幅限制下面就只能给大家展示小册部分内容了。包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
第二部分,Java的集合,也叫容器
==================================================================================
18. java 的集合容器都有哪些?
如下给出了大致的结构
-
所有线性表对象的父类是Collection
-
有线性表类,比如ArrayList和Set等。
-
有键值对类,比如HashMap。
19. Collection 和 Collections 有什么区别?
-
Collection 是一个集合接口,是所有线性表对象的父类。
-
Collections是集合类的一个工具类,包含了对集合元素进行排序和线程安全等各种操作方法。
20. List、Set、Map 之间的区别是什么?
篇幅限制下面就只能给大家展示小册部分内容了。包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
21. HashMap 和 Hashtable 有什么区别?
首先说,两者都是键值类的对象
-
HashTable线程安全的,而HashMap线程不安全的,大多数的场景是单线程环境,在单线程环境下,HashMap效率上比hashTable要高。
-
HashMap允许空键值,而hashTable不允许。
22. 如何决定使用 HashMap 还是 TreeMap?
对于在Map中进行插入、删除和定位元素这类操作,可以选HashMap。但如果你要对一个有序的key集合进行遍历,需要选TreeMap。
23. 说一下 HashMap 的实现原理?
HashMap是基于数据结构里的散列表,在大数据情况下,能保证get的高效性。
HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当向Hashmap对象里put元素时,会根据key的hashcode计算hash值,根据hash值得到这个元素在数组中的位置,如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。
注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
24. 说一下 HashSet 的实现原理?
-
HashSet在底层上,是由HashMap实现的
-
HashSet的值放在HashMap的key上
-
HashMap的value统一为PRESENT
25. ArrayList 和 LinkedList 的区别是什么?
ArrrayList底层实现的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。
26. 如何做到数组和 List之间的转换?
-
List对象转换成为数组:可以调用ArrayList(或其它List)的toArray方法。
-
数组转换成为List:调用Arrays的asList方法。
27. ArrayList 和 Vector 的区别是什么?(面试大概率会问)
-
Vector是线程安全的,而ArrayList不是。所以在单线程情况下,建议使用ArrayList
-
在扩容时,Vector是扩容100%,但ArrayList是50%,后者更节省内存
结论:大多数开发场景是单线程环境,所以建议使用ArrayList
28. Array 和 ArrayList 有何区别?
-
Array能容纳基本数据类型和自定义对象,而ArrayList只能容纳自定义的对象,对于基本数据类型,需要转换成封装类才能存储。
-
Array是指定大小的,要手动扩容,而ArrayList大小虽然可以在定义时指定,但遇到容量满时会自动扩容。
-
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
所以建议使用ArrayList
29. 在 Queue 中 poll()和 remove()有什么区别?
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
30. 哪些集合类是线程安全的?
-
Vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
-
Statck:堆栈类,先进后出,项目中用得并不多。
-
Hashtable:就比hashmap多了个线程安全,所以建议使用HashMap。
-
enumeration:枚举,所以现在建议用Iterator来迭代。
结论是,如果在单线程情况下,不建议使用这些线程安全对象。
31. 迭代器 Iterator 是什么?
迭代器是一种设计模式,也是一个对象,可以用来遍历并选择序列(比如ArrayList或HashMap)中的对象,而开发人员不需要了解该序列的底层结构。
迭代器通常被称为“轻量级”对象,因为创建它的代价小。
篇幅限制下面就只能给大家展示小册部分内容了。包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取