Java面试问题

Java

0.有看过JDK源码吗?
1.简单说一下有IO流

I/O流 分为字节流和字符流,字节流有InputStem和OutputStream,字符流有Writer和Reader
字节流一般用于传输文本信息,字符流一般用于传输视频信息

2.String、StringBuffer和StringBuilder的区别

String是一个final字符数组,引用的对象不能被改变,定义以后不能进行增删改,每次操作都会产生一个新的对象
StringBuffer和StringBuilder底层都是可变的字符数组,StringBuffer是增加同步锁,所以是线程安全的,StringBuilder则是非线程安全的

3.++变量和变量++有什么区别?哪个是先赋值后运算?

++变量: 先自加再使用
变量++: 先使用再自加
++变量和变量++对于非内置数据类型 ++变量效率高一点 ,i++不是原子操作,线程不安全

4.==和equals的区别

==:比较的是变量(栈)内存中存放的对象的(堆)地址,用来判断两个对象的地址是否是相同
equals:比较的是两个对象的内容是否是相等的

5.重写和重载的区别? 重载的参数名不同重载吗?

重写:子类把父类的方法重写一遍,方法名,参数列表,返回类型必须相同
重载:一个类中,同名的方法有不同的参数列表,参数类型,个数,顺序不同
参数名不同不是重载

6.反射的实现方式有哪几种?

反射就是程序运行的时候,能够知道任意一个类的所有属性和方法,其他对象也能调用它的任意方法,这种动态获取的信息以及动态调用对象的方法功能称为Java语言的反射机制
JDBC就是典型的反射
1.Class.forName(“类的路径”)
2.类名.class
3.对象名.getClass()
4.基本类型的包装类,可以调用包装类的Type属性来获取包装类的Class对象

7.Java方法传参是值传递还是引用传递

值传递

8.Java创建对象的集中方式

1、new创建对象 2、通过反射机制 3、采用clone机制 4、通过序列化机制

9.抽象类和接口的区别

1、抽象类要被子类继承,接口要被类实现
2、接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现
3、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
4、抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。

10.面向对象的特性

1、抽象:把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口。
2、封装:是把过程和数据包围起来,对数据的访问只能通过已定义的界面。如私有变量,用set,get方法获取。
3、继承:
4、多态:指允许不同类的对象对同一消息做出响应。


JVM篇

1.JVM内存模型

JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域跟随JVM启动及销毁,另一些区域的数据是线程独立的,随着线程创建和销毁。JVM内存分为线程私有区和线程共享区。

2.JVM性能调优

1、设置堆内存的大小 2、设定新生代大小 3、设定垃圾回收器

3.JVM类的加载机制

加载–>链接–>初始化–>使用–>卸载
加载:通过类的完全限定名,查找字节码文件,利用字节码文件创建Class对象。
链接:将符号引用代替为直接引用
初始化:静态块的初始化,静态变量的赋值。主动引用时才会初始化
使用:实例化
卸载:GC
加载机制-双亲委派模式
加载器加载类时,先把请求委托给自己的父类加载器执行,直到顶层的启动器加载器,父类加载器加载成功则返回,不则子类加载。优点:避免了重复加载

4.介绍一下Java虚拟机的垃圾回收机制

Java里,虚拟机会自动释放一个对象的内存,不需要程序员手动释放。JVM有个垃圾回收线程,当虚拟机空闲或者堆内存不足时,才会触发执行,将没有被引用的对象添加到回收的集合中,进行回收。GC最基础的算法有三种
1、标记-清除法:首先标记所有要回收的对象,标记完成后统一回收。2、复制算法:将内存分为容量相当的两块,每次使用一块,当其中一块内存用完,就将还存活的对象复制到另一块上面,然后把已经使用过的内存空间一次性清理掉。3、标记-压缩法:和标记清除法相似,区别是让所有存活的对象都向一边移动,减少内存碎片。4、分代回收算法:把java堆分为老年代和新生代,各自采用最适合的收集算法。年轻代:标记-复制法 老年代:标记-清除法

5.介绍一下JVM运行的数据区域

1、程序计数器:很小的内存空间,运行Java方法时,存储正在执行的Java字节码地址,运行本地方法时,存储为空。
2、Java虚拟机栈:每个方法执行的同时会产生一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法返回地址
3、本地方法栈:
4、堆:存放对象实例,也是垃圾回收器主要的管理工具,由于采用分代回收算法,所以还可以细分为:新生代和老年代
5、方法区:各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量。


多线程&并发

1.线程的状态,创建线程的方式

创建线程的方法:
1、继承Thread类
2、实现Runable接口 不会返回结果
3、实现Callable接口通过FutureTask包装器来创建Thread线程 可以返回结果
线程的状态6种
初始状态-等待状态-运行状态-阻塞状态-终止状态-超时等待状态(可以在指定的时间自行返回)

2.什么是死锁

是指多个进程在运行过程中因争夺有限的资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进

3.怎样解除死锁

最简单的是
1.再分配够足够的资源分配给死锁进程
2.终止一个或者多个死锁进程,直至打破循环。
还可以通过
1、预防死锁: 提前制定协议,破坏产生死锁的必要条件:请求保持条件,不可抢占条件,循环等待条件
2、避免死锁: 银行家算法
3、检测死锁:
4、解除死锁


数据结构

1.HashMap原理,产生Hash冲突怎么解决

1、拉链法:每个节点有个next指针,被分配到同一个索引的多个节点可以用单线链表存储
2、开放地址发:一旦产生了冲突,就寻找下一个空的散列地址
3、再哈希法,有多个哈希函数,当发生冲突是,使用第二个等哈希函数,直到没有冲突。

2.ArrayList和LinkList是什么

LinkList:是一个双向链表,增加删除比ArrayList有更好的性能,查找弱于ArrayList。
ArrayList:可以看做是能够自动增长容量的数组,底层实现是一个数组

3.HashMap和HashTable的区别

1、父类不同,HashMap继承了AbstractMap类,HashTable继承了Dictionary
2、对外的接口不同,HashTable比HashMap多提供了elements()和contains()两个方法
3、对null的支持不同,Hashtable:key和value都不能为null。HashMap:只能有一个Key可以为空,value可以为空。
4、安全性不同,HashTable是线程安全的,HashMap是线程不安全的,所以HashMap效率高。
5、计算hash值得方法不同
6、初始容量和每次扩容容量不同

4.List,set和Map的区别,set的数据是无序的吗,List呢?

set:存储一组唯一,无序的对象。检索能力较差,插入删除效率比较高,插入删除不会引起位置变化(TreeSet,HashSet)
list:存储一组不唯一,有序的对象。和数组类似,可以动态增长,查找效率比较高,插入删除比较差
Map:存储一组键值对象,提供键到值得映射


SSM

1.SpringMVC的工作原理

1、客户端发出HTTP请求到前端控制器(DispatcherServlet)
2、前端控制器调用处理器映射器(HandlerMapping)
3、处理器映射器找到对应的处理器对象,返回给前端控制器
4、前段控制器调用处理器适配器(HandlerAdapter)
5、处理器适配器经过适配调用具体的处理器(conntroller)
6、control处理具体业务逻辑后,返回给数据(ModelAndView)给处理器适配器,然后给前端控制器
7、前段控制器将数据交给视图解析器(ViewReslover)
8、视图解析器解析后具体的view交给前端控制器
9、前端控制器渲染视图,返回给用户

2.Spring和SpringMVC的常用注解

@RequestMapping:用于处理请求地址的映射
@RequestBody:接受HTTP请求的Json数据,将JSON数据转换为Java对象
@ResponseBody:将controller方法返回的对象转化为Json对象相应给客户
@Controller:控制类
@Service:业务类
@Repository:Dao类
@Component:被标注的类将由spring容器管理
@Autowired:由Spring提供用于Bean的注入
@Configuration:声明当前类为配置类
@Aspect:声明一个切面
@Around:定义环绕增强
@Pointcut:定义切入点

3.依赖注入有几种方式

构造方法注入
setter方法注入
接口注入

4.Mybatis的常用注解

@Mapper
@Select
@Insert@Delete@Update
@Results、@Result、@ResultMap:解决实体类名称和数据库名称不一致的问题

5.Mybatis传参时候#{}和${}的区别

#{}是预处理,KaTeX parse error: Expected 'EOF', got '#' at position 23: …串代替 Mybatis在处理 #̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量的值

6.项目的打包方式是jar还是war

SSM 是war包 ,SpringBoot是jar包

7.解释一下AOP和IOC

IOC和AOP是Spring框架的灵魂。
IOC就是典型的工厂模式,通过sessionFactory去注入实例。AOP就是典型的代理模式
IOC:控制翻转/依赖注入。
将对象交给Spring容器管理,只用在配置文件中配置相应的Bean和属性,spring容器启动的时候会把bean初始化好,然后分配给需要的类,就不用再类里面new对象了
AOP:面向切面编程。
在程序中添加交叉业务逻辑,封装成一个切面,然后注入到目标对象中。实现AOP的技术有两大类:一、是动态代理技术,利用截取消息的方式,对消息进行封装,取代原有对象行为的执行。二、是静态织入的方式,引入特定的语法,从而使编译器在编译期间织入有关代码。
代理模式:特征是代理类和委托类有同样的借口,代理类主要负责委托类预处理消息,过滤信息,把消息发给委托类,以及事后处理信息。代理类本身不处理方法,通过调用委托类对象的相关方法,提供服务。


8、Spring支持的bean的作用域

Spring容器中的 bean 可以分为5个范围
1、singleton:默认,每个容器只有一个bean的实例
2、prototype:为每个bean请求提供一个实例
3、request:为每个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收
4、session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean随之消失
5、global-session:全局作用域,

9、Spring基于xml注入bean的几种方式

set方法注入
构造器注入
静态方法注入
实例工厂注入

10.Spring的中的事务


SpringBoot和SpringCloud

1.Springboot的工作原理

1、创建模块
2、实体类的开发(导入Lombok依赖,添加@Data)
3、数据层的开发(导入Mybatis-plus、Druid数据源)
4、

2.SpringBoot的优点

独立运行:内嵌了Tomcat、Jetty容器,不用打成war包,打成Jar包就可以了
简化配置:spring-boot-starter-web自动依赖了其他组件,避免了版本冲突,减少了maven配置

3.SpringBoot的核心注解是哪个?有哪些组成?

SpringBootApplication:启动类注解
@SpringBootConfiguration:标注是配置类,会被扫描加载到IOC容器中
@EnableAutoConfiguration:打开,或关闭自动配置的功能
@ComponentScan:扫描默认包下面的符合条件的组件并加载

3.SpringCloud常见的组件有哪些??

注册中心:EureKa、Nacos
负载均衡:Ribbon
远程调用:OpenFeign
组件网关:Gateway
服务保护:Sentinel
服务配置管理组件:Nacos


Mysql

1.知道索引吗,事务?

事务:就是将一系列数据操作绑定成一个整体进行统一管理。要成功都成功,要失败都失败,ACID原子性,一致性,隔离性,持久性
索引:对数据库表中一个或者多个列的值进行排序的结构,建立索引有助于快速获取信息,不用扫描整个表。

2.修改语句的完整的语句结构,修改表的两个字段怎么修改?

修改表字段
ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型[属性]
ALTER TABLE 表名 ADD 字段名 数据类型[属性]
ALTER TABLE 表名 DROP 字段名
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY 表名(主键字段)
Alter table 表名 modify column 字段 类型(长度);
更新记录
UPDATE 表名 SET 列名 = 更新值[WHERE 更新条件]

3.插入语句的完整的语句结构

INSERT INTO 表名 [(字段名列表)] values (值列表)
INSERT INTO 表名 [(字段名列表)] values (值列表1) (值列表2)

4.删除数据记录

DELETE 表名 WHERE 条件
TRUNCATE TABLE 表名 删除所有数据

5.Mysql的数据类型

1、整数类型
TINYINt,SMALLINT,MEDIUMINT,INT,BIGINT 1 2 3 4 8
2、实数类型
FLOAT,DOUBLE,DECIMAL
3、字符串类型
VARCHAR,CHAR,TEXT,BLOB
4、枚举类型
ENUM
5、日期和时间类型
timestamp

6.Mysql常用的搜索引擎

InnnoDB:在事务处理上有优势,即支持提交,回滚和崩溃回复能力,比MyISAM占用更多的磁盘空间。适合进行频繁更新,删除操作,对并发要求较高,支持事务的系统,支持外键。
MyISAM:不支持事务,不支持外键约束,访问速度较快,适合以查询为主的系统。

7.Mysql的表的优化

限定数据范围
读/写分离
垂直分区
水平分区

8.索引什么时候会失效

1、如果条件中有or,即使其中有条件带索引也不会使用
2、对于多列索引,不是使用的第一部分(第一个),则不会使用索引
3、like查询是以%开头
4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5、如果mysql估计使用全表扫描要比使用索引快,则不使用索引

9.什么是内连接、左外连接、右外连接

内连接:匹配两个表中相关联的记录
左外连接:除了匹配两个表中相关联的记录外,还会匹配左表中剩余的记录
右外连接:除了匹配两个表中相关联的记录外,还会匹配右表中剩余的记录


Linux指令

1.查看文件内容的命令有哪些?

vi 文件名 查看/修改
cat 文件名 查看
more 文件名 分页显示文件内容
tail 文件名 查看尾部内荣
head 文件名 查看头部内荣

2.创建文件和文件夹的命令,修改文件权限

mkdir 创建文件夹
touch 创建文件
chmod

3.查找文件是否存在的命令

find /-name mysql
where is mysql

4.编写文件的命令

vim

5.移动,复制,删除,查找某个文件的命令

mv cp rm find/local 文件名

7.查看所有进程,查看所有进程的信息

ps -ef
ps -ef | grep pid

8.查看IP地址和接口信息

ifconfig

9.查看网络连通

netstat

10.查看磁盘使用空间

df -h


设计模式和算法

1.了解哪几个设计模式

1、工厂模式
2、单例模式
3、代理模式
4、模板模式
5、观察者模式

2.解释一下工厂模式

这里是引用

3.解释一个单例模式,饿汉式和懒汉式

这里是引用

4.工厂模式哪个是接口哪个是工厂

这里是引用

5.介绍一下排序算法,Java sort 是用的哪些排序算法

这里是引用

6.写一下冒泡算法

这里是引用

7.KMP算法

这里是引用


项目

1.视频功能的前后端流程
2.视频功能传递了哪些参数
3.Vue用过吗?
4.了解,用过MQ消息队列吗?


网络

1.Http协议

使用了TCP协议,保证了数据的可靠性。端口号是80
是无状态的,同城使用cookie+数据库的方式来跟踪用户的活动
既可以使用持久链接,也可以使用非持久连接
有请求报文和响应报文

2.TCP/IP模型有多少层

4层:应用层(应用层+表示层+会话层),传输层(传输层),网际层(网络层),网络接口层(数据链路层+物理层)

3.TCP和UDP的区别? TCP和UDP的应用场景?举几个例子

这里是引用

4.介绍一下websocket,websocket是基于什么传过去?

这里是引用


Redis

1.用过Redis吗?


git和svn

1.用过git吗

用过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值