Java后台研发面试题汇总
2019 年校招马上开始,开始着手准备面试。
只写自己想到的可以回答的点,不作深入分析,理解出错的地方还请指正。
需要研读的几本书:
- java编程思想
- 大型网站技术架构:核心原理与案例分析
- java并发编程的艺术(应对校招足以,java并发编程实战还是等工作积累了一些经验再研读)
- 深入理解jvm虚拟机(针对JDK1.7,版本略老,带着批判的眼光看吧)
- 深入分析JavaWeb技术内幕
- Redis实战 和 Redis设计与实现
Java 相关
多态
面向对象的三大基本特征:封装、继承、多态。
依赖关系:继承依赖封装,多态依赖继承。
为了实现多态需要有封装和继承。多态的最终目的在我看来就是为了解耦。
多态的三个必要条件:
- 要有继承
- 要有方法的重写
- 父类引用指向子类对象
class Animal {
public void name() {
System.out.println("Animal");
}
}
class Cat extends Animal{
@Override
public void name() {
System.out.println("Cat");
}
}
class Dog extends Animal{
@Override
public void name() {
System.out.println("Dog");
}
}
public class Test {
public static void fun(Animal animal) {
animal.name();
}
public static void main(String[] args) {
fun(new Dog());
fun(new Cat());
}
}
但是即便是出现了多态,也未曾完全消除耦合。
你看,Animal 的实现类还是被耦合在了代码里。
曾经在学 JDBC 时遇到一个问题:如此优雅的操作数据库的代码为何出现了一个不合时宜的
Class.forName("com.mysql.jdbc.Driver");
SPI 与 IOC 应运而出。没错它们的出现也还是为了解耦(实现类不再耦合在业务逻辑里了)。
当然遇到多态的问题,还可以扯向多态的实现–方法表以及调用方式的区别(invokevirtual/invokeinterface)等。
上边代码对应对方法表:
https://blog.csdn.net/x_iya/article/details/80240985
https://blog.csdn.net/x_iya/article/details/78480461
https://blog.csdn.net/x_iya/article/details/78458564
R 大推荐:http://hllvm.group.iteye.com/group/topic/39445
HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
http://www.importnew.com/7010.html
ConcurrentHashMap和Hashtable的区别
Hashtable和ConcurrentHashMap有什么分别呢?它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。
http://www.importnew.com/7166.html
并发相关
volatile
只能保证可见性,局部有序性,不能保证原子性。
可见性:一个线程修改了共享变量的值,其他线程能够立刻得知这个修改。
共享变量为在堆中的变量(JDK7以后Class变量也是在堆中分配内存了),对于在局部变量表(JVM虚拟机栈-栈帧)的变量,一般都是分配在线程独享的 TLAB (Thread Local Allocation Buffer)中。每个方法(不包含 native 方法)执行的同时都会创建一个栈帧结构,方法执行过程,对应着虚拟机栈帧的入栈到出栈的过程。
volatile的内存语义:
- 当写一个 volatile 变量时,JMM 会把该线程对应的本地内存中的共享变量值刷新到主内存。
- 当读一个 volatile 变量时,JMM 会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。
synchronized
操作系统相关
网络相关
OSI 与 TCP/IP 参考模型
划分原则是:
(1)网路中各结点都有相同的层次;
(2)不同结点的同等层具有相同的功能;
(3)同一结点内相邻层之间通过接口通信;
(4)每一层使用下层提供的服务,并向其上层提供服务;
(5)不同结点的同等层按照协议实现对等层之间的通信。
各层的作用:
- 物理层:在物理媒体上传输原始的数据比特流。
- 数据链路层:将数据分成一个个数据帧,以数据帧为单位传输。有应有答, 遇错重发。
- 网络层:将数据分成一定长度的分组,将分组穿过通信子网,从信源选择路- 径后传到信宿。
- 传输层:提供不具体网络的高效、经济、透明的端到端数据传输服务。
- 会话层:进程间的对话也称为会话,会话层管理不同主机上各进程间的对话。
- 应用层:提供应用程序访问OSI环境的手段。
TCP/IP三次握手四次挥手
HTTP
我眼中的 HTTP
https://blog.csdn.net/x_iya/article/details/79984939
一次完整的 HTTP 请求过程
https://blog.csdn.net/x_iya/article/details/79774018
Http 与 Https 的区别
HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
HTTP 是不安全的,而 HTTPS 是安全的
HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
HTTP 无法加密,而HTTPS 对传输的数据进行加密
HTTP无需证书,而HTTPS 需要CA机构颁发的SSL证书
设计模式
单例模式
属于创建型模式。
https://blog.csdn.net/x_iya/article/details/79764430
策略模式
属于行为型模式。
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。
该模式完美的说明了接口或者说多态的好处:解耦。
接口更多描述的是行为。
工厂模式
数据库
Mysql 中 MyISAM 和 InnoDB 的区别有哪些?
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
如何选择:
1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
事务的 ACID 属性
1. 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
数据库提供的 4 种事务隔离级别:
https://www.cnblogs.com/huanongying/p/7021555.html
http://blog.sina.com.cn/s/blog_499740cb0100ugs7.html
https://github.com/Yhzhtk/note/issues/42