Java基础
<i><b>final</b></i>关键字用法
说明:最终的,不可变的
<b>final</b>修改的类:不可被继承
<b>final</b>修饰的方法:不可被重写
<b>final</b>修饰的变量:不可重新赋值
<b>final</b>修饰对象:该对象不能被重新指向
<b>final</b>修饰的成员变量:必须手动初始化,不可采用系统的默认值
<b>final</b>修饰的<b><font color="#c41230">实例变量</font></b>:最好是用static修饰(存储在方法区),因为final修饰的变量本来就不可重新赋值
<b>static final </b>关键字修饰的变量称为常量
什么是不可变类?
所有基本类型的包装类都是不可变的
<b>String</b>为什么是不可变的?
<b>String</b> 类是<b>final</b>关键字修饰的类
<b>String</b> 实际是由一个<b>final</b> 修饰的<b>char[]</b>数组存储数据的
==、equal有什么区别?
你知道运算符&和&&、|和||的区别吗?
用最有效率的方法计算2乘以8
String、StringBuffffer与StringBuilder的区别?分别在哪些场景下使⽤?
Java容器
说下Vector和ArrayList、LinkedList联系和区别?分别的使⽤场景
List
Set
Map
抽象类
有构造方法,但是不可被实例化,可提供子类使用
抽象类的子类可以是抽象类
<b>final</b>和<b>abstract</b>不能同时使用,这关键字两个是对立的
抽象类可以没有抽象方法,但是抽象方法必须是在抽象类中
子类继承了抽象类,那么子类必须重写抽象类的抽象方法
Java中凡是没有方法体的方法都是抽象方法吗?
不对,<b>Object</b>中很多<b>native</b>修饰的方法没有方法体,但是他们不是抽象方法<br><b>native</b>关键字修饰的方法:调用底层c++写的代码
接口
可以继承多个接口
接口中的变量都是常量(<b>static</b> <b>final</b> 关键字修饰的)
<b>interface</b>中可以有<b>static</b>⽅法,但<b>必须有</b>⽅法实现体,该⽅法只属于该接⼝,接⼝名直接调⽤<br>该⽅法
接⼝中新增<b>default</b>关键字修饰的⽅法,<b>default</b>⽅法只能定义在接⼝中,可以在⼦类或⼦接⼝<br>中被重写<b>default</b>定义的⽅法<b>必须有⽅法体</b>
深拷贝和浅拷贝
包装类可以被继承吗?
不可以,包装类都用final关键字修饰
JUC多线程及高并发
基础内容
<b>synchronized</b>和L<b>ock</b>有什么区别?用新的<b>Lock</b>有什么好处?
区别
原始构成
<b>synchronized</b>是关键字属于<b>JVM</b>层面
<b>Lock</b>是具体的类(<b>ava.util.concurrent.locks.Lock</b>)是<b>api</b>层面的锁
如何释放锁?
<b>synchronized</b>不需要手动释放锁,业务代码执行完以后系统会自动释放对锁的占有
<span style="font-size: inherit;"><b>Lock</b>需要手动释放锁,如果没能成功手动释放锁,可能会导致死锁的现象<br></span>需要<b>lock()</b>和<b>unLock()</b>配合<b>try</b>和<b>finally</b>语句块来完成
是否可被中断
<b>synchronized</b>不可被中断,除非抛异常或程序正常执行完成
<b>ReentrantLock</b>可以被中断
加锁是否公平
<b>synchronized</b>:非公平锁
<b>ReentrantLock</b>:默认为非公平锁,可以传入一个人<b>boolean</b>型的参数,<b>true</b>为公平锁,<b>false</b>为非公平锁
是否可绑定多个条件
<b>synchronized</b>:没有
<b>ReentrantLock</b>可以分组唤醒需要唤醒的线程,可以精准唤醒<br>而不像<b>synchronized</b>那样要么随机唤醒一个线程要么全部唤醒
好处
为什么wait, notify 和 notifyAll这些方法不在thread类里面?
<b>sleep</b>与<b>wait</b>的区别
进阶内容
谈谈对<b><font color="#c41230">volatitle</font></b>的理解<br>
<b style=""><font color="#c41230">volatile</font></b>是Java虚拟机提供的轻量级的同步机制
不具有原子性
禁止指令重排
谈谈<b><font color="#c41230">JMM</font></b>
可见性
原子性
java.util.concurrent.atomic 演示可见性+原子性代码
案例代码
你在哪些地方用到过volatie?
单例模式volatile分析
读写锁手写缓存的时候
JUC包里大规模都有使用
CAS算法你知道吗?
比较并交换
CAS底层原理?如果知道,谈谈你对<b>UnSafe</b>的理解
atomicInteger.getAndIncrement();
底层代码
<b>CAS</b>是什么?
unsafe.getAndAddInt();
底层汇编
为什么用<b>CAS</b>不用<i style=""><b>Synchronized</b>?</i>
CAS缺点
自旋对比时间长CPU开销大
只能保证共享变量的原子操作,其他业务代码无法保证
ABA问题?
谈谈原子类AtomicInteger的ABA问题,原子更新引用知道吗?
ABA问题怎么产生的(狸猫换太子)
原子引用 <b>AtomicReference<V></b>
解决 “ABA”问题 - 时间戳原子引用
我们知道ArrayList是线程不安全,请编写一个不安全的案例,并给出解决方案
案例代码
解决方案
使用<b>Vector</b>集合
使用<b>Collections.synchronizedList(new ArrayList<T>());</b>
CopyOnWriteArrayList<T>(); - 写时复制容器
谈谈对公平锁/非公平锁/可重入锁递归锁/自旋锁的理解,请写一个自旋锁
可重入锁(递归锁)
是什么?
ReentrantLock/synchronized就是经典的可重入锁
可重入锁的最大作用就是避免死锁
自旋锁
独占锁(写锁)/共享锁(读锁)/互斥锁
<b>ReentrantReadWriteLock</b>
CountDownLatch/CyclicBarrier/Semaphone使用过吗?<br>
CountDownLatch - 计数类
让一些线程<b>阻塞</b>,直到另一些线程完成了操作才会被<b>唤醒</b>
<b>CountDownlatch</b>有两个核心方法,当一个或多个线程调用<b>await()</b>方法时,调用的线程会进入阻塞状态。<br>其他线程调用<b>countDown()</b>方法时会使计算器减<b>1</b>(调用<b>countDown</b>方法的线程不会阻塞),当计数器为<b>0</b>时,因调用<b>await()</b>方法被阻塞的线程会被唤醒,继续执行
CyclicBarrier(与CountDownLatch相反)
<b>Semaphone</b> - 信号量
阻塞队列知道吗?
有什么好处?
种类分析
ArrayBlockingQueue:<i>由数组结构组成的有界阻塞队列</i>
<b>LinkedBlockingQueue:</b>由链表组成的有界(<b>默认大小:integer.Max_value</b>)阻塞队列
SynchronousQueue:不存储元素的阻塞同步队列
理论
示例代码
阻塞队列用在哪里?
生产者消费者模式
传统版
Condition多条件
阻塞队列版
线程池
消息中间件
线程池使用过吗? 谈谈你对ThreadPoolExecutor的理解?
线程池在生产时如何设置合理参数?
死锁编码以及定位分析
数据结构与算法
非线性结构
常见的非线性结构有哪些?
二维数组、多维数组、广义表、树结构、图结构
什么是稀疏数组?
排序
简单排序
冒泡排序O(N^2)
插入排序O(N^2)
选择排序O(N^2)
为什么Mysql的索引不用二叉树数据结构?
哪些场景不适合用二叉树红黑树这样的数据结构?
数据量大,可能导致树的高度很大,而且刚好要查找的元素位于叶子节点
数据库
索引是什么?
<b>索引</b>是帮助Mysql高效获取数据的<font color="#0076b3"><b>排好序</b></font>的<font color="#0076b3" style=""><b>数据结构</b></font>
为什么Mysql使用B+Tree数据结构而不是用B-Tree?
因为大部分情况都需要范围查找,然而B+Tree每个叶子结点都用指针连接,区间访问的性能更高
介绍一下mysql的存储引擎是什么?
<b>MyISAM</b>存储引擎
后缀<b>MYD</b>存储表数据的 <b>MYI</b>存储索引的
索引文件和数据文件是分离的(非聚集)
非聚集索引 - (索引和数据分开存储)
<b>InnoDB</b>存储引擎
表数据文件本身就是按<b>B+Tree</b>组织的索引结构文件
聚集索引(索引和数据存储在一个地方) - 叶子节点包含了完整的数据记录
数据文件和索引文件都存储在后缀为<b>idb</b>的文件