JAVA面试题总结

SQL优化?

​ 答: 1:尽量避免使用*查询 2: 可以常用查询字段使用索引 但不建议使用过多, 一般都是不超过6个 3:where语句后尽量不出现运算符 4: 尽量不使用模糊查询 和子查询 5: 常用字段也可以分表, 但具体的还要看业务功能

mysql引擎有几个?

​ 答: 1:innodb 支持事务 2:myISAM 3:memory 4: merge

redis了解吗?

​ 答: redis是一种支持key-value等数据结构的存储系统, 可用于缓存, 事件发布,场景. 使用C语言编写 支持网络 支持String hash list set 等数据类型 基于内存 可持久化

性能极高 读的速度可达110000/s 写的速度 81000/s

怎样看待java对象?

​ 答: java中 可以理解成一切皆是对象, 例如 电脑,人物 等都可以成为对象. 类和对象是密不可分的, 类相当于对象的模子 用来描述对象信息

string是基本数据类型吗?为什么?

​ 答: 不是,String是final修饰的类

ajax是怎样实现异步请求的?

​ 答:ajax在前端页面实现异步请求的步骤是

​ 1:先创建$.ajax函数 2: 参数定义为json格式 3: json里定义url、data、type、dataType、success

jsp的隐含对象有哪些?

​ 答: out request response application exception pagecontext session config page

怎样建立索引?

​ 答: create index 索引名 on 表名(字段名) 尽量在常用字段加索引 还有就是 在分组 过滤 排序 联合查询 的字段上加

request作用域?

​ 答: request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。

什么是GC ?

​ 答: 垃圾收集,java中的GC机制可以自动检测对象的作用域 从而回收清理内存,例如在某个时间点一个或一个以上的引用指向一个对象,说明该对象是活着的,不会被GC回收, 反之则会被清理掉, 但有个例外就是Thread 对象 当线程还在运行中 就不会被GC清理, java中GC可以防止内存泄漏

简单聊一下springboot

​ 答: Springboot是基于spring4.0设计,简化了spring繁琐的配置(直接在yml或properties文件配置),集成tomcat,提高开发效率

说一下spring

​ 答: Spring是一个开源的轻量级的应用开发框架, 其目的是用于简化企业级应用程序开发, Spring提供的IOC 和 AOP 是spring中重要角色,IOC:控制反转,

事务说一下

​ 答: 简单来说事务指的是对数据库的一系类操作, 这些操作要把它当做一个整体来看待, 要么全部成功,要么全部失败

设计模式了解几种

​ 答: 工厂模式, 单例模式,建造者模式,观察者模式

模糊查询去掉百分号会全盘扫描吗?

​ 答:%在后不会全盘扫描,会用到索引, 没有%索引有效 其他情况会全盘扫描

项目是怎么部署的

​ 答: springboot项目可以直接导成jar包 部署

springMVC里的 handlerMapping 是用什么实现controller和路径地址的关系?

​ 答: 用map实现的

springboot都有哪些注解?

​ 答: @componentscan @service @controller @requestMapping @exceptionHandler @mapperScan @config @transactional等

拦截器和过滤器的区别

​ 答: 1:拦截器是属于springMVC框架里面的组件, 而过滤器是javaEE的 所以过滤器可以在任何web应用上使用, 而拦截器只能在框架里使用. 2:拦截器配置了白名单功能 可以将不需要拦截的请求设置到白名单里去, 过滤器则没有配置白名单功能 3: 执行时间不一样, 拦截器执行是在dispatcherservlet 之后 ,所以遇到中文编码问题 就需要过滤器解决 因为他可以在dispatchservlet之前执行

mybatis里的拦截器

​ 答:pagehelper 插件里面就用到了拦截器,拦截器会拦截query,然后对查询进行一系列操作

怎么获取ajax json数据的

json中有几个参数 url : 请求路径 data: 需要提交到服务器的请求参数 type: 请求类型 dataType: 请求类型 success: 服务器响应成功后会被回调的函数

mysql怎么解决中文编码问题

​ 答: 建表时用utf8mb4 解决

char可以存中文字符吗?

​ 答: 可以

get和post区别?

​ 答:1:使用get请求, 请求的参数会暴露在URL中, post 会封装在请求体中,是不可见的. 所以当请求参数涉及到隐私 都应该使用post 2: get请求参数长度也会有限制, 无法提交太长的请求参数

解释一下自动装箱?

​ 答: 自动拆装箱就是基本数据类型和包装类之间的可以自动转换, 为什么要转换? 原因是: java是面向对象的语言, java中基本数据类型不是面向对象的,为了解决这个问题, 就对每个基本类型上设计了对应的包装类. 包装类拥有对象的特征, 并且添加了相应的属性和方法

说一下session

​ 答: session是一种记录客户端状态的机制, 因为http是无状态协议, 在开发过程中需要记录某些用户的信息, 这个时候就用到了session. session实现是, 当服务器第一次接收到请求后, 会生成一个session对象, 针对该用户生成一个sessionID 并将sessionID以cookie形式响应给客户端, 等客户端下一次请求时,会携带这个sessionID, 然后服务器会根据这个sessionID去找到对应用户信息, 这样解决了http无状态的问题. session默认存活时间是30分钟, 但是可以在web.xml里面设置时间

mybatis 是怎么解决sql注入的?

​ 答: 用#{} 做占位符 进行预编译 可以解决sql注入

做金融项目用什么数据类型

​ 答: 用bigDecimal 精度高

mybatis的plus是什么?

​ 答: 这个是mybatis的增强插件, 简化开发, 提高效率而用的.

创建对象的方式?

​ 答: 可以通过反射instance, 还有new关键字

String StringBuffer Stringbuilder 哪个运行速度最快?

​ 答: Stringbuilder(线程不安全的)最快>>StringBuffer(线程安全的)>> String(需要开辟内存空间)

xml的解析方式

​ 答: dom解析方式 sax解析方式

Mybatis底层是通过反射什么来操作数据库的?

​ 答: JDBC -> 注册驱动,获取连接, 创建statement对象 ,运行sql语句 关闭连接

servlet生命周期?

​ 答: 默认情况下,当第一次向servlet发起请求时,此时会容器会将servlet实例化,默认是单例的, 实例化后,会初始化 调用init() 只被调用一次, 然后会处理请求,调用service() 会被调用多次, 最后销毁

项目节点?

​ 答:指的是几台服务器 一服务器做存储, 另有一台服务器做备份

怎么理解反射?

​ 答: 反射是一种动态机制. 当我们需要在运行期执行某种操作时(例如创建某类对象, 调用某对象方法)这时候就可以用到反射 反射有一个特出之处就是可以访问私有方法 前提是需要把setAccessible权限打开

什么是单例?

​ 答: 就是当一个对象被多次创建, 这个时候就可以用到单例

hashMap 数据结构?

​ 答: 数组加链表结构,HashMap 中利用了数组下标查询快的特点, 实现根据key高效查询Value,散列表为了提高 性能, 避免在散列桶中进行顺序查询, 设置了加载因子, 当元素数量超过加载因子(3/4)约定的门槛数量, 就进行 数组扩容, 扩容以后元素重新散列, 可以大大减少散列值冲突问题,默认的加载因子 75% ,比较时候, 计算出 门槛: 数组大小*75% 得到门槛,如果元素数组超过门槛, 就进行扩容, 并且重新散列,扩容为2倍

​ 创建散列表时候, 会在其内部创建一个数组,默认时候, 创建一个16个元素的数组

​ 保存数据时候: 根据key的hashCode, 计算出一个数组下标, 将数据保存到下标对应的数组元素

​ 根据key的hashCode映射到数组下标时候, 会出现重复情况, 利用equals检查key是否重复

​ 重复时候, 散列表会利用链表存储数据, 此链表被称为散列桶

​ 散列桶中的元素, 只能顺序查询, 可能会产生性能瓶颈,

​ 为了避免出现大量的散列桶链表, 当元素数量达到数组的75%的时候, 进行数组扩容, 扩容后, 出现散列值冲突机会大大减少. Java 8 为应付大数据量, 在散列桶元素超过8个以后, 会将链表转 换为红黑树, 提升查找性能.

​ 查找时候: 根据key的hashCode, 计算出数组下标位置, 再利用下标到数组取得数据, 利用equals确认是否 成功找到数据,如果有散列桶, 就在散列桶中查找, 使用equals比较每个key,因为保存和查找时 候, 本质上都用了数组下标查找数据, 所以其速度非常快;

什么是reids持久化?

​ 答: RPD和AOF两种持久化机制;

springMvc的优点?

​ 答: 1.可以支持各种视图技术, 而不仅仅局限于jsp

​ 2. 与spring框架集成(ioc容器,aop等)

​ 3. 清晰的角色分配: 例如: dispatcherservlet handlerMapper ViewResolver等

​ 4.支持各种请求资源的映射策略

cookie 禁止掉后 session还能用吗?

​ 答: 可以使用 可以在url方式 也可以通过表单的形式

实现mybatis的接口绑定

​ 答: 1: 可以通过xml 的namespace

​ 2: 注解绑定

String 的缓冲区?

​ 字符串缓冲区就是stringBuffer类,作为常用的string类来说,是不可改变的,每次的创建都会为string在内存中分配一次空间,这样在大量的字符串的操作时,是很不可取的,这时可以使用stringBuffer类,这个类使字符串能自动的根据获取的大小分配内存,减小了系统的内存压力

Thread 的start方法和run方法区别?

​ 答: start方法是Tread类的线程启动方法, 而run方法是普通方法. 单独调用run方法是不会启动线程的

sleep和wait区别?

​ 答: sleep会占用资源,wait不会占用资源

​ sleep睡眠时间到了自动唤醒,而wait需要手动唤醒

产生死锁的条件?

​ 答: 1.互斥条件, 2.循环等待条件, 3.请求与保持条件, 4.不可剥夺条件

springboot主要的配置文件

​ 答: application bootstrap

springboot的监听器?

​ 答: 监听器主要是监测web应用中的某些对象, 信息的创建 销毁 修改等动作发生, 然后做出相应处理 主要应用于: 1.统计在线人数和在线用户, 系统加载时初始化信息, 统计网站访问量等

什么是spring的IOC和DI 注入?

​ 答: ioc是控制反转,就是将对象的控制权限交给容器,由容器去创建和管理对象, di: 依赖注入在spring里创建对象的工作不再是有调用者, 而是由spring容器来完成,然后注入给调用者. 所以称为依赖注入 ioc和di目的就是实现解耦,防止代码耦合度高,

什么是AOP?

答: 1.面向切面编程 Spring AOP使用的动态代理。它的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

springMvc的工作原理和生命周期?

​ 答: dispatcherServlet->handlerMapper->dispatcherServlet->controller->dispatcherServlet->viewResolver ->dispatcherServlet->视图组件

properstantment 和 stantment 的区别?

​ 答: properstantment是预编译的, 运行速度要比stantment快

可以使用for循环删除集合中的元素吗?

​ 答: 可以新循环遍历集合会被编译器改为迭代器遍历。因此要注意,使用新循环遍历集合的过程中不得通过集合的方法增删元素。

StringBuffer线程安全?
答:在线程安全上,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,可变字符序列,效率低,线程安 全,StringBuilder并没有对方法进行加同步锁,可变字符序列,效率高,线程不安全. String底层使用了一个不可变 的字符数组(final char[])String是final类。也就可以理解为常量,显然线程安全. String对象一旦被创建就是固 定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
String:适用于少量的字符串操作的情况
  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

final修饰StringBuffer后 用append可以改变他的值吗?

​ 答:可以 因为final修饰的是引用,修饰后引用是不可变的,但是引用的那个值是可以进行修改的

线程池除了设置初始线程数和最大线程数还可以设置什么参数?

​ 答:线程池的主要参数有:corePoolSize(线程池基本大小)、maximumPoolSize(线程池最大大小)、keepAliveTime(线程存活保持时间)、workQueue(任务队列)、threadFactory(线程工厂)、handler(线程饱和策略)

说一下final?

​ 答:final是一个关键字,可以修饰类,方法,变量。修饰类代表类不能被继承,修饰方法说明方法不能被重写,修饰变量,变量不能被修改。

线程的五大状态?

​ 答:新建状态 就绪状态 运行状态 阻塞状态 死亡状态

ArrayList内部的可变长数组是怎么实现扩容的?

​ 答:采用数组复制实现的扩容利用可变长(更换数组)数组实现的线性表数据结构

  • 创建默认的ArrayList, 其内部封装了一个对象数组elementData, 默认长度为0
  • 在添加第一个元素时候, ArrayList会立即分配数组空间, elementData长度为10. 数据添加到数组elementData的第一个元素中.
  • 添加第二个元素时候, 元素按照顺序存储到数组elementData中
  • 当数组容量不够时候, ArrayList会进行扩容, 扩容到1.5倍
  • 插入元素时候, 数组中元素会向后移动位置, 然后将新元素插入到数组中

给你一个util.date怎样转换日期格式?

​ 答:simpledateformat

1*0.3==0.3 会返回什么?true还是false?

答:返回true

JVM内部了解吗?

​ 答:JVM内部有类加载器,内存结构,GC,执行引擎

volatile了解吗?

​ 答:volatile关键字修饰的变量在多线程并发中是具有可见性的,即并发修改后其他线程可以及时看到最新的值,避免脏读现象。

为什么会出现脏读?

​ 答:Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。变量的值何时从线程的工作内存写回主存,无法确定。

Spring有几种配置 注入方式有哪些?

​ 1.xml 配置 2.注解配置 3.java配置

​ 1.构造器注入 2.setter注入 3.注解注入

springCloud有哪些组件?

​ 答:服务发现——Netflix Eureka

​ 客服端负载均衡——Netflix Ribbon

	 断路器——Netflix Hystrix

​ 服务网关——Netflix Zuul

​ 分布式配置——Spring Cloud Config

String都有哪些方法?

​ 答:split indexOf lastIndexOf charAt subString toUpperCase/LowerCase trim valueOf length

什么是C/S B/S架构?

​ 答:B/S架构是指 浏览器/服务器架构 C/S架构是指 客户端/服务器架构

​ B/S 后期维护简单,只需维护升级服务器即可, C/S 维护成本较复杂,但是相对安全

@controller这个注解有什么用?

​ 答:@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。

线程Callable接口了解吗?

​ 答:Callable接口可以创建线程,相比较Runnable接口创建的线程 ,Callable方法可以有返回值,还可以抛出异常,执行callable需要实现类FutureTask接收运算结果,callable规定的方法是call

redis中存储详情数据用的什么数据类型?

​ 答:用String类型即可 常规缓存 获取用get就可以

如何创建线程池?

​ 答:使用ExecutorService创建线程池 newFixedThreadPool(50)

RabbitMQ消息丢失怎么解决的?

答:消息丢失分为三种情况:1.生产者丢失 2.消息队列丢失 3.消费者丢失

第一种情况:可以选择RabbitMQ的事物模式confirm模式,一版推荐使用confirm模式。你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,你可以重试。

第二种情况:需要开启持久化,写入消息后持久化到磁盘,设置持久化有两个步骤,第一个是创建queue的时候设置,第二个是发送消息的时候将消息的deliveryMode设置为2;

第三种情况:这个时候得用RabbitMQ提供的ack机制,也是一种处理完成发送回执确认的机制。如果MQ等待一段时间后你没有发送过来处理完成 那么RabbitMQ就认为你还没处理完,这个时候RabbitMQ会把这个消费分配给别的consumer去处理,消息是不会丢的;

消息的重复消费怎么解决的?

答:可以使用唯一ID,判断是否被重复消费;

concurrenthashMap怎么实现的线程安全?

答:ConcurrentHashMap Java 5 提供的并发版本的散列表, Java 8 中其有多把锁, 每个散列桶一把, 因为采用分段加锁, 并发好. 而且并发安全. 适合在并发情况下使用!

redis每种数据类型的作用,并且在实际项目中redis是如何使用的?

答:String:这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。

​ hash:这个是类似 map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没 嵌套其他的对象)给缓存在 redis 里,然后每次读写缓存的时候,可以就操作 hash 里的某个字段;

​ list:有序列表可以通过 list 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西;

​ set:无序集合,自动去重,直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对 一些数据进行快速的全局去重;

​ zset:是排序的 set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序;

为什么使用RabbitMQ出于什么考虑的?

答:解耦,流量削峰,rabbitmq采用信道通信,不采用tcp直接通信

布隆过滤器的好处

答:相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯文儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值