java面试题2022

一.java基础

1.jdk和jre

jdk是java开发工具包,jre是java运行环境,jdk包含jre,运行java程序jre就够了,开发java程序需要jdk。

2.Object类常用方法

equals(),hashcode(),wait(),notify(),notifyAll()

3.什么情况下需要重写equals()和hashcode()方法

自定规则进行实体类比较时。

4.java特点

继承,封装,多态

5.基本数据类型

byte,short,int,long,float(4字节单精度),double(8字节双精度),char,boolean

6.String,StringBuffer,StringBuilder

String 引用类型

StringBuffer 线程安全,效率低,代码内部加锁

StringBuilder 线程不安全,效率高,推荐优先使用

7.重写和重载

重写 方法名相同,参数类型个数都相同

重载 方法名相同,参数类型个数不同

8.抽象类和接口

抽象类 单继承,可以没有抽象方法

接口 多继承,接口中只有抽象方法**注:jdk1.8开始接口中其实也可以写方法的实现

9.==和equals()

== 基本数据类型:比较值是否相等;引用类型:比较内存地址。

equals() 推荐用于字符串比较,若没有重写等效于==。

10.HashMap HashTable CurrentHashMap

HashMap 线程不安全 底层为数组+链表+红黑树 无序,允许key value为null,默认大小为16,大小一定是2的幂

HashTable 线程安全 效率低 不推荐使用

CurrentHashMap 线程安全 相较于HashTable锁的粒度更细,效率高于HashTable

11.ArrayList,LinkedList,Vector

ArrayList 底层基于动态数组,查询效率高,get()方法直接通过数组下标获取

LinkedList 底层基于双向链表,通常情况下插入和删除效率高

Vector 线程安全 内部加锁 效率低

12.构造方法

可以重载,不可继承,不可重写

13.静态变量和成员变量的区别

静态变量在类加载时加载,储存在方法区,和类共存亡

成员变量存放在堆中

14.泛型

参数化类型,把确定类型的工作推迟到使用之前

15.反射

在运行状态中,对于任意类都能知道他的属性和方法;对于任意对象,都能调用他的属性方法。

创建对象的两种方式,new和反射

二.多线程

1.开启多线程

继承Thread类,实现Runable接口,实现Callable接口,使用线程池

建议实现Runable接口,接口可以多继承,Runable和Callable的区别,Runable是void,Callable有一个泛型返回值

2.线程生命周期

创建,就绪,运行,阻塞,死亡

3.线程死锁

两个或两个以上的线程进行资源争夺相互等待的现象;避免:指定取锁顺序(使用join)

4.并发和并行

并发:时分多址,快速交替进行

并行:同时进行

5.sleep()和wait()

sleep()属于Thread类,不释放锁

wait()属于Object类,释放锁,需要和notify()在同一个对象上成对使用

6.notify()和notifyAll()

notify()随机唤醒一个线程去竞争取锁机会

notifyAll()唤醒所有线程去竞争取锁机会

7.synchronized 和Lock

synchronized java内置关键字,可以用在类,方法或者代码块上

Lock类 大多数情况下推荐使用synchronized

8.多线程之间通信

wait/notify

9.ThreadLocal

提供线程内部的局部变量,变量只在线程的生命周期起作用

10.守护线程

java中的线程分为两种类型,守护线程和非守护线程,垃圾回收线程就是一个典型的守护线程。

11.线程同步有哪几种方法

synchronized关键字,Lock类,分布锁

12.分布锁

悲观锁 select...for update

乐观锁 CAS 

redis及zookeeper也可实现分布锁

13.start()和run()

start()方法才能开启多线程,run()方法只是调用了线程中的mian方法并没有开启新的线程。

14.yield()

调用后线程会回到就绪状态,只给同级或高优先级线程运行机会。

15.终止一个线程

(1).stop()不推荐 (2).等待线程运行结束

16.volatile

修饰变量 保证每次调用变量时都从主内存读取,保证多线程间的可见性。

17.线程池的好处

方便管理线程,减少资源消耗,提高响应速度

18.线程池常用参数

核心线程数,工作队列,最大线程数,拒绝策略,空闲线程存活时间

19.BIO,NIO,AIO

BIO同步阻塞线程;

NIO同步非阻塞IO;

AIO异步非阻塞IO,又叫NIO2;

三.JVM

1.JVM是什么

java虚拟机

2.JVM的结构

堆:存放对象实例,垃圾回收的主要场所,线程共享;

方法区:存放已经被虚拟机加载的类信息,常量和静态变量,还有编译后的代码,线程共享;

虚拟机栈:每个线程创建时都会创建一个虚拟机栈,线程中每个方法又对应一个栈帧,线程私有;

本地方法栈:给虚拟机提供native方法,线程私有;

程序计数器:java的指针,线程私有。

3.垃圾回收是什么

将没有被引用的对象加入可回收集合集中回收,释放内存。

4.垃圾回收算法

可达性分析算法,以“GC ROOT”对象向下搜索,所走过的路径被称为引用链,当引用链没有其他连接是,则被称为可回收对象。

5.垃圾回收的影响

频繁的垃圾回收会影响性能,垃圾回收时会“Stop the world”,造成卡顿。

6.垃圾回收的时机

自动垃圾回收,所有线程空闲时会进行垃圾回收,内存不足时也会触发垃圾回收;

主动垃圾回收System.gc();

7.内存泄漏和内存溢出

内存溢出(内存不够了)会导致内存泄漏。

8.栈溢出

栈的大小超出了栈的深度。

案例:无限递归方法造成栈溢出。

9.堆内存和栈内存

堆内存:存放对象,所有线程共享;

栈内存:占内存归属于单个线程,可以理解为线程私有内存,栈内存远远小于堆内存。

四.mysql

1.索引

索引结构B+树,索引会增加查询效率,但会影响插入和删除的效率,加索引的字段不要太长,影响效率.

2.索引失效条件

查询条件包含or

对索引运算

mysql估计全表扫描比索引快时

3.索引不适合的场景

数据量小

更新频繁

4.sql关键字调用顺序

from

join

on

where

group by

having

select

distinct

order by

limint

5.sql优化

加索引,适当分批,分库分表,读写分离

6.分库分表

水平分表,水平分库

垂直分表,垂直分库

7.事务的特点

原子性,隔离性,唯一性,持久性

8.悲观锁,乐观锁

悲观锁:select  ... for update

乐观锁:CAS

9.使用数据库连接池的好处

资源复用,系统响应速度更快,统一管理连接。

10.大数据量删除怎么样更快

先删除索引,然后删除数据,最后恢复索引。

四.spring

1.spring核心思想

IOC控制反转 由spring IOC负责创建对象

AOP 面向切面编程 

2.springboot优点

独立运行,简化配置,自动配置,无需部署war文件。

3.springboot自动配置原理是什么

@EnableAutoConfig,@Configuration,@ConditionalOnClass组成了spring自动配置的核心。

通过maven读取每个starter中的spring.factories文件,该文件配置了所有需要被创建再spring容器中的bean。

4.@Component和@Bean

作用对象不同:@Component作用于类,@Bean作用于方法

@Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中。

@Bean注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。

五.redis

1.redis是什么

运行在内存中的非关系型数据库,绝大部分请求是纯粹的内存操作(非常快速),采用单线程,避免了不必要的上下文切换和竞争条件,非阻塞IO,多路复用。

2.redis基本数据类型

String,list,hash,set,zset

3.缓存穿透,缓存击穿,缓存雪崩

缓存穿透:

        指查询一个不存在的数据,如果查不到则不写入缓存,这将导致这个不存在的数据每次都要到数据库去查询,可能导致数据库挂掉。

        解决方法:返回数据为空仍进行缓存,但过期时间较短

缓存击穿:

        对于设置了过期时间的key,缓存某个时间点过期后,恰好这个key有大量请求过来,这些请求发现缓存过期都或从数据库加载数据并设回缓存,大并发量请求可能回压垮数据库。

        解决方法:使用互斥锁,缓存失效时,不立即查询数据库,使用redis设置互斥锁,重新设回缓存。

缓存雪崩:

        设置缓存时使用了相同的过期时间,导致某一时刻缓存全部失效,大批量请求压垮数据库,导致瞬时压力过重雪崩。

        解决方法:将缓存失效时间离散开,防止集体失效。

六.netty

1.什么是netty

基于NIO的高性能网络编程框架,封装了NIO,可以承载较高的并发量。

2.netty组件

Channel:netty网络操作的抽象类,含有基本IO操作。

EventLoop:配合Channel进行IO处理。

ChannelPipeline:为Channel提供容器。

ChannelFuture:为异步方法提供返回。

ChannelHandler:出战入站数据的逻辑处理器。

3.netty默认线程数

CPU核心数量*2

七.其他

1.session和cookie和区别

session:存于服务器,安全性更高,可以存储java对象。

cookie:存于浏览器,对服务器性能压力小,只能存储String。

2.TCP和UDP

属于七层协议的传输层

TCP:需要三次握手建立连接,需要一对一进行连接,对系统资源要求较多。

UDP:不需要连接,支持多对多交互通信,对系统资源要求较少。

3.java-socket

java对TCP协议的具体实现。

4.OSI七层协议

应用层,表示层,会话层,传输层,网络层,数据链路层,物理层

5.TCP/IP五层协议

应用层,传输层,网络层,数据链路层,物理层

6.HTTP是什么

超文本传输协议,属于七层中的应用层。

7.servlet生命周期

加载类-->实例化-->初始化-->请求处理-->销毁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值