前言
大白话讲面试题,每天更新三题,提倡每日积累而不是临阵磨枪,我的目的不是为了背题,而是通过这种方式来更好的巩固自身所掌握的知识。
题目的星星代表难度等级,五星为满,并且我会列出需要掌握的前置知识。
大家一起,冲鸭!
Java 面向对象有哪些特征?⭐
目的:了解你的基础,有些人干了三年都有可能答不好或答不出这个问题。
回答这题你还需要理解:什么是面向对象,什么是类,什么是对象,他们之间的关系。
- 封装
- 继承
- 多态
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界来说,它的内部细节是隐藏的,暴露给外界的只是它的访方法。
对于一个类来说,封装了自己的属性和方法,想要访问属性的值,只能通过事先写好的方法去访问,可以通过控制方法的逻辑来限制对属性的不合理操作;同时,方法的封装可以让调用者不必关心方法的内部实现逻辑,便于使用便于修改。
继承是从已有类中派生出新的类,新的类继承了已有类的属性和方法,并且可以扩展新的能力。
派生出来的类叫子类(或派生类),原有类叫父类(或基类);比如经典的 Animal 和 Cat,Dog,由 Animal 类派生出猫和狗,他们有共同的特征是跑跳叫,但狗可以扩展自己的动作,比如吃屎……
多态是指两个类由继承关系,存在有方法的重写,故而可以在调用时有父类引用指向子类对象。比如 Animal animal = new Dog。
ArrayList 和 LinkedList 之间有什么区别?⭐
目的:考察数据结构的基础,以及对基础集合有没有比较深入的了解,这个题目是一个很经典的对比。
回答这题你还需要理解:数组和链表,他们的特点、特性、原理等。
ArrayList 和 LinkedList 都实现了 List 接口,他们之间有以下的不同点:
- 底层数据结构上:前者底层使用了数组;后者使用了链表,因此后者所占用的内存空间要更大一些,因为要存储前后节点的位置。
- 效率上:前者使用索引访问数据,取数贼快,但插入和删除需要移动后面的数据,效率较慢;后者由于链表的特性,插入和删除特别快,但查询需要从头开始遍历,效率较慢。
线程安全的集合类都有哪些?⭐⭐⭐
目的:考察多线程方面的基础,往往以这个问题为入口,越问越深
回答这题你还需要理解:关键字 synchronized、volatile,什么是 CAS(容易被追问)。
第一代线程安全集合类:
- Vector(Since: JDK1.0)
- Hashtable(Since: JDK1.0)
底层使用 synchronized
关键字来保障线程安全,效率低下。
第二代集合类:
- ArrayList(Since: JDK1.2)
- HashMap(Since: JDK1.2)
那如果需要线程安全怎么办呢?
在写这两个集合类的时候,作者还写了一个 Collections
集合工具类,比如 Collections.synchronizedListCollections(List<T> list)
就可以创建一个线程安全的 List 对象,底层任然使用的是关键字synchronized
,但由于锁的是方法,性能上有一定提升。
第三代线程安全集合类:
从 JDK1.5 开始,引入了包 java.util.concurrent.*
,JUC 中多数类是通过 volatile关键字和 CAS 来实现,线程安全且高效。
在这个包下的所有集合类都是线程安全的,比如常用的 ConcurrentHashMap
。
引用
在这里我会放上所有我参考的资料链接