2019年 java开发面试技术问题整理

1. 有两个Integer对象a.b,假设a=200,b=200;,a=b的返回值是什么,如果a,b=100呢,返回值是什么?为什么呢?

a=100,b=100,-128—127之间是在IntegerCache.cache这个缓冲区范围之内,不在这个缓冲范围之内则会new一个新的对象.a=200,b=200,实际上是创建了两个新的对象.并且指向的地址不同.

2. List.Map,Set三个接口存取元素时候各有什么特点?

List与Set都是单列元素的集合,它们有一个功共同的父接口Collection。
Set里面不允许有重复的元素,
存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。
取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

List表示有先后顺序的集合,
存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。
取元素:方法1:Iterator接口取得所有,逐一遍历各个元素
方法2:调用get(index i)来明确说明取第几个。

Map是双列的集合,存放用put方法:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。
取元素:用get(Object key)方法根据key获得相应的value。
也可以获得所有的key的集合,还可以获得所有的value的集合,
还可以获得key和value组合成的Map.Entry对象的集合。
List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值.

3. 写一个递归程序来计算一个整数n的阶乘.的方法

						/**
						 * 递归算法计算n的阶乘
						 * 递归:自己调自己
						 * @param n
						 * @return
						 */
						public static Integer jieCheng(Integer n) {
						    if (n < 0) {
						        return 0;
						    }
						    if (n == 1) {
						        return 1;
						    }
						    return n * jieCheng(n-1);
						}

4. 迭代器的快速失败和安全失败

一:快速失败(fail—fast)
      在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
      原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
  注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
  场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
二:安全失败(fail—safe)
  采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
  原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
  缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
      场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
5.事物的ACID指的是什么?

• 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
• 一致性(Consistent):事务结束后系统状态是一致的;
• 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
• 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

6.mysql中的datetime,timestamp有什么区别?

MySQL 中常用的两种时间储存类型分别是datetime和 timestamp。如何在它们之间选择是建表时必要的考虑。下面就谈谈他们的区别和怎么选择。
1 区别
1.1 占用空间
类型占据字节表示形式
datetime8 字节yyyy-mm-dd hh:mm:ss
timestamp4 字节yyyy-mm-dd hh:mm:ss
1.2 表示范围
类型表示范围
datetime’1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’
timestamp’1970-01-01 00:00:01.000000’ to ‘2038-01-19 03:14:07.999999’
timestamp翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数。对于某些时间的计算,如果是以 datetime 的形式会比较困难,假如我是 1994-1-20 06:06:06 出生,现在的时间是 2016-10-1 20:04:50 ,那么要计算我活了多少秒钟用 datetime 还需要函数进行转换,但是 timestamp 直接相减就行。
1.3 时区
timestamp 只占 4 个字节,而且是以utc的格式储存, 它会自动检索当前时区并进行转换。
datetime以 8 个字节储存,不会进行时区的检索.
也就是说,对于timestamp来说,如果储存时的时区和检索时的时区不一样,那么拿出来的数据也不一样。对于datetime来说,存什么拿到的就是什么。
还有一个区别就是如果存进去的是NULL,timestamp会自动储存当前时间,而 datetime会储存 NULL。
查看数据,可以看到存进去的是NULL,timestamp会自动储存当前时间,而 datetime会储存NULL
把时区修改为东 9 区,再查看数据,会会发现 timestamp 比 datetime 多一小时
如果插入的是无效的呢?假如插入的是时间戳
结果是0000-00-00 00:00:00,根据官方的解释是插入的是无效的话会转为 0000-00-00 00:00:00,而时间戳并不是MySQL有效的时间格式。
那么什么形式的可以插入呢,下面列举三种
//下面都是 MySQL 允许的形式,MySQL 会自动处理2016-10-0120:48:592016#10#01 20/48/5920161001204859
3 选择
如果在时间上要超过Linux时间的,或者服务器时区不一样的就建议选择 datetime。
如果是想要使用自动插入时间或者自动更新时间功能的,可以使用timestamp。
如果只是想表示年、日期、时间的还可以使用 year、 date、 time,它们分别占据 1、3、3 字节,而datetime就是它们的集合。
7.数据库索引为什么会提高查询性能?索引过多会导致什么问题?
7.1.DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。 (二分查找法),创建的索引会按照顺序排列
7.2:表数据量越大,会导致运行效率月底,而且对应的增删改效率会变慢:
索引个数越多,对于insert操作来说,维护的成本就越大,插入一条数据的速度也就越慢。
当删除一条数据时,会把这条数据涉及到的多个索引中的数据删除
只有当update的这个字段,涉及到索引时,才需要维护索引,相对来说开销要小一些

8. 你使用过哪些spring注解

@Controller
标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.
@RestController
Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式
@Service
用于标注业务层组件,说白了就是加入你有一个用注解的方式把这个类注入到spring配置中
@Autowired
用来装配bean,都可以写在字段上,或者方法上。
默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)

@RequestMapping
类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。
方法处: 提供进一步的细分映射信息,相对于类定义处的 URL
@RequestParam
用于将请求参数区数据映射到功能处理方法的参数上

@ModelAttribute
使用地方有三种:
(1)、标记在方法上。
标记在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。
(1) 在有返回的方法上:
当ModelAttribute设置了value,方法返回的值会以这个value为key,以参数接受到的值作为value,存入到Model中,如下面的方法执行之后,最终相当于 model.addAttribute("user_name", name);假如 @ModelAttribute没有自定义value,则相当于
model.addAttribute("name", name);
(2) 在没返回的方法上:
需要手动model.add方法
(3)、标记在方法的参数上。
标记在方法的参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用.我们在上面的类中加入一个方法如下
@Cacheable
用来标记缓存查询。可用用于方法或者类中,当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。
@CacheEvict
用来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。@CacheEvict(value=”UserCache”)
@Resource
的作用相当于@Autowired
只不过@Autowired按byType自动注入,
而@Resource默认按 byName自动注入罢了。
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略
@Resource装配顺序:
1、如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2、如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3、如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4、如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
指定名称装配的话我们采用的是@Qualifier注解

9. 在使用mybatis开发中是否遇到过如下错误提示:Invalid bound statement(not found),你是如何解决的?

导致该问题出现的原因如下(仅供参考):
1、检查 mapper.xml 中 namespace 等于是否与mapper接口地址一致
    mapper.xml:
2、检查mapper.java 接口中的方法名和 mapper.xml 中的statement 的 id 是否保持一致。
3、mapper接口中的方法返回值是List<User>,而select元素没有正确配置ResultMap,或者只配置ResultType
4、检查application.properties配置文件是否添加以下配置信息(我就是因为这个原因导致报错的,添加之后问题解决):

    mybatis.mapperLocations=classpath:mapper/*Mapper.xml   
    mybatis.typeAliasesPackage=com.gugr.springboot.entity
  1. 在你平时开发中,经常遇到的报错是什么,你是如何解决的?说说你的解决思路.

  2. 代码编写:数组分页,sql分页,拦截器分页,RowBounds分页

  3. 在以下两个打印语句分别输出什么?为什么?

    package testDemo.error;
    /**

      1. 在以下两个打印语句分别输出什么?为什么?
    • @author William

    */
    public class IntegerTestDemo {
    public static void main(String[] args) {
    Integer a = 100;
    Integer b = 100;
    System.out.println(a == b);
    System.out.println("=分割线=");
    Integer c = 100;
    Integer d = 200;
    System.out.println(c == d);
    System.out.println("=分割线=");

    }
    

    }
    true
    =分割线=
    false
    =分割线=

选择题
  1. Object类不包含哪些方法(D)
    A. notify B.wait C.hashCode D.sleep

  2. 下面哪些数据结构不是索引的数据结构(D);
    A. 哈希 B.B+树 C.B-树 D,红黑树

  3. 下面哪些数据结构不是redis的数据结构©
    A. 字符串 B.列表 C.树 D.集合
    二. 算法题
    6.输入一个链表的(head 节点),高效输出该链表倒数第K个节点.
    package com.java.offer
    public class Solution07 {
    public static ListNode findKthToTail(ListNode head, int k){
    if(head==null || k<=0){
    return null;
    }
    ListNode h1=head;
    ListNode h2=head;
    for(int i=1; i<k; i++){
    if(h1.next!=null){
    h1=h1.next;
    }else{
    return null;
    }
    }
    while(h1.next!=null){
    h1=h1.next;
    h2=h2.next;
    }
    return h2;
    }
    }
    三.设计题

  4. 你有一个网站并且拥有很多的访客,每当有用户访问时,你想知道这个IP是不是第一次访问你的网站.请设计完成相应的功能.
    request.getRemoteAddr()是获得客户端的ip地址,将获取的Ip地址存入redis,不设置过期时间,然后将每次请求的IP都进行对比,存在则不删除,不存在则存入redis当中

  5. Spring中的BeanFactory和ApplicationContext的区别是什么?
    都是bean的工厂,但是beanFactory只是一个接口,applicationContext是具体的实现。
    beanFactory只是applicationContext要遵循的一种规范。beanFactory是spring中所有容器必须实现的接口。

BeanFactory基本的工厂
解析,管理,实例化所有容器内的bean的接口,spring中所有解析配置文件的类都直接或者间接实现该接口
ApplicationContext接口implements BeanFactory
创建对象的特点:
BeanFactory 在解析配置文件时并不会初始化对象,只有在使用对象时(getBean())才会对该对象进行初始化
ApplicationContext 在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程.
4. Spring中实现一个定时任务如何做,如果这个任务在分布式系统中,如果处理多个实例的同步.
两种方式:0.1:自身的task定时功能:只需要定义并开启注解:
在Spring配置文件中进行配置基本信息
xmlns:task=http://www.springframework.org/schema/task
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd

<context:component-scan base-package=“com.test”/>

task:annotation-driven/
代码如下:在方法上添加@Schelued注解,并在后面写cron表达式

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**

  • Created by leo on 2018/1/22.
    */
    @Component
    public class TimerTask {

    @Scheduled(cron = “* * * * * ?”)//每分钟都执行
    public void test(){
    System.out.println(“执行”);
    }

分布式项目的实现方式:一种是Spring与Quartz集成配置,另外一种是elastic-job框架

java中接口和抽象类的区别
接口和抽象类的区别?
接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。
接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。
抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)。抽象类的子类为父类中所有抽象方法的具体实现,否则也是抽象类。
接口可以被看作是抽象类的变体,接口中所有的方法都是抽象的,可以通过接口来间接的实现多重继承。接口中的成员变量都是static final类型,由于抽象类可以包含部分方法的实现,所以,在一些场合下抽象类比接口更有优势。
相同点:
(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点:
(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。

  1. HTTP POST和GET的区别

  2. get只能传递1kb以下数据,POST可以传递大数据。

  3. get请求如果有请求参数,那么,浏览器上会显示请求参数
    post请求不会,所以post请求会更安全。

  4. 如果是get请求,有请求参数,请求参数是在http请求行的资源路径上。

  5. 请说说你对dubbo或者springcloud的理解,以及区别
    两者的目的都是为了降低业务的耦合性,微服务主要是将复杂业务拆分成为单个服务,专注于某一个服务.dubbo主要是实现服务前后分离

传输:
Dubbo由于是二进制的传输,占用带宽会更少;
Spring Cloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大。但是在国内95%的公司内,网络消耗不是什么太大问题,
如果真的成了问题,通过压缩、二进制、高速缓存、分段降级等方法,很容易解。

开发难度:
Dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决;
Spring Cloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级

后续改进:
Dubbo通过dubbofilter,很多东西没有,需要自己继承,如监控,如日志,如限流,如追踪
Spring Cloud自己带了很多监控、限流措施,但是功能可能和欧美习惯相同,国内需要进行适当改造,但更简单,就是ServletFilter而已,但是总归比dubbo多一些东西是好的;

注册中心:
Dubbo的注册中心可以选择zk,redis等多种;
Spring Cloud:的注册中心只能用eureka或者自研;

配置中心:
dubbo:如果我们使用配置中心、分布式跟踪这些内容都需要自己去集成,无形中增加了使用难度。
Spring Cloud:提供了微服务的一整套解决方案:服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等

6.,在ssm框架的业务开发中,开发人员经常实现CRUD功能,并没有涉及到多个线程同步处理,为什么在启动应用以后,可以支持多人同时访问并且不出现同步问题???
spring 管理的bean默认是单例的,可通过 scope 属性设置scope=”singleton” 默认是单例,可修改为scope=”prototype” 此时将不再是单例模式 spring bean默认是饿汉式 初始化时就会创建bean的实例,另外spring的单例时相对于spring容器, 设计模式中的单例模式时相对于JVM, JVM可以有多个容器。 所以spring使用中是线程安全的.
数据表读写分离.

  1. mysql 访问数据的方式有哪些,对这些方式的性能做一个排序.回表查询是什么意思?回表对性能有什么影响?
    7.1.:
    7.2. 回表查询:所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
    这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

8.mybatis:如何编写一个自定义的插件.
https://blog.csdn.net/qq_38409944/article/details/82494624
9.mybatis的动态sql是做什么的,有哪些动态sql.
Mybatis 动态 SQL ,可以让我们在 XML 映射文件内,以 XML 标签的形 式编写动态 SQL ,完成逻辑判断和动态拼接 SQL 的功能。
Mybatis 提供了 9 种动态 SQL 标签:、、、、、、、、。
其执行原理为,使用 OGNL 的表达式,从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL ,以此来完成动态 SQL 的功能。
原文链接:https://blog.csdn.net/qq_38489761/article/details/93650848

选择题:
1.下列属于合法的java标识符的是( A)
A.cat B.5books C._static D.-3.14159
2. 在mysql中,下面哪个符号可以放到SQL前面来表示注释(A,B)
A.# B.-- C.& D,!
MySQL中的注释符号有三种
• #…
• – …
• //

3.下面说法正确的是©
A. java中的线程是非抢占式的(实际是抢占式的)
B. java中的线程不可以共享数据(可以共享数据)
C. 每个java程序至少有一个线程,就是主线程
D. Java中的线程不可以共享代码
4哪个HTTP Method可以用来传递大量数据(A)
A.POST B.PUT C.DELETE D.HEAD E.GET
5.关于Map和List,下面说法正确的是( B )
A. Map继承List
B. List中可以保存Map或者List.
C. Map和List中只能保存从数据库中抽取的数据.
D. Map的Value可以是List或Map

程序分析题:
1.执行下面代码结果(输出0 )
package testDemo.error;

public class Hope2 {
public static void main(String[] args) {
String _cat = “new”;

	for (int i = 0;;) {
		System.out.println(i);
		break;
	}
	

	
	
}

}
2.下面代码输出的结果是(12)
package testDemo.error;

public class Hope3 {
public static void main(String[] args) {
int i=0,s = 0;
do {
if (i%2 == 0) {
i++;
continue;
}
i ++;
s = s+i;
}while(i<7) ;
System.out.println(s);

 }

}

编程题:
1.编写计算距当前时间10天以后的日期和时间,并用XXX年XX月XX日的格式输出;(代码如下)

3.编写程序,将字符串”2019-10-01 10:00:00”变为Date型数据.

  1. 以下两段代码是否报错,为什么.

问题答案连接: https://www.jianshu.com/p/fabdd57955d6

  1. MySql数据库有如下一张表并建立了相关的索引.
    CREATE TABLE ‘t’(
    ‘id’ INT(11) NOT NULL,
    ‘a’ INT(11) DEFAULT NULL,
    ‘b’ INT(11) DEFAULT NULL,
    PRIMARK KEY(‘id’)
    )ENGINE=INNODB;
    ALTER TABLE ADD INDEX a_index(a);
    ALTER TABLE ADD INDEX b_index(b);
    假设这张表有10W条数据,字段a的值是1-10W之间不重复的整数.如下SQL语句的索引会生效吗?为什么?

待补充问题:

AutoWired和Qualifier的区别是什么?
Object有哪些方法?
为什么重写equals一定要重写hashcode?
java异常有哪些?项目中怎么做全局异常处理机制?
对socket的理解?IO模型跟NIO理解?
你对异步编程的理解?
有使用过并发流?并发流遍历数据会出现什么情况?
HashMap Put方法怎么实现?扩容策略?其中的算法如何减少碰撞?如果碰撞之后会怎么处理?
spring ioc aop理解,bean的生命周期,bean的scope范围,BeanFactory跟ApplicationContex区别?
spring用了哪些设计模式,讲下对每个设计模式的实现方式?
spring事务传播行为?
mybatis缓存怎么实现?如果不需要,怎么关闭?mapper.java跟sql.xml绑定原理
说说dubbo怎么发布,怎么调用?是否有降级方案,熔断措施?
dubbo传输是什么类型数据?是阻塞的还是非阻塞的?底层传输用什么框架实现?
dubbo负载均衡策略是什么?你们项目用哪种策略?
lunece怎么实现分词?
消息中间件在高并发情况下,怎么保证消息不丢失?
存储引擎的 InnoDB 与 MyISAM区别?
sql如何优化?
二叉树,平衡二叉树,B-Treee,B+Tree区别,Hash索引效率怎样?缺点是什么?为什么mysql选择B+Tree
redis跟mysql如何保持数据一致性?
redis发布订阅有问题?
redis keys* 查找大量数据会发生什么?
redis中的keys在很多时候能帮助我们完成模糊查询的功能
数据量一大,会严重影响性能
修改方式:
将匹配规则数组序列化后存到一个key中,这样读取的时候就直接用get即可。
aaa..yyyy. 作为key,然后将此模糊匹配的数据存入此健值中。通过get 的方式取出里面的值。

你们系统还有什么需要优化的?

jvm调优,
mysql索引,
消息队列,
springboot,springcloud,的区别及关系
设计模式,
项目逻辑,
redis,
linux命令
svn和git的区别,
消息中间件
全文检索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章