java面试题2

本文整理了Java面试中常见的问题,涵盖了面向对象的理解、SQL优化、抽象类与接口的区别、Linux命令、防止SQL注入、SpringMVC工作流程、集合类的区别、缓存原理、Nginx的作用和反向代理、AJAX异步刷新、Maven用途、事务管理等多个方面,旨在帮助开发者准备面试。
摘要由CSDN通过智能技术生成

1.面向对象的理解

面向对象是把构成问题的各个事务分解成各个对象

封装:将一个对象的属性和行为的代码封装到一个类中,属性用变量定义,行为用方法定义

继承:父子类,为了拓展新内容不改变原有代码,提高可重用性和可扩展性

多态:引用变量指向具体类型,实现具体类型中的方法

2.SQL怎么优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。    

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如select id from t where num is null;可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0    

3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  

4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描

5.in 和 not in 也要慎用,否则会导致全表扫描

6.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

7.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描

3.抽象类和接口的区别

1)抽象类和接口都是数据类型,都属于引用数据类型,有很多相同点,比如说都可以包含抽象方法,都不能被实例化,都需要被继承/实现才有意义
    2)但是它们也有不同点:
    2.1)抽象类中可以包含很多东西(常量、变量、普通方法、抽象方法、构造方法)而接口中只能包含常量和抽象方法
    2.2)一个类只能继承一个抽象类,但可以实现多个接口,用逗号分隔继承抽象类的派生类,可以重写抽象方法也可以不重写,不重写将派生类也设置成抽象类接口的实现类必须重写所有抽象方法
    2.3)抽象类中成员的默认访问权限就是默认的,即同包中访问接口中成员的默认访问权限是public

4.linux查看日志的命令是什么

Tail:查询尾部日志

Head:查询日志头几行日志

Cat:查看日志

Tac:倒序查看

5.linux移动文件命令

mv

-i: 如果目标文件存在,将会询问用户是否覆盖

-f: 覆盖已有的目标文件时不给出任何提示。

6.如何防止sql注入

sql预编译

确认每种数据的类型,数字必须使用int类型存储

规定数据长度

严格限制数据库权限

7.catch中如果有return   finally中的代码是否还会执行

会执行,优先执行finally中的代码,再执行catch中的代码

8.springMVC工作流程

DispatcherServlet前端控制器

HandlerMapping处理器映射器

HandlerAdapter处理器适配器

ViewResolver视图解析

View视图渲染

9.Arraylist和Linkedlist区别

ArrayList动态数组的数据结构内存存储地址是连续的有索引更适合查询,ArrayList初始容量为10,每次扩容会固定为之前的1.5倍

LinkedList基于链表的数据结构,首位添加(删除)元素,LnkedList性能远远优于ArrayList

10.对缓存的理解?

缓存能让原本打开很慢的页面,变得能“秒开”;

缓存是基于内存去建立的,内存读写速度比硬盘快,能大大提高访问数据的速度。

预读取:先将硬盘中的一部分加载到内存,然后再对外提供服务,减轻数据库访问量。

延迟写:先将需要写入磁盘或数据库的数据,暂时写入到内存,然后返回成功,再定时将内存中的数据批量存入到磁盘。

11.mybatis中自带的缓存?

采用 mybatis 内置的 cache 机制。在 sql 语句映射文件中加入 <cache /> 语句 , 并且相应的 model 类要实现 java Serializable 接口。单纯的 <cache /> 表示如下意思:

1.所有在映射文件里的 select 语句都将被缓存。

2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。

3.缓存使用“最近很少使用”算法来回收

4.缓存不会被设定的时间所清空。

5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。

6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。

  1. spring/springboot 常用的注解, 配置文件中的注解

Spring常用注解:

@Component:泛指各种组件(@Controller控制层、@Service业务层、@Repository数据访问层)

@Bean:导入第三方包里面的注解

@Autowired

@ComponentScan用于对Component进行扫描

@Value

  1. ${}是去找外部酒配置的参数,将值赋过来
  2. #{}是SpE表达式,去寻找对应变量的内容
  3. #{}直接写字符串就是将字符串的值注入进去

SpringMVC常用注解:

@Controller @RestController

@RequestMapping:用于映射web请求,包括访问路径和参数

@ResponseBody:用户返回json数据

@RequsetBody:

@PathVariable:

@Transactional:事务

SpringBoot常用注解:

@SpringBootApplication

@SpringBootConfiguration

@Lazy使bean懒加载,取消bean预初始化

  1. 依赖注入的方式

接口注入,构造器注入,Setter注入

14.nginx的作用   如何理解反向代理

作用:

1.静态HTTP服务器

首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。

server {

listen80; # 端口号

location / {

root /usr/share/nginx/html; # 静态文件路径

}

}

2.反向代理 负载均衡

客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

server {

listen80;

location / {

proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址

}

}

当网站访问量非常大,将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。

upstream myapp {

server192.168.20.1:8080; # 应用服务器1

server192.168.20.2:8080; # 应用服务器2

}

server {

listen80;

location / {

proxy_pass http://myapp;

}

}

15.linux 创建文件的命令

Touch 文件名;

16.linux创建文件夹的命令

Mkdir 创建文件夹;

17.linux修改权限的命令

Chmod

Chgrp

Chown

18.ajax异步刷新是怎么实现的?

当xmlHttpRequest对象的readyState更新时,就会自动执行onreadystatechange绑定的js事件(体现异步),在该事件中操作DOM更新html页面(体现局部刷新)。

19.maven是干嘛的?

maven是下载和管理项目所需的依赖,还可以把项目打包

20.如果需要用到集合,你会选择用哪个?为什么

选择ConcurrentHashMap,不但线程安全,而且效率比hashtable高,把数据分区,每个部分添加同步锁,使其他部分的数据使用不受限制,大大提高效率

21.equals和==区别

==是值比较,对于引用类型变量==是判断引用的值是否是同一个对象地址值,如果是相同对象其内容也一定是相同的

equals方法判断的是对象的内容是否相同,由于其默认方法采用的==进行引用比较,所以需要重写为按照对象内容比较是否相同。

22.string、stringbuffer、stringbuffer有什么区别,如果要用到这些?你会怎么选择?为什么这么选?

 tring是final类,不可以改变,线程不安全,stringbuilder线程不安全,stringbuffer线程安全的。

如果使用时,没有高并发情况,只是一个单线程,考虑stringbuilder,效率高;如果使用时有很高的并发,那么使用stringbuffer,它自带同步锁,保证线程安全

23.spring中的事务是怎么管理的?

 Spring提供了多种事务管理器,将事务的具体工作委托给底层的持久化机制来实现(一般是数据库)。

Spring为不同的事务提供了一致的编程模型。

具体使用时,可以选择使用声明式或者编程式事务。

24.索引优缺点?平时用索引你是怎么用的?

优点:

1、大大加快数据的检索速度;

2、创建唯一性索引,保证数据库表中每一行数据的唯一性;

3、加速表和表之间的连接;

4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

1、索引需要占物理空间。

2、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

25.SQL中delete、truncate、delete分别是删除什么的?

drop删除库,不可恢复

delete删除某条记录或者表中所有记录,记录到日志中,可以回滚,可恢复

truncate删除表中所有记录,不可恢复

26.linux中的 grep 命令

linux中最为常用的三大文本(awk,sed,grep)处理工具

grep命令的常用格式为:grep  [选项]  “模式”  [文件]

grep家族总共有三个:grep,egrep,fgrep

常用选项:

-E :开启扩展(Extend)的正则表达式。

-i :忽略大小写(ignore case)。

-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。

-n :显示行号

模式:

直接输入要匹配的字符串,这个可以用fgrep(fast grep)代替来提高查找速度

使用基本正则表达式

27.SQL左外链接,右外连接,内连接查询的是什么

SQL左外链接查询的是左表和右表重叠部分的数据加左表全部数据,右外连接查询的是右表数据和左表数据重叠部分的数据,内连接查询的是两个表重叠部分的数据

28.linux常用命令

Ls

Cd

Cp

Rm

Mv

Mkdir

29.项目部署到linux上,出问题了,怎么解决

1、无法登录

因为在SpringBoot项目中的MyBatis配置中设置的数据库的地址为localhost,需改成安装mysql的主机的IP地址

2、本地无法连接远程服务器(Host is not allowed to connect to this MySQL server)解决办法

由于当前的root用户限制在当前的内网ip内访问的,需要修改他的访问域(%)

30.数组与链表的区别

数组:相同数据类型的元素按一定顺序排列的集合;数组的存储区间是连续的,占用内存比较大

数组的特点是:随机访问性强,查询简单速度快,从头尾增加和删除困难;

链表:是一种物理存储单元上非连续、非顺序的存储结构,链表存储区间离散,占用内存比较宽松

链表的特点是:查询相对于数组困难,增加和删除容易。

31.HashMap,HashTable,LinkedHashMap之间的区别

HashMap:线程不安全,允许key值为null

HashTable:线程安全,不允许空值

LinkedHashMap:集成了HashMap的特点,并保留了插入时的顺序

  1. HashMap并发死循环怎么解决

创建一个synchronizedMap

使用Collections.synchronizedMap(将创建的Map传进来)

  1. 反射创建的三种方式,最常用的是哪一种

全路径

类名.class:最常用

类的对象.getClass()

34.市面上有比mabatis更好的,但是为什么还要使用mybatis

Hibernate

1.首先是运行速度,hibernate是在jdbc上进行了一次封装,而mybatis基于原生的jdbc,因此mybatis天生就有运行速度上的优势。

2.mybatis开放了插件接口。

3.Mybatis框架相对简单很容易上手

35.如何优化数据库查询

1.建立索引

2.改善SQL语句

36.Spring如何处理事务

1.Spring的事务机制包括声明式事务和编程式事务。

编程式事务管理:Spring推荐使用TransactionTemplate,实际开发中使用声明式事务较多。

声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接,关闭连接、事务提交、回滚、异常处理等这些操作都不用我们处理了,Spring都会帮我们处理。

声明式事务管理使用了AOP面向切面编程实现的,本质就是在目标方法执行前后进行拦截。在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。

2.Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的。

1)PlatformTransactionManager:事务管理器–主要用于平台相关事务的管理

主要有三个方法:

commit 事务提交;

rollback 事务回滚;

getTransaction 获取事务状态。

2)TransactionDefinition:事务定义信息–用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用

这个接口有下面四个主要方法:

getIsolationLevel:获取隔离级别;

getPropagationBehavior:获取传播行为;

getTimeout:获取超时时间;

isReadOnly:是否只读(保存、更新、删除时属性变为false–可读写,查询时为true–只读)

事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。

3)TransactionStatus:事务具体运行状态–事务管理过程中,每个时间点事务的状态信息。

例如它的几个方法:

hasSavepoint():返回这个事务内部是否包含一个保存点,

isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚

isNewTransaction():判断当前事务是否是一个新事务

37.事务的4个特性

原子性:要么都成功,要么都失败

一致性:事务必须是数据库从一个一致状态变到另一个一致性状态

隔离性:一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰

持久性:一个事务一旦提交,他对数据库中数据的改变是永久性的。

  1. 谈谈你对AOP和IOC的理解

Spring的两个重要特性

IOC:控制翻转,是一种设计思想。将创建对象交给Spring容器来管理,负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期

IOC的优点是什么?

IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

AOP:面向切面编程,动态地将代码切入到类的指定方法、指定位置上的编程思想

AOP可以在系统启动时为目标类型创建子类或兄弟类型对象,这样的对象我们通常会称之为动态代理对象。

组合方式:借用JDK官方API(Proxy)为目标对象类型创建其兄弟类型对象,但是目标对象类型需要实现相应接口。

继承方式:借助CGLIB库(Enhancer)为目标对象类型创建其子类类型对象,但是目标对象类型不能使用final修饰。

AOP术语:切面,切入点,通知,连接点

39.nacos如何进行注册

1.下载nacos并成功启动,进入登录页面进行登录

2.在服务提供方和服务消费方的父工程中引入服务注册依赖

3.分别给两服务的配置文件汇总添加naocs服务地址

4.两服务的启动类上添加注解@EnableDiscoveryClient,注册nacos

40.vue的双向绑定原理

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的settergetter,在数据变动时发布消息给订阅者,触发相应的监听回调。

41.什么是mvvm

MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来;ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,是一个同步View 和 Model的对象。View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

42.两种路由模式的区别

前端中存在着两种路由模式:一种是hash 路由模式另一种是 history 模式。

hash:hash路由虽然出现在url中,但是在请求的时候不会被包含在http请求中,对后端来说没有什么影响,所以从另一方面来说hash的改变不会重新加载页面

history:这种模式是利用H5中新增的pushState()和replaceState() 方法,这两个方法用于浏览器的历史记录栈,在当前已有的 back,forword,go基础上,提供了修改历史记录的功能,当执行修改的时候,虽然修改了当前的url ,浏览器不会立即向后端发送请求

43.路由的钩子函数

三个参数:
to:路由将要跳转的路径信息,信息是包含在对像里边的。
from:路径跳转前的路径信息,也是一个对象的形式。
next:路由的控制参数,常用的有next(true)和next(false)。

全局钩子:都会对所有的路由进行拦截,beforeEach:进入之前,afterEach:已经进入了

路由独享钩子:可以针对某一个路由进行拦截,这个需要写在路由规则里

组件内的守卫:针对组件进行拦截

44.vuex的一系列问题

Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采取集中式存储管理应用的所有组件的状态

state, getters, mutations, actions, modules。

 1. state:vuex的基本数据,用来存储变量

2. geeter:从基本数据(state)派生的数据,相当于state的计算属性

3. mutation:提交更新数据的方法,必须是同步的(如果需要异步使用action)。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数,提交载荷作为第二个参数。

4. action:和mutation的功能大致相同,不同之处在于 ==》1. Action 提交的是 mutation,而不是直接变更状态。 2. Action 可以包含任意异步操作。

 5. modules:模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。

45.Synchronize和volatile有什么区别

synchronized关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被synchronized关键字保护的代码块无法被其它线程访问,也就无法并发执行。

volatile关键字解决的是内存可见性的问题,会使得所有对volatile变量的读写都会直接刷到主存,即保证了变量的可见性。

1.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性

2.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

3.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

46.Spring中如何开启一个事物

声明式事务管理:

1.基于Aspectj AOP开启事务,添加配置事务通知,aop代理事务,扫描指定路径下的所有方法

2.基于注解@Transactional

编程式事务管理:

1.使用 TransactionTemplate 事务模板对象

2.使用 事务管理器 PlatformTransactionManager 对象

47.防止重复提交用什么方法

1.给数据库增加唯一键约束

2.利用session防止表单重复提交

实现原理:

服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面。当表单提交时会带上subToken,服务器拦截器Interceptor会拦截该请求,拦截器判断session保存的subToken和表单提交subToken是否一致。若不一致或session的subToken为空或表单未携带subToken则不通过。

首次提交表单时session的subToken与表单携带的subToken一致走正常流程,然后拦截器内会删除session保存的subToken。当再次提交表单时由于session的subToken为空则不通过。从而实现了防止表单重复提交。

48.Spring中事务标签有那些

@Transactional

49.Java中的HashMap的工作原理是什么

一,存储方式:Java中的HashMap是以键值对(key-value)的形式存储元素的。

二,调用原理:HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。

50.线程池有那些参数什么参数

1.corePoolSize 线程池核心线程大小

2.maximumPoolSize 线程池最大线程数量

3.keepAliveTime 空闲线程存活时间

4.unit 空闲线程存活时间单位

5.workQueue 工作队列

6.threadFactory 线程工厂

7.handler 拒绝策略

51.简述springcloud

spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。

52.spring cloud 的核心组件有哪些?

Eureka:服务注册于发现。

Config:配置管理。

Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。

Hystrix:断路器,限流熔断,保护系统,控制故障范围。提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。

53.SpringCloud和Dubbo

SpringCloud和Dubbo都是现在主流的微服务架构
SpringCloud是Apache旗下的Spring体系下的微服务解决方案
Dubbo是阿里系的分布式服务治理框架
从技术维度上,其实SpringCloud远远的超过Dubbo,Dubbo本身只是实现了服务治理

54.Mybatis中动态SQL是什么意思?如何实现动态SQL?

mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率

什么是动态sql

1,根据用户输入参数等才能确定的语句,根据用户输入参数增删改查;

2,解决PL/SQL中不支持DDL语句的问题

如何实现动态SQL? 
首先采用条件标签描述需要表达的语义,维护在配置文件中;初始化过程中,解析配置文件中的标签,生成sql配置对应的抽象语法树;请求处理过程中,根据参数对象解释该抽象语法树,生成当前请求的动态SQL语句。 

55.Redis是什么?作用?优缺点?适用场景

Redis是什么

Redis是非关系型数据库,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
  • 丰富的数据类型
  • 操作具有原子性
  • 持久化
  • 高并发读写

Redis的优点

性能极高 – Redis能支持超过 100K+ 每秒的读写频率。

丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

原子性 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis的缺点

是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

Redis的应用场景有哪些?

Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。

Redis的数据类型

String类型、哈希类型、列表类型、集合类型和顺序集合类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值