Java开发工程师2020最新面试题-适用于2-3年工作经验

1、自我介绍
    面试官好,我叫XXX,我面试的岗位是Java开发工程师,本科学历毕业于XXXXX大学软件工程专业,
  工作经验X年(XXXXX有限公司),工作内容主要是负责项目某一模块的开发以及相关模块的数据库设计,
  最近做的项目是一个XXXX,后端采用XXXX框架 前端采用的是XXXX框架,主要负责的模块是XXXX
2、springboot和ssm有什么区别?
  springboot和ssm不冲突,springboot只是简化了配置,实际开发没什么区别,
  传统的SSM框架项目会有大量的配置文件,需要手动的去整合三个框架,
  也就是springmvc,spring,mybatis,并且需要注意各种配置和兼容,后期的维护难度也很大.
3、springboot有哪些注解?
  @Service: 注解在类上,表示这是一个业务层bean
  @Controller:注解在类上,表示这是一个控制层bean
  @Repository: 注解在类上,表示这是一个数据访问层bean
  @Component: 注解在类上,表示通用bean ,value不写默认就是类名首字母小写
  @Autowired:自动注入
  @Resource: 按名称装配
  @ConfigurationProperties(prefix = "user1")//设置配置文件的前缀
  @PropertySource("classpath:detifalManager.properties")//设置自定义文件的路径
  @Value("${test.name}")取自定义配置文件的值
  区别:
  @Resource默认按照名称方式进行bean匹配
  @Autowired默认按照类型方式进行bean匹配
  @Resource(importjavax.annotation.Resource;)是J2EE的注解
  @Autowired(importorg.springframework.beans.factory.annotation.Autowired;)是Spring的注解
4、redis的数据类型?
  string(字符串)
  hash(哈希)
  list(列表)
  set(集合)
  zset(有序集合)
5、反射机制是怎么样的?
  反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。
  由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,
  也会严重影响系统的性能。具体而言,
  反射机制的主要功能主要有:
  ①得到一个对象所属的类
  ②获取一个类的所有成员变量和方法
  ③在运行时创建对象,调用对象的方法。
6、RPC是基于什么协议通讯的?
  RPC远程服务调用
  RPC可以基于TCP协议也可以基于HTTP协议,RPC的主要目的只是获取由远程机器上的程序所执行的结果。
7、悲观锁和乐观锁的区别?
  悲观锁
    每次拿数据都以为别人会修改,所以每次拿数据时都会上锁。
  实现:开启事务,启用锁机制

  乐观锁
    每次拿数据时候都认为别人不会修改,所以不会上锁,但是在更新数据时候会判断在此期间是否有人更新过。
  实现:1.使用版本号2.使用时间戳
8、nginx的启动与停止?
  启动:
    ./nginx
  停止:
    查询nginx主进程号
      ps -ef | grep nginx
      从容停止 kill -QUIT 主进程号
      快速停止 kill -TERM 主进程号
      强制停止 kill -9 nginx
9、说说你对大数据的理解?
    大数据技术主要围绕“数据价值化”这个核心来展开,涉及到数据采集、数据整理、数据存储、数据安全、
  数据分析、数据呈现和数据应用等技术。
10、应用服务器有哪些?
  tomcat,jboss,WebLogic
11、事务的四大特征?
  原子性(Atomicity):表示事务内不可分割,要么都成功,要么都失败
  一致性(Consistency):要么都成功,要么都失败.失败了,要对前面的操作进行回滚
  隔离性(Isolation):一个事务开启了,不能受其它事务的影响
  持久性(Durability):持续性,表示事务开始了,就不能终止.事务提交后,将数据序列化到数据库
12、redis三大策略?
  持久化策略(内存到磁盘上):RDB(全部选中的数据进行全量备份)、AOF日志记录修改指令(增量备份针对上一次选中的数据)两种方案

  内存淘汰策略:noeviction--默认策略,不删除数据    allkeys-lru--所有key中,删除最近最少使用的数据  volatile-lru--设置过期时间的所有key中,
  选取最近最少使用的数据删除  volatile-random--在所有key中,随机删除设置过期时间key的数据   volatile-ttl--设置过期时间key中,删除存活时间最短的数据

  过期(定期)策略:定期删除(过期key放入独立字典中,定期删除字典数据)、定期删除策略(定期删除)、惰性删除(过期了,删除,不返回任何数据)
13、SOA、微服务、Spring Cloud、Spring Boot的区别?
  SOA:面向服务体系架构(Service-Oriented Architecture),基于分布式思想,侧重点在于提取核心服务,减少代码冗余,增加业务代码复用,解决信息孤岛等一些问题。

  微服务:基于SOA架构的更细粒度的服务思想,侧重点在于服务解耦。

  Spring Cloud:是Spring提供的一套微服务标准,Spring Cloud生态能够帮助开发者快速构建分布式应用,
    同时提供了分布式应用常见的一些问题解决方案,包括spring自主开发的及第三方解决方案。

  Spring Boot:是spring提供的,能够帮助开发者快速构建独立的,基于Spring的应用程序。基于约定大于配置的思想,自动配置,
    应用程序只需要很少的Spring配置即可。提供应用程序监控和外部化配置功能。
14、RabbitMQ工作模式?
  在 RabbitMQ 官网上提供了 6 种工作模式:简单模式、工作队列模式、发布/订阅模式、路由模式、主题模式 和 RPC 模式。
15、Lucene与solr区别?
  Lucene:单独使用Lucene实现站内搜索需要开发的工作量较大,主要表现在:索引维护、索引性能优化、搜索性能优化等,因此不建议采用。
  Solr:基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为Solr提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中常用此方案。
16、怎么理解MySQL存储过程?
  mysql执行语句是先编译后执行的,这样如果查询的并发大的时候会浪费很多资源和时间。造成mysql进程占用资源过多,症状就是慢。
  存储过程可以把一些特别的语句封装成一个方法,再编译好成一个可执行的方法对外只要接收参数就可以,这样就不用再编译。执行速度更快,主要用来性能提升
17、存储过程有哪些特点?
  能完成较复杂的判断和运算
  可编程行强,灵活
  SQL编程的代码可重复使用
  执行速度相对快一些
  减少网络之间的数据传输,节省开销
18、Nginx负载均衡的作用?
  分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。
19、如何解决高并发问题?
  解决高并发可以从四个方向:前端、服务器、数据库、硬件提升
  前端:实现负载均衡,配置前置代理服务器,如NGINX,Apache等
  后台:增加网络带宽,DNS域名解析分发多台服务器;
  数据库:对数据的查询进行优化,实现读写分离。
  硬件提升:搭建服务器集群,数据库集群,实现读写分离等等
20、如何理解消息队列?为什么使用消息队列?
  消息队列是为了解决生产和消费的速度不一致导致的问题,有以下好处:

  减少请求响应时间。比如注册功能需要调用第三方接口来发短信,如果等待第三方响应可能会需要很多时间
  服务之间解耦。主服务只关心核心的流程,其他不重要的、耗费时间流程是否如何处理完成不需要知道,只通知即可
  流量削锋。对于不需要实时处理的请求来说,当并发量特别大的时候,可以先在消息队列中作缓存,然后陆续发送给对应的服务去处理
21、tomcat三种运行模式?
  bio nio apr
22、MySQL五个聚合函数和两个排序关键字?
  聚合函数:count、sum、avg、max、min
  排序关键字:升序asc 降序desc
23、数组与List集合之间的相互转换
  数组转换为list集合:
    String[] arr = new String[5];
    arr[0]="a";
    arr[1]="b";
    arr[2]="c";
    arr[3]="d";
    arr[4]="e";
    List<String> list = new ArrayList<>();
    List<String> list1 = Arrays.asList(arr);
  list集合转换为数组Array:
    List<Integer> ls = new ArrayList<>();
    ls.add(1);
    ls.add(2);
    ls.add(3);
    ls.add(4);
    ls.add(5);
    Object[] objects = ls.toArray();
24、Redis为什么是单线程?
    redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,
  就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。
  redis用单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。

25、日志的好处?

  便于开发错误跟踪
  对于用户问题能根据日志跟踪
26、log4j的隔离级别
  一共分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,
  这里Log4j有一个规则:假设设置了级别为P,如果发生了一个级别Q比P高,则可以启动,否则屏蔽掉。
27、什么是跨域?
  跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
28、怎么解决跨域?
  response 添加 header resp.setHeader("Access-Control-Allow-Origin", "*");
  JSONP 方式
  HttpClient 请求转发
  nginx 转发
29、String,StringBuffer与StringBuilder的区别?
  String 字符串常量 适用于少量的字符串操作
  StringBuffer 字符串变量(线程安全) 适用于多线程下字符缓冲区进行大量操作
  StringBuilder 字符串变量(非线程安全) 适用于单线程下字符缓冲区进行大量操作
  StringBuilder > StringBuffer > String
30、Spring常用的三种注入方式
  Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。
31、接口和抽象类的区别?
  实现:抽象类的子类使用excends来继承,接口必须使用implements来实现接口
  构造函数:抽象类可以有构造函数,接口不能有
  实现数量:类可以实现多个接口,但是只能继承一个实现类
  访问修饰符:接口中可以默认使用public修饰,抽象类中的方法可以是任意访问修饰符
32、说说你对jvm的理解?
  Java程序不考虑内存管理,是因为把内存的管理交给了jvm,jvm有一套完整的存储和垃圾回收机制
    类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区中,然后在堆区创建java.lang.Class对象,
  用来封装类在方法区中的数据结构。
  Java虚拟机与程序的生闽南歌周期
    (1)程序正常执行完,进程结束
    (2)System.exit()方法来终止程序执行,传入参数为0,代表正常退出
    (3)程序出现异常或者错误导致虚拟机进程退出
    (4)操作系统出现错误导致虚拟机进程退出
33、怎么遍历一个map
    通过map.keyset遍历keyhevalue:
    for(Integer in : map.keySet()){
      String str = map.get(in);
      System.out.println(in+" ”+str);
    }
    通过map.value()遍历所有的value,但不能遍历key
    for(String v :map.values()){
      System.out.println("value=" + v );
    }
34、Jquery 的选择器有几种?
  基本选择器 过滤选择器 表单选择器 层级选择器
35、什么是值传递和引用传递?
  值传递:指的是把值复制的传过去一份 特点:传递的是值的拷贝,也就是传递后互不相关
  引用传递:指的是方法调用时,传递的参数是按引用进行传递,其传递的是引用地址,也就是变量所对应的内存空间的地址
36、拦截器和过滤器的区别?
  (1)拦截器是基于Java的反射机制,过滤器是基于函数的回调
  (2)过滤器依赖于servlet容器,拦截器不依赖servlet容器
  (3)拦截器只对action请求起作用,过滤器可以对所有请求起作用
  (4)拦截器可以访问action上下文、值栈里的对象,过滤器不能
  (5)在action生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时调用一次
37、数组和集合的区别?
  数组:长度不可以改变,只能装同种数据类型
  集合:集合长度可改变,可装任意数据类型
38、spring注解@Autowrite和@Resource
  Autowired:按类型装配
  Resource:按名字装配
39、resultmap和resulttype的区别?
  resulttype:当使用resulttype做sql语句返回结果时,对于SQL语句查出的字段在相应的polo中必须和它的相同字段类型对应,而resulttype的内容就是pojo在本项目中的位置
  resultmap:当使用resultmap做sql返回结果时,通常需在mapper.xml中定义resultmap进行pojo和相应字段的对应
40、hashmap和hashtable的区别?
  (1)hashmap线程不安全,hashtable线程安全
  (2)hashmap允许有null的键和值,hashtable不允许有null的键和值
  (3)hashmap效率高一点,hashtable效率稍低
  (4)hashmap方法不是Synchronize的要提供外同步,hashtable方法是Synchronize的
  (5)hashmap有containsvalue和containsKey方法,hashtable有contains方法方法
  (6)Hashmap 是Java1.2 引进的Map interface 的一个实现,Hashtable 继承于Dictionary 类
  (7)Hashmap是Hashtable的轻量级实现,Hashtable 比Hashmap 要旧
41、多线程创建的方式?
  继承 Thread 类
  实现 Runable 接口
  实现 Callable 接口和 Future 接口
42、线程中wait和sleep的区别?
  对时间的指定:
  (1)sleep方法必须设置指定时间
  (2)wait方法有重载形式,可以指定时间,也可以不指定时间
  对于执行器和锁的操作:
  (1)sleep():释放执行权,不释放锁,因为肯定能醒,肯定可以恢复到临时阻塞状态
  (2)wait():释放执行权,释放锁,因为wait不释放锁,如果没有时间指定,那么其它线程都进行不了同步中,无法将其唤醒
43、mybatis一级缓存和二级缓存?

  一级缓存
  一级缓存的作用域是一个sqlsession内;二级缓存作用域是针对mapper进行缓存.
    一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,
  不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)

  二级缓存

  开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作,
  因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中
44、集合的体系
  单列集合
    collection
      list集合:有序 可重复(有下标)
        ArrayList(底层是数组 查询快 增删改慢)
        linkedList(底层是链表式 查询慢 增删改快)
      Set集合:无序 不可重复
        HashSet:底层重写了hashcode()和equals() 所以不能重复
  双列集合
    map:以键值对的形式存在 键是唯一的不可重复,键可以为null
      HashMap
45、怎么进行SQL优化?
  ①对查询进行优化,应尽量避免全表扫描
  ②应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
  ③应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  ④应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
  ⑤尽量避免大事务操作,提高系统并发能力
  ⑥尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
  ⑦如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除
  ⑧避免频繁创建和删除临时表,以减少系统表资源的消耗。
  ⑨尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
  ⑩在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,
   否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致
46、throw与throws区别?
  throw是语句抛出一个异常。
  throws是方法可能抛出异常的声明
  throw语句用在方法体内(表示抛出异常,由方法体内的语句处理)
  throws语句用在方法声明后面(表示再抛出异常,由该方法的调用者来处理)。
47、IO流的四大基类
  Reader writer inputStream outputStream
48、序列化与反序列化的区别?
  序列化:把应用层的对象转换成一段连续的二进制串
  反序列化:把二进制串转换成应用层的对象
49、mybatis中#{}与${}的区别?

  #{}相当于占位符,建议使用,安全。
  ${}sql拼接,不建议使用,容易发生sql注入,不安全

50、你是怎么理解闭包的?
  闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。

51、springboot启动的时候怎么排除加载某些bean?

  @ComponentScan注解用来扫描加排除,不加ComponentScan注解,springboot是默认扫描springboot启动类所在的包及其子包,

  我们现在自己扫描,然后使用@ComponentScan注解的excludeFilters属性用来排除不想扫描的bean。

面试题持续更新中...

欢迎加入互联网技术交流群共同学习共同进步

  

-----------------------------------------------------------------------------------------------------------------------------------

版权声明:本文为博客园博主「LENGXUAN」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.cnblogs.com/lengxuanwl/p/12699602.html

原文地址:https://www.cnblogs.com/lengxuanwl/p/12699602.html