ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java面试题

2021-05-12 11:29:35  阅读:20  来源: 互联网

标签:面试题 缓存 Java 数据库 二级缓存 SqlSession 拦截器 线程


1、面向过程、面向对象?

  • 面向过程:性能高
  • 面向对象:性能低,易维护、易复用、易扩展(低耦合,封装、继承、多态特性)

2、String、StringBuffer、StringBuilder?

  • String:对象不可变,每次操作都会生成新的string对象,操作少量数据用
  • StringBuffer:对象可变,有加同步锁,线程安全,多线程操作字符串
  • StringBuilder:对象可变,线程不安全,单线程操作字符串,效率更高

3、&、&&?

  • 作用都一样就是两边都为true结果才为true
  • &&具有短路的功能,当左边为false就不再执行右边,而&是两边都会执行

4、==、equals()?

  • ==比较的是内存地址,equals比较的是值
  • 对于基本数据类型,只有==没有equals
  • 对于string或object这些引用数据类型,equals如果没被重写和==一样比较的是内存地址,如果被重写比较的是对象是否相同

5、重写(override)、重载(overload)?

  • 重写是父类与子类之间多态性的表现,在运行时起作用(对父类函数进行重新定义)
  • 重载是一个类中多态性的表现,在编译时起作用(如不同参数个数或类型的同名函数)

6、arraylist、linkedlist、vector?

  • arraylist:数组,查询快
  • linkedlist:链表,有指针,增删改快
  • vector:有加同步锁,线程安全,性能差

7、hashmap、linkedhashmap、concurrenthashmap、hashtable?

  • hashmap:线程不安全时推荐使用
  • linkedhashmap:保存了记录插入的顺序
  • concurrenthashmap:有加分段锁,考虑线程安全推荐使用
  • hashtable:全局只有一把锁,线程安全,性能差

8、hashmap线程不安全?

  • 1.7:并发执行扩容操作时会发生环形链表和数据丢失的情况
  • 1.8:并发执行put操作时会发生数据覆盖的情况

9、缓存穿透、缓存击穿、缓存雪崩?

  • 缓存穿透:请求缓存和数据库都不存在的数据,请求校验拦截或缓存空数据
  • 缓存击穿:并发请求某条缓存过期数据造成数据库压力瞬间多大,加互斥锁或设置热点数据永不过期
  • 缓存雪崩:并发请求大量缓存过期数据造成数据库压力过大甚至宕机,过期时间设置随机或设置热点数据永不过期或分布式部署

10、拦截器(interceptor)、过滤器(filter)?

  • 拦截器是基于java反射机制的,而过滤器是基于函数回调
  • 拦截器不依赖于servlet容器,而过滤器依赖于servlet容器
  • 拦截器只对action请求起作用,而过滤器几乎对所有请求起作用
  • 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
  • 在action生命周期里,拦截器可以多次被调用,而过滤器只在容器初始化时被调用一次
  • 拦截器可以获取ioc容器中的各个bean,而过滤器不行,所以在拦截器里可以注入service来调用业务逻辑
    (从内到外:controller、interceptor、servlet、filter、tomcat)

11、抽象类、接口?

  • 抽象类中可以有构造方法,接口中不能有
  • 抽象类中可以有普通成员变量,接口中没有
  • 抽象类中可以包含非抽象的普通方法,接口中方法必须都是抽象的
  • 抽象类中可以包含静态方法,接口中不能
  • 一个类可以实现多个接口,但只能继承一个抽象类

12、java8新特性?

  • lambda表达式:最简单的lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:Arrays.asList( “a”, “b”, “d” ).forEach( e -> System.out.println( e ) )
  • 方法引用:Class::new、Class::method
  • 可以使用重复注解
  • 等等…

13、多线程创建方式?

  • 继承thread类
  • 实现runnable接口
  • 实现callable接口
  • 使用线程池,用executor框架

14、线程状态?

  • 新建
  • 就绪
  • 运行
  • 阻塞
  • 死亡

15、Synchronized、Lock?

  • synchronized是Java关键字,lock是一个类
  • synchronized异常会释放锁,lock不会(需要手动,可能会发生死锁)
  • synchronized不能响应中断,lock可以
  • lock可以知道是否获取到锁,synchronized不能

16、Spring作用域?

  • singleton(单例)
  • prototype(原型)
  • request
  • session
  • global session

17、集群、负载均衡?

  • 集群(Eureka、Zookeeper):将同一个系统部署在多台服务器上
  • 负载均衡(Nginx、Ribbon):将多个请求平均分摊到每台服务器上(按照轮询、权重、最小连接数等方式)
  • 负载均衡的前提是集群

18、Eureka、Zookeeper?

  • C(一致性)、A(可用性)、P(分区容错性)
  • Zookeeper:保证CP,分主从节点,主节点出现问题时剩余节点会重新选举,选举期间服务瘫痪
  • Eureka:保证AP,节点平等,自动切换到正常的节点,查到的信息可能不是最新的

19、乐观锁、悲观锁?

  • 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。一般会使用版本号机制或CAS操作实现,适用于读多写少。
  • 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改所以会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如说像加synchronized,只允许单个线程占用资源,造成其他线程阻塞。效率可能较低,适用于写多读少。

20、IOC、AOP?

  • IOC控制反转:将类的对象的控制权交给spring容器(一个bean标签就相当于创建了一个类的对象)
  • AOP面向切面:将复杂的业务分解不同的切面,然后公共功能集中解决(拦截方法,定义前置后置增强类去做增强处理)

21、FactoryBean、BeanFactory?

  • FactoryBean是一个Bean,由IOC容器管理
  • BeanFactory是一个Factory,就是IOC容器

22、Collection、Collections?

  • Collection是集合类的上层接口
  • Collections是一个集合框架的帮助类

23、throw、throws?

  • throw写在方法体里面,throws放在方法头上面
  • throw就是直接抛出一个异常,而throws表示这个方法可能会抛出一个异常

24、Java中final的作用?

  • 可以作为修饰符来修饰变量、方法和类;
  • 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用不能被修改;
  • 被final修饰的方法不能在子类中被重写;
  • 被final修饰的类不能被继承。

25、事务失效场景?

  • 在非public修饰的方法上使用
  • 在事务方法中使用try-catch
  • 没加事务的方法调用加了事务的方法
  • 属性配置问题

26、bigdecimal、double、float?

  • 银行里的金额为保证计算精确,使用bigdecimal而不用double或float
  • 因为有效长度足够长可存储小数位数

27、Cookie、Session、Token?

  • Cookie数据存放在客户浏览器上,Session数据存放在服务器上
  • Cookie不安全适合存大量信息(单4K),考虑安全应使用Session存用户等重要信息
  • Token传参验证登陆

28、Linux:

  • 查看当前目录:pwd
  • 查看当前目录所有文件(夹):ls
  • 切换到指定目录:cd
  • 目录创建、删除:mkdir、rmdir
  • 文件创建、删除、移动:touch、rm、mv
  • 文件查看:vi、vim、cat、more、less、head、tail
  • 上传下载:rz、sz
  • 搜索:find、locate、grep
  • 解压缩:zip、gzip、unzip、gunzip、tar
  • 查看、终止进城:ps、kill

29、Dubbo:分布式框架

  • interface:model、service
  • provider:mapper(java、xml)、serviceImpl
  • consumer:controller

30、SpringCloud:微服务框架

  • eureka server、eureka client(provider、consumer)
  • 客户端注册(连接)到服务端并维持心跳连接,通过接口地址完成服务间的调用
  • resttemplate.get(post)for entity(object、location)
  • ribbon:(客户端的)负载均衡(有多个provider)consumer(按照轮询、权重、最小连接数等算法)切换调用provider
  • hystrix:服务熔断:当消费者调用提供者没有响应时直接返回一个错误响应,避免故障在分布式系统间蔓延
  • feign:声明式服务消费(ribbon+hystrix),类似controller调用service
  • zuul:api网关,类似添加上下文路径(路由),然后可以自定义请求过滤、异常处理

31、Redis:

  • string、list、set、hash、zset
  • redisTemplate.opsForValue().set(get)

32、Mybatis的一级缓存和二级缓存?

  • 一级缓存的作用域是SqlSession范围的。
  • 当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。
    需要注意的是,如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。
  • 当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。
  • 二级缓存是mapper级别的缓存。
  • 使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。
    相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的。
  • 二级缓存的作用域是mapper的同一个namespace,不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。

常用命令:

  • idea/terminal:jps、taskkill /f -pid 3248
  • cmd(命令)
  • notepad(记事本)
  • mstsc(远程)
  • snippingtool(截图)
  • mspaint(画图)

面试常问知识点:

  1. 非关系型数据库 redis 常用数据结构,电商场景的用法,分布式锁的使用
  2. 数据库 mysql 包含基本语法、innodb 底层结构、索引的使用、sql 优化、sql注意事项、事务的使用、注意事项
  3. 队列 rocketMq、rabbitMq 对比一系列mq 的优劣、特点
  4. Java 基础,hashmap、jvm、springboot 至少了解生命周期
  5. 微服务,基础的几个主件,各自的优劣,适用场景

一些常问关键词:

  • Spring、SpringMVC、Mybatis、SpringBoot、
  • Dubbo、SpringCloud、分布式、微服务
  • RocketMQ、RabbitMQ、Kafka
  • SQL优化、MySQL、Oracle、Redis、MongoDB
  • 内存溢出、JVM、HashMap
  • Maven、Nginx、Linux

标签:面试题,缓存,Java,数据库,二级缓存,SqlSession,拦截器,线程
来源: https://blog.csdn.net/qq_40139458/article/details/115479943

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有