java面试题汇总

1 谈一下你对反向代理的理解?

不知道真实的服务器
a.反向代理服务器介于用户于目标服务器之间
b.用户以为反向代理服务器就是目标服务器
c.用户无需关心真实的服务器地址,反向代理机制保护了目标服务器的信息.

2 谈一下你对正向代理的理解?

知道真实的服务器 典型:路由器
a.代理的服务器介于用户和目标服务器之间
b.用户发送请求时,明确告知代理服务器访问的真实地址是谁?
c.正向代理保护了客户信息,服务器无需了解真实的访问者到底是谁.
正向代理通常用在网络请求中(路由器.)

3 nginx命令

在nginx根目录执行
1.启动 start nginx
2.重启 nginx -s reload
3.关闭 nginx -s stop

4 HOSTS 文件的作用是什么?

在本地域名与ip地址的映射

5 如何讲项目打包成jar? 如何执行.jar项目

package/install
java -jar xxx.jar

6 实现集群配置

集群的配置 jts集群名字
upstream jts {
server localhost:8091 weight=1;
server localhost:8092 weight=4;
}

7 负载均衡策略

负载均衡:将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

1:轮询(根据配置文件的顺序 以此访问服务器)
2:权重(根据设置的权重大小 挑选哪台服务器优先访问)
3:IPHash(如果需要用户与服务器进行绑定,则使用该策略 )

8 如何创建vue对象

var app = new Vue();

9 数据库数据如何备份(数据备份策略)

1.冷备份:定期将数据库中的文件进行转储,定期进行数据备份.
2.热备份:搭建数据库主从结构,当主库数据发生改变时,从库根据主库的二进制日志文件进行备份.
3.双机热备:数据库互为主从,数据库代理服务器对主库进行心跳检测(心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。),实现数据的高可用,
为了防止主库宕机后发生雪崩现象
(定时刷新清理缓存中的key时,Redis缓存中大面积key失效,从而导致大量请求直接访问了数据库,导致数据库崩盘。)

10 数据库压力大时,怎么实现高可用

1.用数据库代理服务器搭建数据库的读写分离进行分流.读取从库数据,写数据在主库
可用的数据库代理服务器有Amoeba和Mycat
由于大量的用户的数据库操作都需要通过数据库来完成.造成数据库负载过高.因为数据库操作中查询的操作占很大的比重.
2.数据库实现双机热备.

11 数据库的优化策略

1.优化sql语句(多表操作) where 左连接 右连接 内连接
原则:尽可能根据主键查询,尽可能少用关联查询.
2.创建索引(对经常查询的数据创建索引)
3.添加缓存(Redis/MemCache)
4.定期进行数据转储(将一些查询较少的数据保存到历史表,让当前表维护可控的数据量)
5.分库分表(需要大量的数据库服务器)

12 消息队列有几种工作模式

1.简单模式2.工作模式3.发布订阅模式4.路由模式 5.主题模式 6.RPC模式

13 常用默认端口

端口号用途
1521Oracle数据库端口
3306Mysql数据库端口
6379Redis数据库端口
80Nginx服务器端口
8080Tomcat服务器端口
8848Nacos注册中心端口

14 重载与重写有什么区别?

重载: 是指在一个类中的现象,是指一个类中有很多同名的方法,但是方法的参数列表不同
重写: 是指发生了继承关系以后(两个类),子类去修改父类原有的功能
语法规则:子类的方法签名(返回值类型 方法名(参数列表) )与父类一致
重写方法的修饰符: 子类权限 >= 父类的权限
重载的意义: 是为了方便外界对方法进行调用,什么样的参数程序都可以找到对应的方法来执行,体现的是程序的灵活性
重写的意义:是在不修改源码的前提下,进行功能的修改和拓展
(OCP原则:面向修改关闭,面向拓展开放)

15 接口和抽象类有什么区别?

抽象类是一个特殊的类,特殊在,抽象类中可以包含没有方法体的方法(抽象方法)
接口可以理解成一个特殊的抽象类,特殊在,接口里的都是抽象方法,没有普通方法
接口会为方法自动拼接public abstract,还会为变量自动拼接public final static
抽象类可以有构造方法–用来给子类创建对象,接口中没有构造方法
抽象类和接口都不能实例化(创建对象)
接口可继承接口,并可多继承接口,但类只能单继承
抽象方法只能声明,不能实现,接口是设计的结果 ,抽象类是重构的结果

16 创建多线程的方式有几种?分别是什么?线程死锁是如何产生的?如何防止线程死锁

1.继承Thread类,并且创建对象。
2.实现Runnable接口,将Runnable接口的具体对象作为参数创建Thread对象。
3.另外也可以使用Executer创建并重用线程

死锁产生的原因
1.系统资源的竞争
通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
2.进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都 会因为所需资源被占用而阻塞。
信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这 些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。

如何防止线程死锁
1.加锁顺序(线程按照一定的顺序加锁)
2.加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
3.死锁检测
https://www.cnblogs.com/sthu/p/9660914.html

17 String, StringBuffer, StringBuilder 的区别?

1.String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。
2.由于字符串链接会自动创建StringBuilder对象,为了避免复杂字符串拼接时候大量创建StringBuilder对象,可以利用StringBuilder优化字符串链接操作。
3.StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。

18 TCP和UDP的区别?哪个是三次握手协议?

TCP是面向连接的,UDP是面向无连接的
TCP保证数据的正确性,UDP可能丢包
TCP传输速度慢,UDP传输速度快
每一条TCP的建立是点到点的,而UDP可以点到多,多到多,多对一的交互
TCP对系统要求的资源多,UDP则少一点

TCP是三次握手协议
https://blog.csdn.net/weixin_44844089/article/details/105929508

19 Mybatis中$和#在xml中取值有什么不同?

#{}是预编译处理,$ {} 是字符串替换;
Mybatis在处理# {}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理$ {}时,就是把${}替换成变量的值;
使用#{}可以有效的防止SQL注入,提高系统安全性。

20 转发(forward)和重定向(redirect)的区别?

转发是服务器行为,重定向是客户端行为。
1.地址栏显示
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.数据共享
forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据.
3.运用
forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
4.从效率来说
forward:高. redirect:低.

21 用最有效率的方法算出2乘以8等于多少?

2乘以8等於几的最效率的方法是2 << 3

22 Spring常见的注解有哪些?

组件类注解
@Component :标准一个普通的spring Bean类
@Repository:标注一个DAO组件类
@Service:标注一个业务逻辑组件类
@Controller:标注一个控制器组件类

装配bean时常用的注解
@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值
@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。 @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
PS:@Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualifier进行限定。

23 Tomcat如何修改端口号,如何清除项目缓存,默认并发量是多少?

tomcat的安装路径,进去conf目录,打开server.xml文件进行修改
清除tomcat缓存:
进入tomcat的安装目录进行清理缓存:删除work、temp目录下的所有文件及文件夹和webapps目录中的项目目录。可以把Catalina目录删除。注意:不能把work整个目录删除,不然重启tomcat时,会把conf/web.xml删除掉,这样在启动时,日志会提示:No Default web.xml,且访问页面会显示404错误。
清除项目缓存:Files–Invalidate Caches/Restart
默认并发量:1w

24 一个汉字几个字节,一个char类型的变量,能储存一个汉字吗?

常用中文字符用utf-8编码占用3个字节(大约2万多字),但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字)。
GBK、GB2312收编的汉字占2个字节,严格地用iso8859-1无法表示汉字,只能转为问号
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字

25 多线程中run和start方法有什么区别?

run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

26 静态变量和实例变量有什么区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

27 前后台数据交互的方式有哪些?

1.利用cookie
前台通过登录来存储cookie
后台通过req.cookies()来获取存储的cookie信息
2.利用Ajax
在学习NodeJS之前最常用的前后端交互大都利用ajax 和JQuery中已经封装好的$ .ajax、$ .post、$ .getJSON 通过创建一个XMLHttpRequest对象,来进行前后端交互。
在学NodeJS之后我们也利用依赖于$http服务自己搭建的_http来完成get、post和jsonp的方式来进行前后端交互;
3.jsonp
jsonp是前后端结合跨域方式,因为前段请求到数据需要在回调函数中使用,所以后端得将数据放回到回调函数中
4.服务端渲染
浏览器请求到的内容其实可以通过后端加工一下,将一会数据直接渲染好,再给浏览器就可以了
5.webSocket和Socket.io
网上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端成为一个scoket
通过建立socket双向连接,就可以让客户端和服务端直接进行双向通信

28 Redis支持哪些数据类型的存储?

Redis 支持五种数据类型:String(字符串)、Hash(哈希)、List(列表),set(集合)、zset( sorted set:有序集合)

29 Nosql主要支持哪两种数据存储系统?

键值存储数据库:Oracle BDB、Redis、BeansDB
列式储数数据库:HBase、Cassandra、Riak
文档型数据库:MongoDB、CouchDB
图形数据库:Neo4J、InfoGrid、Infinite Graph

30 MongoDB的体系逻辑结构,主要有什么组成?

MongoDB 的逻辑结构是一种层次结构。主要由:
文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。

31 Redis和MongoDB分别应用于哪些应用场景?

mysql:常规关系型数据库。
redis:注重高性能,适用于即时性要求高的业务,比如:秒杀系统。
mongodb:注重大量数据,适用于插入低价值业务数据的场景,比如:日志系统;数据不是特别重要(例如:通知、推送等),数据表结构变化较为频繁,数据量特别大,数据并发性特别高(例如:地图的位置坐标),这些情况下用MongoDB,其它情况还是用MySQL,这样组合就可以达到最大的效率。

32 如何给一张表增加一个字段,写出sql语句

alter table 表名 add 字段 类型 not null default 0
alter table employee add spbh varchar(20) not null default 0

33 分别写出oracle、mysql的分页关键词?

MYSQL分页:使用limit关键字.
Oracle分页:使用rownum
SQLServer分页:使用top关键字.

34 谈谈Spring AOP的原理

在系统启动时, 为目标类型创建动态代理对象.
创建方式有两种:
1.JDK动态代理.借助JDK官方API为目标对象类型创建其兄弟类型对象,但是目标对象类型需要实现相应接口.
2.CGLIB动态代理. 借助CGLIB库为目标对象类型创建其子类类型对象,因为需要继承目标类,因此目标对象类型不能使用final修饰.

35 DI有几种方式、分别是什么?

Spring 依赖注入有四种方式:属性(setter)注入,构造器注入,静态工厂方法注入,实例工厂方法注入。最常见的是属性注入和构造器注入。

36 什么是IOC?

控制反转(Inversion of control ).
所谓控制的反转即对象控制权的转移,我们不再需要自己去管理和控制对象,而是将对象的完全交给IOC容器去管理,由他来替我们进行对象的创建和销毁等操作,帮我们查找及注入依赖对象,对象只是被动的接受依赖对象.

37 简述servlet 生命周期?

Servlet的生命周期可以分为四个阶段:
1.装载类及创建实例阶段: 在默认情况下Servlet实例是在第一个请求到来的时候创建,以后复用.
2.初始化阶段: Web服务器会自动调用init(ServletConfig config)方法来初始化该Servlet.
其中方法参数config中包含了Servlet的配置信息,比如初始化参数,该对象由服务器创建.
3.服务阶段: Servlet实例被服务器用来服务于客户端的请求并生成响应.
在服务阶段Web服务器会调用该实例的service(ServletRequest request, ServletResponse response)方法,request对象和response对象有服务器创建并传给Servlet实例。request对象封装了客户端发往服务器端的信息,response对象封装了服务器发往客户端的信息.
4.实例销毁阶段: 当Web服务器认为Servlet实例没有存在的必要了,比如应用重新装载,或服务器关闭,以及Servlet很长时间都没有被访问过。服务器可以从内存中销毁(也叫卸载)该实例。Web服务器必须保证在卸载Servlet实例之前调用该实例的destroy()方法,以便回收Servlet申请的资源或进行其它的重要的处理.

38 谈谈你对MVC的理解?

MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。
然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。

39 Spring MVC工作原理

在这里插入图片描述

1.用户发送请求至前端控制器DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet调用HandlerAdapter处理器适配器。
5.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6.Controller执行完成返回ModelAndView。
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9ViewReslover解析后返回具体View。
10DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11.DispatcherServlet响应用户。

40 用户在浏览器中输入URL之后,发什么了什么?写出请求和响应的流程

1.URL 解析: 地址解析, HSTS, 其他操作(比如安全检查 访问限制), 检查缓存
2.DNS查询: 浏览器缓存, 操作系统缓存, 路由器缓存, ISP DNS缓存,根域名服务器查询
3.TCP连接:
应用层:发送 HTTP 请求
传输层:TCP 传输报文
网络层:IP协议查询Mac地址
链路层:以太网协议
4.服务器处理请求
5.浏览器接受响应
6.渲染页面

41 什么是ORM

ORM(Object-Relationl Mapping)是对象关系映射, 是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术, 它的作用是在关系型数据库和对象之间作一个映射, 这样,类名就可以对应数据库中的表名,类属性可以对应数据库里的字段,类实例对应数据库表里的一行数据.
用于实现面向对象编程语言里不同类型系统的数据之间的转换
Java典型的ORM中有:
hibernate:全自动的框架,强大、复杂、笨重、学习成本较高
Mybatis:半自动的框架(懂数据库的人 才能操作) 必须要自己写sql
JPA:JPA全称Java Persistence API、JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,是Java自带的框架

42 数据库集群模式下,如何保证主从数据库的数据一致性?以mysql数据库为例进行说明配置步骤?

保证主从数据库一致性方案:
1.半同步复制: 主库发生增删改操作的时候,会等从库及时复制了并且通知了主库, 才会把这个操作叫做成功.
2.数据库中间件记录key: 设一个key记录着一次写的数据,然后设置一个同步时间,如果在这个时间内,有一个读请求,看看对应的key有没有相关数据,有的话,说明数据近期发生过写事件,这样key的数据就继续读主库,否则就读从库.

连接mysql,安装半同步复制插件
master服务器执行命令:
-> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
slave服务器执行命令:
-> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
查看插件是否安装成功:
-> show plugins;
修改my.cnf文件:
master服务器添加配置:
# 启动加载 semisync_master.so 插件
plugin-load="rpl_semi_sync_master=semisync_master.so"
# 开启master半同步复制
rpl-semi-sync-master-enabled = 1
slave服务器添加配置:
# 启动加载 semisync_slave.so 插件
plugin-load="rpl_semi_sync_slave=semisync_slave.so"
# 开启slave半同步复制
rpl_semi_sync_slave_enabled=1
添加完配置后重启master和slave服务器的mysql,并查看半同步状态是否已启用:
master服务器查看:
-> show status like ‘Rpl_semi_sync_master_status’;
slave服务器查看:
-> show status like ‘Rpl_semi_sync_slave_status’;

43 简述单例模式的特征和应用场景?

–特征
单例模式可以保证应用该设计模式的一个类在内存中的对象只有一个, 可以节约系统内存空间,控制资源的使用.
–应用场景
1.资源共享的情况下,为了避免由于资源操作时导致的性能或损耗的场景, 如日志文件,应用配置等.
2.控制资源的情况下,方便资源之间的互相通信,如线程池等.

44 写一单实例类要求精简、清晰?(单例模式)

class MySingle{
    private MySingle(){} 						//私有化构造方法
    private static MySingle single; 			//声明本类静态对象
    public static MySingle getMySingle(){ 	//提供对外的静态创建对象方法
        if (single == null) {
            single = new MySingle();			//没有对象时才创建对象
        }
        return single;
    }
}

45 构造器(constructor)是否可被重写(override)?是否可被重载?是否可被继承?

构造器不能被继承,因此不能被重写,但可以被重载.

46 JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

–相同点
它们本质上都是java类.
–不同点
1、JSP经编译后变成Servlet.
2、jsp更擅长表现于页面显示,Servlet更擅长于逻辑控制.
3、Servlet的应用逻辑是在java文件中,并且完全从表现层中的HTML里分离开来.而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件.
–联系
JSP是Servlet技术的扩展,本质上是Servlet的简易方式.

47 Collection 和 Collections的区别

Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供最大化的统一操作方式.
Collections是一个包装类。它包含各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架.

48 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

相同的地方:都属于交互方式,都是发送请求。
不同的地方:一个需要等待,一个不需要等待;同步安全性高,异步效率高.

举例:
同步: 电话 银行的转账系统 对数据库的保存操作等
异步: 网页的局部刷新利用了异步访问

49 abstract class和interface有什么区别?


接口的方法默认为public abstract,所有方法均为抽象方法(指jdk1.8版本以前);
抽象类中既可以有抽象方法也可以有普通方法.

接口中的变量默认为public static final,而抽象类中变量不一定.

一个类可以实现多个接口,但不能实现抽象类.

一个类实现接口要实现接口内所有抽象方法,抽象类则不一定.

接口不能实例化,但可以声明,必须引用一个实现该接口的对象.

50 J2ee常用的设计模式?说明工厂模式?


创建型(工厂、工厂方法、抽象工厂、单例)
结构型(包装、适配器,组合,代理)
行为(观察者,模版,策略)

工厂模式: 工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例.

51 如何实现集群模式下,session共享?

1.粘性session
粘性session是指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,即将用户与服务器绑定。
2.服务器session复制
即每次session发生变化时,创建或者修改,就广播给所有集群中的服务器,使所有的服务器上的session相同。
3.session共享
缓存session,使用redis, memcached。
4.session持久化
将session存储至数据库中,像操作数据一样才做session。

52 Java中四大引用?

ONE,强引用(StrongReference)
TWO,软引用(SoftReference)
THREE,弱引用(WeakReference)
FOUR,虚引用(PhantonReference)

53 final,finally和finalize的区别

final为常量关键字,而finally为异常关键字,finalize为object自带方法名
在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)
finally关键字用在异常处理中,用于处理异常后的清理工作,实际中一般用于关闭文件流,释放资源等操作。
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。

54 简述冒泡排序

基本思想: 冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。
直观表达,每一趟遍历,将一个最大的数移到序列末尾。

public class BubbleSortMain {

    public static void main(String[] args) {
        int[] arr = {2,5,1,3,8,5,7,4,3};
        bubbleSort(arr);
        ArrayUtil.print(arr);
    }
    private static void bubbleSort(int[] arr) {
        if(arr==null || arr.length < 2 ){
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i -1; j++) {   // 这里说明为什么需要-1
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

55 什么是热部署

正在运行状态的应用,修改了它的源码之后,在不重新启动的情况下能够自动把增量内容编译并部署到服务器上,使得修改立即生效

56 AOP环绕通知的方式

基于注解@Around
基于XML配置文件

57 简述动态代理

在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术,在生成代理对象过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法,可以理解为在运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作
JDK动态代理,CGLib动态代理

58 什么是反射?反射有哪些作用

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问检测和修改其本身状态或行为的一种能力.在Java环境中,反射允许程序在运行时获取某个类自身的定义信息,如属性和方法等,也可以实现动态创建类的对象,变更属性的内容或执行特定的方法的功能.
在运行时,判断任意一个对象所属的类型
在运行时,构造任意一个类的对象
在运行时,判断任意一个类所具有的的成员变量的方法
在运行时,调用任意一个对象的方法,甚至可以调用private方法

59 并行和并发的区别

并行,把每一个任务分配给每一个处理器独立完成,在同一时间点,任务一定是同时运行的
并发,把任务在不同时间点交给处理器进行处理,在同一时间点任务不会同时运行
并发不是并行,并行是让不同的代码片段在不同的物理处理器上执行,并行关键的是同时做很多事情,而并发是同时管理很多事情,可能这些事情只做到一半就去做别的事情.

59 深拷贝和浅拷贝的区别

区别:浅拷贝只是增加了一个指针指向已存在的内存地址,仅仅指向被复制的内存地址,如果地址发生改变,那么浅拷贝出来的对象也会发生相应的改变,深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向新的内存
1.浅拷贝可以使用列表自带的copy(),或者使用copy模块的copy(),深拷贝只能使用copy模块的deepcopy(),所以使用前要导入from.copy import deepcopy.
2.如果拷贝的对象里面包含元素引用,浅拷贝将原油对象复制一份,但保存的是引用,所以对新对象里的引用值进行修改,依然会改变原对象里的列表值,新对象和原对象并没有完全分离开;深拷贝会将原对象里的引用也新创建一个,即新建一个列表,然后放的是最新列表的引用,这样就可以将新对象和原对象完全分离开

60 error和exception的区别

Error,程序无法处理的系统错误,编译器不做检查
Exception,程序可以处理,捕获后可能恢复
Error属于JVM需要担负的责任
Exception,RuntimeException程序应该担负的责任,CheckedException可检查异常,java编译器应该担负的责任

61 什么是双亲委派模型

当要加载一个类的时候,子类加载器并不会马上去加载,而是依次去请求父类加载器加载,一直往上加载到最高类加载,启动类加载器.当启动类加载器加载不了的时候,依次往下由子类加载器进行加载,当达到最底下的时候,如果加载不到该类,就会出现ClassNotFound的情况

62 在虚拟机中有哪些类加载器

JVM支持两种类型的类加载器,引导类加载器,自定义加载器
常见的类加载有 BootStrapClassLoader, ExtensionClassLoader, SystemClassLoader

63 类加载的过程是什么?

开始加载:将java源代码编译后的.class字节码文件以二进制的方式加载进内存
连接:
验证:验证加载进来的二进制流是否符合虚拟机的规范
准备:给类变量(静态变量)赋予初始值,基本数据/引用类型数据
解析:将字符串引用转换为直接引用
初始化:变量赋予初始值,执行静态语句块,执行构造函数等

64 synchronized各种加锁场景的作用范围

1.修饰普通方法,对当前对象实例加锁,调用该方法需要获得当前对象的实例锁
2.修饰静态方法,对当前类加锁,会对该类的所有实例加锁,因为静态方法不属于任意一个实例对象,是属于类成员,所以当线程A访问调用一个实例对象的synchronized方法,线程B调用这个类实例对象的静态synchronized方法是允许的
3.修饰代码块,对指定的对象加锁,可以指定变量,也可以指定类,指定变量需要获取该变量对应类的实例,synchronized不可以修饰基本类型变量,指定类需要获取当前类加载

65 谈一下你对ajax技术的理解

异步JavaScript和xml,是一种用于创建快速动态网页的技术,在无需重新加载整个网页的情况下,能够更新部分网页的技术,通过对后台服务器进行少量的数据交换,Ajax可以使网页实现异步更新
ajax的优点
1.用户体验好,页面无需刷新,在页面与服务器通信
2.使用异步请求与服务器通信,不需要中断操作
3.可以把服务器的工作负担转嫁给客户端,减轻服务器和宽带的压力,减少冗余请求
4.基于标准化和广泛支持的技术,不需要下载插件或者小程序

66 form表单的提交方式有哪些,各自的特点是什么

1.submit提交,通过type=submit实现,inputtype=“submit”,浏览器显示为button按钮,通过点击这个按钮提交表单数据,跳转到url.do,这种默认的提交方式一般会产生页面跳转,不成功则在当前页面
2.ajax提交
3.js提交,js事件触发表单提交,通过button链接等触发事件

67 redis中的数据类型有哪些

1.String字符串 可以为整形,浮点型,字符串
2.List列表 实现列表,元素不唯一,先进先出
3.Set集合 各不相同的元素
4.Hash散列值 hash的key必须是唯一的
5.Sort set有序集合

68 至少说出5种设计模式

单例模式 工厂方法模式 享元模式 代理模式 装饰模式 适配器模式

68 @RequestBody和@ResponseBody的区别是什么

@ReponseBody注解表示该方法返回的结果直接写入http响应正文中,一般异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@ResponseBody后结果不会被解析为跳转路径,而是直接写入HTTP中响应正文,例如异步获取json数据后,加上@ResponseBody后,会直接返回json数据,前端会直接从json中获取响应的数据.(前后端分离都会使用@ResponseBody)
@RequestBody注解则将HTTP请求正文插入方法中,使用适合的HTTPMessageConverter将请求体写入某个对象中

70 简述springcloud五大核心组件是什么

服务发现(注册中心) Netflix Eureka
客户服务端负载均衡 Netflix Ribbon
断路器 Netflix Hystrix
服务器网关 Netflix Zuul
分布式配置 SpringCloud Config

71 事务的注解是什么,什么情况下会发生回滚,回滚捕获的异常是什么

@Transactional
发生异常的情况下会发生回滚
RunTimeExceptin

72 常见的索引类型有哪些

常见的索引类型
主键索引
普通索引
唯一索引
全文索引

MySQL常见的索引类型
FULLTEXT
HASH
BTREE
RTREE

73 什么是回表查询

在MySQL的innoDB存储引擎中,非主键索引(是一种非聚集索引)查找数据是需要先找到主键,再根据主键查找具体行数据,这种现象叫回表查询.
注意,MyISAM叶节点保存的是地址,而innoDB保存的是主键.所以MyISAM引擎在检索的时候,先找到索引对应的数据记录的地址,再根据地址读取响应的数据记录

74 union和union all的区别

union对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
union all对两个结果集进行并集操作,包括重复行,不进行排序
union要进行重复值扫描,所以效率低

75 innodb的四大特性是什么

插入缓冲 insert buffer
二次写 double write
自适应Hash索引 AHI
预读 read ahead

76 什么是数据库的行锁和表锁

当插入A数据时,就锁定表,叫做锁表
当更新数据时,就锁定行,叫做锁行

77 innodb和myisam的区别是什么

innoDB支持事务,MyISAM不支持事务
innoDB支持外键,MyISAM不支持外键
innoDB是聚集索引,MyISAM是非聚集索引
InnoDB不保存表的具体行数,执行select count(*) from table时需全局扫描,MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
innoDB最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁

78 数据库的备份方式有哪些?

完全备份
事务日志备份
差异备份
文件备份

79

80

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值