互联网面试基础知识大全
2021-03-01 16:26:29 1 举报
AI智能生成
程序员面试复习指南
作者其他创作
大纲/内容
interViewQuestion
计算机网络
session与cookie的区别
cookie是为会话存储的键值信息,不可跨域名(只能拿到当前域名下的cookie,包含父级域名),有有效期限,是在客户端的浏览器保存。
session是基于内存的缓存技术,用来保存针对每个用户的会话数据,通过session ID 来区分用户,存储于服务器端。
浏览器在第一次请求时,无cookie,然后服务器收到请求后,创建一个 session,用sessionid 标识,将其放入cookie中,然后客户端以后请求都带上cookie,服务器端收到消息后,解析里面的sessionid即可。
跨站请求伪造
三次握手和四次分手
GET和POST的区别
GET没有body,只有url,请求放在url中;POST请求的数据在body中
post的安全性要比get高
操作系统
并发和并行的区别?
进程和线程
线程的三种实现方式?
内核支持线程、用户级线程、混合级线程
有什么区别?
内核态和用户态的区别?
单核可以处理多线程吗?怎么处理?
CPU主频
进程间的关系?
进程的创建?
进程的终止?
进程的同步机制?
硬件同步
信号量
①整型信号量
②记录型信号量
③AND型信号量
④信号量集
管程
①管程是什么?
管程是把共享资源以及对共享资源所做的操作进行了封装
②管程所解决的问题?
③与进程的区别?
④管程的操作过程是怎样的?
⑤管程是如何实现进程同步的?
⑥管程中的两个队列?
进入管程的等待队列 \t管程中的条件阻塞队列
死锁
什么是死锁?
一组进程中的每个进程都在等待由这组进程中其它进程引发的事件
死锁的条件是什么?
互斥
请求和保持
不可抢占
进程已获得的资源不可被抢占
循环等待
一系列进程互相持有其它进程所需要的资源
如何解决死锁?
破坏以上四个条件中的其中一个
nginx
是什么?
什么是异步非阻塞模型?
解决了什么问题?
怎么用?
反向代理和负载均衡
常用的配置是

listen:反向代理访问的端口

server_name:服务器ip

proxy_pass:tomcat的地址和端口
数据结构
实现set,采用的数据结构
hashSet
treeSet
实现队列,采用的数据结构
线性表
数组
实现唯一的缺点是建立时要确定空间大小。
链表
链表实现指针域要占用空间,频繁的new和delete会消耗时间开销
二叉查找树
特点
缺点
AVL平衡二叉树
1.具有二叉查找树的全部特性

2.每个节点的左子树和右子树的高度差至多等于1
作用
为了解决二叉查找树在极端情况下退化为一条链表的情况
规则
左-左型:右旋

\t右-右型:左旋

\t左-右型:先左旋后右旋

\t右-左旋:先右旋后左旋
红黑树
为了解决平衡二叉树在插入时进行频繁左旋右旋的问题
B树和hash索引的区别?
排序
快速排序
算法
单例模式
判断链表是否有环?
用两个栈实现一个队列?
其它
高并发的实现优化
点击一个网址后发生了什么?
语言
java
基础
JDK和JRE的区别?
接口和抽象类
接口是公开的,不能有私有的方法或变量,所有方法都没有方法体,interface实现。
抽象类是可以有私有方法或变量,抽象方法不能包含方法体。
引用传递和按值传递?
引用传递
按值传递
java中使用的是?
基本类型和包装类型
基本类型
包装类型
2.包装类型可用于泛型
泛型
什么是泛型?
项目中是如何使用的?
项目中一些通用的工具类或者方法会用到
Object和泛型的区别?
反射
当程序在运行时获取一个类的内部信息
为什么?(解决了什么问题)
反射的用途

1.在运行时判断一个对象所属的类

2.在运行时构造一个类的对象

3.在运行时调用一个对象的方法
反射的实现

1.先获取class对象 

2.判断是否为某个类的实例 

3.创建实例

4.获取方法

5.获取构造器信息 

6.获取类的成员变量信息 

7.调用invoke方法 

8.利用反射创建数组Array.newInstance()
class.forname()的作用
加载一个类到内存中
String为什么不可修改
equals和==的区别?
final、finally、finalize的区别
finalize;在手动进行垃圾回收时需要重写finalize方法(super.finalize)
Lock锁
读写锁ReentrantReadWriteLock
原理
怎么防止新来的读不断占用锁,写抢不到锁?
工作模式
可以锁降级吗?
乐观锁
介绍
ABA问题
JDK的解决办法
jdk1.5之后提供了AtomicReference类中的compareAndSet来保证引用对象之间的原子性.
syncronized
可以用来修饰方法和代码块.
syncronized锁升级
无锁->偏向锁->轻量级锁->重量级锁
无锁
偏向锁
同一个线程执行同步资源时自动获取资源
偏向锁->轻量级锁
轻量级锁
轻量级锁->重量级锁
重量级锁
什么是自旋?
syncronized和volatile的区别
synchronized和reentrantlock的区别
synchronized和lock区别
加解锁。synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁
自动释放锁。synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要再 finally {} 代码块显式地中释放锁
是否等待。synchronized 会导致线程拿不到锁一直等待;Lock 可以设置尝试获取锁或者获取锁失败一定时间超时
锁成功是否可知。synchronized 无法得知是否获取锁成功;Lock 可以通过 tryLock 获得加锁是否成功
并发
Copy-On-Write
使用时的注意项
减少扩容开销
根据实际需要,初始化CopyOnWriteArrayList的大小,避免写时CopyOnWriteArrayList扩容的开销。
使用批量添加
因为每次添加,容器每次都会进行复制,所以减少添加次数,可以减少容器的复制次数。
优点
可以进行并发读而不需要加锁
内存占用问题
因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象。如果这些对象占用的内存比较大,很有可能造成频繁的Full GC
解决方案
数据一致性问题
CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。
多线程
ThreadLocal作用和原理
[object Object]
可以用来存用户的登录信息,方便其它地方调用用户信息
ThreadLocal和局部变量的区别?
普通成员变量的初始化对这个线程本身是高度耦合的,必须要知道这个线程是哪个,普通成员变量名是什么才能进行赋值。
而ThreadLocal则不需要,只需要声明好泛型的类型,定义好初始化函数即可。
为什么使用弱引用?
run()和start()
run()
start()
sleep()和wait()
线程池
创建线程池需要传递哪些参数?
volatile
是修饰共享变量的关键字
因为它解决了多线程对变量操作的不可见性和jvm优化时的指令重排序问题.
对当前变量的++操作可以保证原子性吗?
JVM
java内存泄漏
长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。
如何避免内存泄漏?
1.不要在for循环中创建对象
2.不要申请不可预期的内存
3.避免在循环中出现申请内存的操作
如何判断一个对象是否可以被回收?
必须同时满足下面三个条件

1.堆中不存在该类的任何实例

2.加载该类的classloader已经被回收

3.该类的class对象没有在任何地方被引用
强软弱虚
强引用
软引用
弱引用
虚引用
集合
HashMap
子主题 1
hashMap是怎么解决hash冲突的?
hashmap1.8为什么选择红黑树,而不选择AVL完全平衡二叉树?
StringBuffer、StringBuilder的区别
1.都继承自相同的父类AbstractStringBuilder
2.StringBuffer是线程安全的,而Stringbuilder则是非线程安全.
3.在使用字符串拼接的时候,底层使用的是StringBuilder进行拼接的
LinkedList链表为什么是双向?
1.单链表只有一个指向下一结点的指针,也就是只能next
2.双链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针.
数组扩容怎么实现?
hashmap\\treemap\\linkedhashmap有序性
HashMap、HashTable、ConcurrentHashMap的区别?
concurrentHashMap
ConcurrentHashMap的加锁
1.并发hashMap可能导致死循环
2.hashTable效率低下
List
ArrayList
Vector
LinkedList
底层数据结构是链表
数组和链表
Spring
Spring事务
spring事务默认对什么异常回滚?
RuntimeException和Error
源码:public boolean rollbackOn(Throwable ex) {
 return (ex instanceof RuntimeException || ex instanceof Error);
}
编程式事务
通过代码的方式实现事务
声明式事务
XML元数据驱动
注解元数据驱动
@Teansactional控制事务失效的几种情况?
1.数据库引擎是否支持事务(MyIsam不支持事务)
2.当前类未被spring管理
3.方法不是public的
spring中Bean的scope
Singleton
Prototype
线程每次调用这个bean都新创建一个实例。
Request
表示每个request作用域内的请求只创建一个实例。
Session
每个session作用域内的请求只创建一个实例。
GlobalSession
这个只在porlet的web应用程序中才有意义,它映射到porlet的global范围的session,如果普通的web应用使用了这个scope,容器会把它作为普通的session作用域的scope创建。
spring bean生命周期?
实例化
属性赋值
初始化
销毁
mybatis中#和$的区别
mybatis只有接口为什么可以运行?
CGlib动态代理
go
php
DB
MySQL
锁
锁粒度
表锁
行锁
表锁和行锁的区别?
兼容性
排他锁/写锁
共享锁/读锁
锁模式
间隙锁
Gap Locks
加在索引的区间中
Next-Key Locks
加锁时机
存储引擎
InnoDB
索引
聚簇索引
如何防止幻读?
innoDB使用MVCC+间隙锁防止幻读的出现
MVCC多版本并发控制
为什么必须要有主键?
MyIsam
char和varchar的区别
char(n) 固定长度,申请的长度就是最终的长度,类似于静态数组
varchar(n) 可变长度,类似于可变数组—列表
经常变化的字段用varchar;
知道固定长度的用char;
尽量用 varchar;
超过255字节的只能用varchar或者text;
能用varchar的地方不用text;
超长的,例如存储整个html用text。
索引类型
普通索引
唯一索引
组合索引
全文索引
like在什么情况下会用到索引?
索引策略
非聚簇索引
B树与B+树的区别
事务
Mysql的事务由存储引擎层来实现,目前支持事务的存储引擎有innodb和ndb。以innodb为例。
原子性
Redo/Undo机制
一致性
持久性
为了满足持久性,innodb采用write ahead log策略,即事务的sql执行时,先修改redolog buffer,当事务提交时,要先写redolog并马上调用fsync同步刷盘,确保落地。然后再由后台线程慢慢把脏页刷新到数据页。由此来保证数据持久性,并且兼顾性能。(对于redolog,每次写入最大为512kb,即一个磁盘扇区大小,磁盘可以保证扇区原子性。故一定可以确保即使断电也可以写完整。)
隔离性
读未提交(RU)
在ru下,innodb采用无锁实现,各事务改动实时透明可见。一般不会采用该级别,mvcc在此级别也不生效。
一个事务可以读取到另一事务未提交的数据
未解决任何问题
读已提交(RC)
在rc下,首先对于普通的select,即快照读,innodb采用mvcc实现,从而达到读写互不阻塞。
一个事务需要等另一个事务提交后才能读取数据
解决了脏读
可重复读(RR)
对于rr的快照读,同样采用mvcc实现,当前读会加next key 锁,解决幻读问题
同一个事务多次读取同样记录的结果是一致的
解决了脏读、不可重复读
不可重复读:事务前后两次读取的数据不一致
串行化(S)
解决了脏读、幻读、不可重复读
为什么?
隔离级别中的加锁是性能消耗的主要原因
读未提交
读已提交
可重复读
与读已提交相同
串行化
优化
建表的时候设置列默认值
查询较多的字段设置索引
对长sql设置慢查询
redis
工作在内存上的nosql数据库
高并发场景下分担了数据库的压力
减少了磁盘的IO
数据持久化
RDB快照
AOF日志
分布式锁
加锁通过set指令来设置值,成功则返回,否则循环等待,在timeout获取时间内仍未获取到锁,就获取失败
redis list队列和kafka的区别:

kafka实现了生产方和消费方业务的解耦
击穿
高并发请求一个恰好失效的key
怎么解决?
将热点key的过期时间调整为永不过期
雪崩
大量key在同一时间失效
不同的key设置不同的过期时间
穿透
查询一个一定不存在的key
消息队列
kafka
rabbitMQ
收藏
收藏
0 条评论
回复 删除
下一页