总纲
本项目从我自己大三开始找实习和工作开始着手,包含了我在面试时遇到的和自己平时总结的一些常见面试题,包括了算法,计算机基础知识,也是对平时积累的一个总结,因此有了这个项目,希望大家都能够找到自己满意的工作
项目总共包含了5个分类,包含的一些常见的问题,个人结合自身的面试经历可以在对应的分类中做补充
- Java基础
- 计算机网络
- 数据结构
- 数据库
- 操作系统
为了大家准备的时候可以直接通过问题进行自我提问来巩固知识,这里把每一个分类下的问题提取出来,供大家自行复习
Java基础
- 为什么Java代码可以实现一次编写、到处运行?
- 一个Java文件里可以有多个类吗(不含内部类)?
- 说一说你对Java访问权限的了解
- 介绍一下Java的数据类型
- int类型的数据范围是多少?
- 请介绍全局变量和局部变量的区别
- 请介绍一下实例变量的默认值
- 为啥要有包装类?
- 说一说自动装箱、自动拆箱的应用场景
- 如何对Integer和Double类型判断相等?
- int和Integer有什么区别,二者在做==运算时会得到什么结果?
- 说一说你对面向对象的理解
- 面向对象的三大特征是什么?
- 封装的目的是什么,为什么要有封装?
- 说一说你对多态的理解
- Java中的多态是怎么实现的?
- Java为什么是单继承,为什么不能多继承?
- 说一说重写与重载的区别
- 构造方法能不能重写?
- 介绍一下Object类中的方法
- 说一说hashCode()和equals()的关系
- 为什么要重写hashCode()和equals()?
- ==和equals()有什么区别?
- String类有哪些方法?
- String可以被继承吗?
- 说一说String和StringBuffer有什么区别
- 说一说StringBuffer和StringBuilder有什么区别
- 使用字符串时,new和""推荐使用哪种方式?
- 说一说你对字符串拼接的理解
- 两个字符串相加的底层是如何实现的?
- String a = "abc"; ,说一下这个过程会创建什么,放在哪里?
- new String("abc") 是去了哪里,仅仅是在堆里面吗?
- 接口和抽象类有什么区别?
- 接口中可以有构造函数吗?
- 谈谈你对面向接口编程的理解
- 遇到过异常吗,如何处理?
- 说一说Java的异常机制
- 请介绍Java的异常接口
- finally是无条件执行的吗?
- 在finally中return会发生什么?
- 说一说你对static关键字的理解
- static修饰的类能不能被继承?
- static和final有什么区别?
- 说一说你对泛型的理解
- 介绍一下泛型擦除
- 说一说你对Java反射机制的理解
- Java反射在实际项目中有哪些应用场景?
- 说一说Java的四种引用方式
- 值传递和引用传递的区别
- 如何理解Java中只有值传递没有引用传递?
- Java中是如何支持正则表达式操作的?
- Java是面向对象的语言,你是怎么理解的,相对于C语言,你感觉有什么优势呢?
- Java为什么是单继承,为什么不能多继承
- 谈一谈Java集合体系架构
- final关键字的作用
- volatile与sychronized的对比?Java中的volatile变量有什么作用?
- Callable和Runnable的区别
- HashSet是有序的还是无序的?
- 简述静态代理和动态代理的区别
- 什么是JDK动态代理?
- Java中垃圾回收机制中如何判断对象需要回收?常见的GC回收算法有哪些?
- Java线程和操作系统的线程是怎么对应的?Java线程是怎样进行调度的?
- 简述BIO、NIO、AIO的区别
- 简述TreeMap的实现原理
- ReetrantLock是怎么实现的
- 简述Java的happen before原则
- 简述Java的逃逸分析机制
- Java编译时类和运行时类
- JVM 是如何处理异常的?
- Java 中垃圾回收机制中如何判断对象需要回收?常见的 GC 回收算法有哪些?
- HashMap 与 ConcurrentHashMap 的实现原理是怎样的?ConcurrentHashMap 是如何保证线程安全的?
- hashmap 和 hashtable 的区别是什么?
- Synchronized 关键字底层是如何实现的?它与 Lock 相比优缺点分别是什么?
- HashMap 实现原理,为什么使用红黑树?
- HashMap 1.7 / 1.8 的实现区别
- Java 类的加载流程是怎样的?什么是双亲委派机制?
- JMM 中内存模型是怎样的?什么是指令序列重排序?
- Java 线程间有多少通信方式?
- 简述 ArrayList 与 LinkedList 的底层实现以及常见操作的时间复杂度
- Java 常见锁有哪些?ReetrantLock 是怎么实现的?
- ThreadLocal 实现原理是什么?
- CAS 实现原理是什么?
- 简述 Spring 的初始化流程
- 简述常见的工厂模式以及单例模式的使用场景
- 简述 Netty 线程模型,Netty 为什么如此高效?
- 线程池是如何实现的?简述线程池的任务策略
- 简述生产者消费者模型
- 简述 Spring 的 IOC 机制
- Java 如何高效进行数组拷贝
- 成员变量和方法的区别?
- MVC 模型和 MVVM 模型的区别
- synchronizedMap和ConcurrentHashMap有什么区别?
- ConcurrentHashMap的并发度是什么?
- CopyOnWriteArrayList可以用于什么应用场景?
- Thread.sleep(0)的作用是什么?
- Java中的ReadWriteLock是什么?
- volatile变量和atomic变量有什么不同?
- 为什么wait和notify方法要在同步代码块中调用?
- 对象创建的过程
计算机网络
- 请详细介绍一下三次握手的过程和四次挥手的过程
- 为什么只有三次握手才行,两次却不行
- 三次握手机制有哪些缺陷
- SYN泛洪攻击怎么解决
- 谈一谈http、https
- 说一说TCP是如何实现可靠传输的
- 浏览器内输入URL后发生了什么(在浏览器输入URL地址到显示主页的过程)
- 能否简单介绍下HTTP协议中缓存的处理流程
- 使用HTTP长连接有哪些优点
- 介绍一下CLOSE WAIT状态产生的原因,TCP 挥手时出现大量 CLOSE WAIT 或 TIME WAIT 怎么解决?
- TCP和UDP该如何选择
- TCP与UDP在网络协议中的哪一层,TCP与UDP有什么区别
- TLS/SSL协议是怎样保障信息安全的
- HTTP2协议有哪些优点
- HTTP 1.0、HTTP 1.1及HTTP 2.0的主要区别是什么
- 简述一下网络分层模型(OSI七层模型、TCP四层模型、五层模型)
- 应用层的协议有哪些?(还有与直播相关的RTMP(可展开)、RTSP)
- HTTPS这样使用对称加密+非对称加密就真的安全吗?
- IP协议的首部结构
- 简述HTTPS的加密与认证过程
- RestFul 与 RPC 的区别是什么?RestFul 的优点在哪里?
- 常见的HTTP状态码的含义(301,304,401,403)
- HTTP请求方法有哪些?
- 什么是 TCP 粘包和拆包?
- forward 和 redirect 的区别?
- 什么是中间人攻击,如何防止中间人攻击?
- 简述TCP的报文头部结构
- TCP 中常见的拥塞控制算法有哪些?
- 什么是跨域,什么情况下会发生跨域请求?
- DNS 查询服务器的基本流程是什么?DNS 劫持是什么?
- TCP的拥塞控制具体是怎么实现的?UDP有拥塞控制吗?
- 简述对称与非对称加密的概念
- 简述 TCP 滑动窗口以及重传机制
- 简述 JWT 的原理和校验机制
- Cookie Session Token的关系和区别是什么?
- 简述 RPC 的调用过程
- 为什么需要序列化?有什么序列化的方式?
- 简述 iPv4 和 iPv6 的区别
- 简述ARP协议
- 说一下ping的过程
- HTTP协议GET和POST的区别
- 简述DDOS攻击原理,如何防范它?
- 简述BGP协议和OSPF协议的区别
- TCP的keepalive了解吗?说一说它和HTTP的keepalive的区别?
- traceroute有什么作用?
数据结构
- HashMap的内部数据结构
- HashMap允许空键空值么
- 影响HashMap性能的重要参数
- HashMap的工作原理
- HashMap中put()的工作原理
- HashMap 的底层数组长度为何总是2的n次方
- HashMap1.8做了哪些优化
- HashMap线程安全方面会出现什么问题
- 为什么HashMap的默认长度是16?
- 1.8中的扩容为什么逻辑判断更简单
- HashMap能保存两个key相同的数据吗?
- HashMap中的key可以为null吗?原理是什么?
- 为什么退化为链表的阈值是6?
- 为什么将链表转为红黑树的阈值设置为8?为什么不一开始直接使用红黑树?
- HashMap是如何解决哈希冲突的?
- HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标?
- ConcurrentHashMap底层实现了解吗?
- HashTable的底层实现了解?
- HashMap、ConcurrentHashMap及HashTable的区别
- 强平衡二叉树和弱平衡二叉树有什么区别
- 平衡二叉树和二叉搜索树有什么关系?
- 快速排序和归并排序
数据库
- MySQL常用的存储引擎有什么?它们有什么用?区别是什么?
- 什么是索引,索引的优缺点和数据结构?
- 简述一下数据库的三大范式
- MySQL的数据类型有哪些?
- 什么是索引?索引的优缺点是什么?索引的数据结构是什么?索引的类型有哪些?索引的使用场景有哪些?索引的设计原则是什么?如何对索引进行优化?如何创建和删除索引?使用索引查询时性能一定会提升吗?索引的基本原理是什么?
- Hash索引和B+树的区别?
- B树和B+树有什么区别?
- 数据库为什么使用B+树而不使用B树?
- 什么是聚簇索引,什么是非聚簇索引,区别是什么?
- 非聚簇索引一定会进行回表查询吗?
- 什么是前缀索引?什么是最左匹配原则?
- 索引在什么情况下会失效?
- 什么是数据库的事务?
- 事务的四大特性是什么?
- 简述一下数据库的并发一致性问题
- 数据库的事务的隔离级别有哪些?
- 隔离级别是如何实现的?
- 什么是MVCC?
- 什么是数据库的锁?
- 数据库的锁和隔离级别的关系?
- MySQL中InnoDB引擎的行锁模式及其是如何实现的?
- 什么是数据库的乐观锁和悲观锁?如何实现?
- 什么是死锁,如何避免?
- 数据库大表如何优化?
- 什么是垂直分表,垂直分库,水平分表,水平分库?
- 分库分表后,ID键如何处理?
- MySQL的复制原理及流程?如何实现主从复制?
- 简述一下什么是读写分离?
- MySQL的三种log日志以及作用?
- Redis使用场景有哪些,基本数据类型有哪些,如果实现的?
- Redis常出现的应用场景
- Redis底层设计了解过吗?
- Redis如何做持久化?
- Redis如何实现高可用?
- 单线程的Redis为什么这么快?
- redis是单线程还是多线程的?
- 简述MyISAM和InnoDB的区别
- 什么是脏读、幻读、不可重复读?InnoDB如何解决幻读的?
- MySQL目前支持的索引结构(索引是对数据库表的一列或者多列的值进行排序并用来快速查询的一种数据结构)
- Mysql主键索引和唯一索引的区别,怎么创建索引
- 谈一谈数据库事务的ACID特性、MVCC
- ACID靠什么保证的?
- 谈一谈redis的缓存雪崩和缓存击穿问题
- 谈一谈redis的数据一致性问题,如何解决?
- Sql执行时间过长(慢查询问题),要如何优化?
- Mysql锁的类型有哪些?
- mysql执行计划怎么看?
- 谈一谈唯一性索引和其他索引,以及Mysql中索引类型对数据库的性能的影响
- 简述Mysql中索引类型即对数据库的性能的影响
- 简述 Redis 的过期机制和内存淘汰策略?
- Redis的key的过期删除策略?
- Mysql中in和exists的区别?
- varchar和char的区别?
- Mysql中int(10)和char(10)和varchar(10)的区别?
- drop、delete和truncate的区别?
- 主键一般用自增ID还是UUID?
- 如何利用redis实现分布式锁?原理是什么?
- Redis和其他数据库的区别
- Redis和Memcached的区别
- 简述 Redis 中跳表的应用以及优缺点
- 数据库反范式设计会出现什么问题?
- 简述 Redis 持久化中 RDB 以及 AOF 方案的优缺点
- Redis 序列化有哪些方式?
- 简述 Redis 的哨兵机制
- MySQL 中 join 与 left join 的区别是什么?
- Redis 有几种数据结构?Zset 是如何实现的?
- 模糊查询是如何实现的?
- 并发事务会引发哪些问题?如何解决?
操作系统
- 线程死锁的四个必要条件(线程死锁是如何产生的)?
- 死锁的危害和避免方式
- LRU Cache了解过吗?
- 进程和线程的区别?
- 并行和并发的区别?
- JVM有哪些内存区
- 对空间大小怎么配置?各区域怎么划分?
- JVM中哪些内存区域会发生内存溢出(OOM)?
- JVM在创建对象时采用了哪些并发安全机制
- 什么是对象头?对象头里有哪些东西?
- 为什么不要使用Finalize方法?
- 怎么判断对象的存活?
- 什么是复制算法,它有什么优点?
- 什么是标记清除算法?它有什么优缺点?
- 什么是标记整理算法?它有什么优点?
- 扩容新生代为什么能提高GC的效率?
- 阐述一下CMS垃圾回收器,它有哪些问题?
- 在Java中守护线程核用户线程的区别?
- 什么是多线程中间的线程切换?
- Java中Executor和Executors的区别?
- 什么是CAS操作,缺点是什么?
- Lock接口是什么?对比synchronized它有什么优势?
- 什么是阻塞队列?阻塞队列的实现原理是什么?如何设计一个阻塞队列?
- 什么是Callable和Future?
- 什么是FutureTask?
- 什么是并发容器的实现?
- 乐观锁和悲观锁的理解
- 什么是公平锁?什么是非公平锁?
- wait方法和sleep方法的区别
- 为什么wait,notify和notifyAll这些方法不在Thread类里面而是在Object里?
- 什么是Java内存模型?
- 什么是线程安全?
- 一个线程如果出现了运行时异常会怎样?
- 如何在两个线程之间共享数据?
- 怎么唤醒一个阻塞地线程?
- Java中用到的线程调度算法是什么?
- 什么是线程调度器和CPU时间片?
- 如何确保main()方法所在的线程是Java程序最后结束的线程?
- 什么是Java Timer类?如何创建一个由有特定时间间隔的任务?
- Java中的Semaphore是什么?
- 有三个线程T1,T2,T3,怎么确保它们按顺序执行?
- 如果你提交任务时,线程池队列已满。会发生什么?
- 单例模式下的双检锁是什么?
- Java中如何获取到线程的dump文件?
- 什么是AQS?
- 多线程同步和互斥有几种实现方法?
- 线程/进程间通信的方式?
- 对线程优先级的理解?
- 什么是安全区?
- Minor GC和Full GC的区别?
- 什么是类加载器,类加载器有哪些?
- 简述 select, poll, epoll 的使用场景以及区别,epoll 中水平触发以及边缘触发有什么不同?
- 进程空间从高位到低位都有些什么?
- Linux中虚拟内存和物理内存有什么区别?有什么优点?
- malloc分配内存的原理?
- Linux 下如何查看端口被哪个进程占用?
- 什么时候会由用户态陷入内核态?
- 简述同步与异步的区别,阻塞与非阻塞的区别
- 简述操作系统中的缺页中断
- 简述Linux进程调度的算法