Java面试题及答案整理汇总(2024最新版)

1.String和StringBuilder和StringBuffer的区别

        String是不可变字符串,底层是基于字符数组,且有final修饰的,因此每次对String的操作都会在内存中开辟新的空间,生成新的对象。

        StringBuilder和StringBuffer是可变字符串,修改不会生成新的对象;StringBuffer是线程安全的,方法有Synchronized修饰的,性能较低;StringBuffer是线程不安全的,方法没有synchronized修饰,性能较高;

2.ArrayList和LinkedList的区别

        ArrayList是基于数组实现的,根据索引随机访问元素性能高,但是插入和删除元素性能较差,因为这会涉及到移位操作;LinkedList是基于双链表实现的,支持索引,随机访问元素需要从头查找,因此性能较差,但是添加删除性能高,因为不涉及移位操作;根据实际需要,如果项目中使用查找较多就是用ArrayList,如果使用增删较多,就实行LinkedList;

3.创建线程的几种方式

        方式一:集成Thread类,复写run方法,创建实例对象,调用改对象的start方法启动线程;方式二:创建Runnable接口的实现类,类中复写run方法,再将实例作为此参数传递给Thread类有参构造创建线程对象,调用start方法启动;方法三:创建Callable接口的实现类,类中复写call方法。创建实例对象,再将其作为参数传递给FutureTask类有参构造创建FutureTask对象,再FutureTask独享传递给Thread类的有参构造创建线程对象,调用start方法启动;

4.面向对象的4大特征

        抽象:在类的设计层次:将某些食物的共同和属性提取出来集合到一个类;类与对象之间的关系;类是抽象的,类时对象的模板,对象的创建时以类为模板。同一类创造出来的对象具有共同的属性,但是属性值不同;

        封装:利用抽象数据类型将数据和基于数据的操作封装在一起(事物的属性和方法),数据被保护在抽象数据类型的内部,尽可能的隐藏内部细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作与这个抽象数据类型交流和交互;

        继承:继承是在父类、子类之间共享属性、方法的机制,提高代码的复用性。集成后子类拥有父类的全部属性和方法(私有属性不能继承,构造函数不能继承),子类可另外扩展属于自己的属性和方法,实现功能扩展。

        多态:以继承和封装为基础,在抽象的层面上实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。(针对一个抽象的事,对于内部个体又能找到其自身的行为执行),相同的事物,调用其相同的方法,参数也相同时,表现的行为却不同。常见多态形式:重写和重载。

5.INT和INTEGER的区别

        INT是基本数据类型,变量中直接存放数值,变量初始化数值为0;

        INTEGER是引用数据类型,变量中存放的是该对象的引用,变量初始化值是null,INTEGER是INT的包装数据类型,将INT封装成INTEGER,符合JAVA的面向对象的特性,可以使用各种方法比如和其他数据类型间的转换;

        INTEGER和INT的深入对比:

        1.两个通过new生成的interger对象,由于在堆中地址不同,所以永远不相等

        2.INT和INTTEGER比较时,只要数值相等,结构就相等,因为包装类和基本数据类型比较时会自动的拆箱,将INTEGER转化成INT;

        3.通过new生成的INTEGER对象和非通过new生成的INTEGER对象比较时,由于前者存放在堆中,后者存放在JAVA常量池中,所以永远不相等;

        4.两个非通过new生成的INTEGER对象比较时,如果两个变量的数值在-128~127之间,结果就相等。这是因为给INTEGER对象赋值一个INT值时,JAVA编译时,会自动调用静态方法valueOf(),根据JAVA API中对INTEGER类型的valueOf定义,对于-128~127之间的整数,会进行缓存,如果下次在进行赋值相同的值时会直接从缓存中取,即享元模式;

5.Mybatis

        1.mybatis结果集映射,如果是单对象:单个关联对象用associate,适用于多对一的关联查询,使用javaType来定义是实体类型;如果是一个集合:集合用collection,适用于一对多的关联查询,使用oftype来定义集合的泛型类型;

        2mybatis中${}取值和#{}取值的区别:#{}能够防止sql的注入,因为底层用PreparedStatement对象,预编译性能较高,${}不能够方式sql注入,底层使用Statement对昂,不会预编译而是拼接字符串,性能较低。能使用#{}时尽量使用#{},但是如果直接在SQL语句中插入一个不变的字符串。比如,ORDER BY 时只能使用${};

        3.mybatis关联查询中的饥饿加载和懒加载的区别:延迟加载又叫懒加载,是先从表单查询,需要使用相关联

  6.多表JOIN查询,完成查询SQL中的关键字的定义顺序

        SELECT列名 FROM 表名 JOIN 表名2 ON 条件 WHERE  条件  GROUP BY 列名 HAVING 条件 ORDER BY 列名 LIMIT 分页 ,完整多表JOIN查询,SQL中关键字执行顺序,FROM-ON-JOIN-WHERE-GROUP BY -HAVING-ORDER BY -LIMIT

 7.MYBATIS关联查询中,懒加载和饥饿加载的区别,MYBATIS中一级缓存和二级缓存的区别

        懒加载,又叫延迟加载,是先从单条查询,需要使用关联数据的时候才发起关联查询,不用的时候不查询关联数据。饥饿加载则是在查询时将关联的数据立即查询出来,不管用没用。

        缓存,是指将从数据库查询出的数据存放在缓存中,下次使用相同的查询时不必再从数据库查询,而是直接从缓存中读取,从而减轻数据库查询的压力,提高性能。

        mybatis中的一级缓存,是Sqlsession,默认开启,使用同一个Sqlsession发送相同的SQL时命中;他的生命周期和Sqlsession一致,当调用Sqlsession.close()方法时会释放缓存;

        mybatis中的二级缓存,它是SqlSessionFactory级别的,默然不开启,使用同一个SqlSessionFactory,发送相同的sql时命中;他的生命周期是程序结束,当sql中执行了update(),delete(),insert()操作,择缓存的数据都会清空。

 7.MYBATIS的Mapper接口中为什么没有实现类可以中@Autowired直接注入

        赋值给mapper接口引用的对象其实是一个代理对象,这个代理对象是由JDK动态代理创建的。在解析mapper的时候,mybatis会通过java反射获取到接口的所有方法,当调用接口中方法时,将通过接口全限定名+方法名对应找到映射文件中namespace匹配到sql,然后再将结果返回。

8.对IOP,AOC的理解

        AOP,Aspect Oriented Programming 英文首字母缩写,意思为面向切面编程,是spring中的核心思想之一。AOP是对OOP(面向对象编程)的一种补充,能够做到很多面向对象无法做到的是事情,比如需要在所有方法执行前开启事务,打印日志,如果使用面对对象来编程,将会产生大量重复的代码,而使用AOP可以将那些与业务无关的,切位业务模块所共同调用的逻辑封装起来,一次性解决麻烦,而这些重复的代码,一般称之为横切逻辑代码。Aop优点,在不改变原有业务逻辑的情况下,实现解耦合,避免横切逻辑代码重复。AOP的使用场景很多,比如日志记录,性能监控,安全控制,事务处理,异常处理等。它是基于动态代理实现的,分为JDK动态代理和CGLIB动态代理。JDK动态代理实现接口的类,CGLIB支持没有实现接口的类。Spirng默认使用JDK动态代理,如果被代理类没有实现接口,则会使用CGLIB动态代理。

       IOC,INVERSION OF CONTROL英文首字母缩写,意思为控制反转,是Sping核心思想之一。控制,指的是对对象的创建、实例化、管理、销毁、等等权力。反转,指的是将控制权交给Sping框架,IOC容器。优点,使用依赖注入的方式,将需要外部资源注入到组件中,使用IOC使得对象之间的耦合度降低,资源变得容易管理,从而是的代码更加优雅。

        切面的相关注解:@Aspect:定义切面,@Pointcut:定义切点,@Before:前置通知,在目标方法运行之前运行,@After:后置通知,在目标方法运行结束之后运行(无论方法是正常结束,还是异常结束),@AfterReturnning:返回通知,在目标方法正常返回之后运行,@AfterThrowing:异常通知,在目标方法结束之后运行,@Around:动态代理,手动推进目标方法运行。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值