JAVA面试题总结

  1. HashMap
    a) 默认加载因子=0.75
    b) 容量分配 = 16(必须是2的幂次)
    c) 注释:如何保证起始容量是2的幂次呢?构造方法中会重新查找不比指定数值大的

  2. LinkedHashMap根据放入顺序进行排序;TreeMap根据对键的大小进行排序。

  3. 减小高并发: 页面静态化、文件管理器、负载均衡、反向代理、缓存、数据库读写分离

  4. 设计模式
    i. 工厂模式:
    ii. 单例模式:避免创建不必要的对象,创建相同的对象,减少new占得内存空间,只能有一个示例,只能自己给自己创建实例
    iii. 适配器模式:建一个大家都可以使用的接口,两个不兼容接口之间的桥梁,结合了两个独立接口的功能。

  5. 多线程
     实现runnable 代码块上加synchronized
     如何保证线程T1结束执行T2,,T2结束执行T3。用join方法。
    T.join();表示等待线程T结束完毕

  6. 网络编程
    a) TCP:三次握手,确定、同意、连接;四次挥手。可靠性强,速度慢,不安全(占用资源高);传输大量性
    四次挥手,A向B发送释放请求,请求->确认,A不再发送数据给B。
    B向A发送释放请求,请求->确认, B不再发送数据给A;
    b) UDP:无连接,发送数据不需要建立连接。可靠性差;速度快,安全;传输少量性
    c) HTTP:是应用层的一个协议,是we服务端传输文本到本地浏览器的传送协议

  7. 负载均衡
    a) Http重定向实现负载均衡:客户端向调度服务器发起请求,调度者分配一台服务器给客户端,并将服务器的ip封装到http响应头的部的location中,最终返回给浏览器。调度者采用随机分配,轮询策略。缺点很多,例如无法知道当前服务器的压力,判别服务器是否故障等等;
    b) DNS负载均衡:用户向服务器发起请求。一个域名下会含有多个ip,DNS通过分析将一个合适的ip返回给用户,用户再向该ip发起请求。优点:配置简单方便。缺点:和Http一样无法获知服务器的负载压力;
    c) 反向代理负载均衡:反向代理服务器位于服务器之间,所有请求都会经过反向代理服务器;反向代理可以隐藏服务器,所有浏览器不会直接与后端服务器直接交互;反向代理可以知道哪个服务器的负载压力大,从而达到合理分配;可以检测服务器故障,从而达到故障转移;
    Nginx负载均衡机制:
     轮询机制-循环分发对应用服务器的请求;
     最少连接机制-将请求分发给连接数最小的服务器;
     ip-hash机制-通过计算hash决定分配给哪一台服务器;

  8. jvm(java虚拟机)
    a) 堆:new的对象都放在堆里,存放对象实例;
    b) 栈:线程每次执行一个方法都会形成一个栈帧放在栈中;
    c) 方法区:方法、final常量、类信息、静态变量、属性都在里面;
    d) 程序计数器(Program Counter Register):通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
    e) 垃圾回收机制:

f) JVM运行流程:

g) JVM基本结构:

9.基础
(1)wait() 和 notify() 使用
(2)sleep() 和 wait() 的区别
(3)volatile用处和原理(这个很重要,需要深刻理解Java内存模型把)

10、微服务
a) 足够小,开发简单,小团队就可以完成开发。
b) 解耦,一个服务只专注做一件事情,不会干扰其他功能,
c) 微服务里面只有业务逻辑代码,不会和前端页面混合
d) 服务与服务之间采用的是轻量级的基于Http协议的Restful Api技术,灵活
e) Doubbo是rpc(远程调用),springcloud是restful api

11、微服务调优
日志调优:1)减少日志量,只记录关键信息到日志文件。
2)减少log4j配置log4j.additivity.monitorLogger=false
设置监控logger的日志不会输出到rootlogger
log4j.appender.monitorAppender.BufferedIO=true
log4j.appender.monitorAppender.BufferSize=8192

12、springboot过滤器
继承Filter,类上加@webfilter(urlPatterns="/*") 或者直接加上@configration

13、mysql引擎
InnoDB:支持自增长列,行级锁,支持外键,主要是支持分布式事务,
MyisAM:不支持事务,不支持行级锁,等。。支持三种不同的存储结构,静态型,动态性,压缩型

14、线程池(ThreadPoolExcutor)
创建:四个构造器
public class ThreadPoolExecutor extends AbstractExecutorService {

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue workQueue);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
        BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
        BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
    BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
...

}
减少线程创建和销毁的次数,可以重复取线程,需要用线程可以直接取,方便

15、接口可以多继承接口
子类可以重写父类的public、protect方法,使用父类变量需要用super.变量
抽象类不可以实例化

16、面向对象
三大特征:封装、继承、多态;
封装:将客观事物封装成一个类,类里包含事物的信息
继承:子类对父类的继承,对原有类的功能进行扩展
多态:一个类实例的相同方法在不同情形下有不同的表现形式。

17、Spring
IOC(控制反转),以前创建对象需要new,但是如今spring为你new,交给spring去管理,直接使用即可;
AOP(面向切面编程):spring中对事务控制,权限校验,日志记录等等,找到有共同特性的代码,开发时拆分,用的时候合并

18、脏读:一个事物访问数据,准备修改事务,又进来一个事务,这个事务在第一个事务还没修改成功就读取数据。这个时候第一个事务便读取到了脏数据;
不可重复读:事务A多次读取数据,事务B访问数据并且进行更改,事务A读到了B更改前的数据,又读到了更改后的数据,两次数据不同。这个时候便产生了不可重复读。

19、悲观锁:只要别人拿数据,都认为别人会修改数据,就给数据库加锁,
乐观锁:每次别人拿数据都认为不会修改数据。不会上锁,但是在更新的时候都会判断别人有没有更新数据

20、public可以在所有类中使用,private只能在自己的类里使用,protect可以在自己和自己的子类使用

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值