当前位置:   article > 正文

凯捷Java二面问题总结_凯捷咨询java面试

凯捷咨询java面试

1.抽象类和接口的区别和使用场景

抽象类定义:用abstract关键字修饰的类就是抽象类

              注意:

  1. 不允许final修饰抽象类或抽象方法final关键字修饰的类不能被继承,final修饰的方法不能被重写,这样的话,定义一个没有具体实现的方法和类是么有意义的)。
  2. 也不允许static关键字修饰抽象方法static关键字修饰的方法是通过方法名直接访问,他不能访问实例变量和实例方法,他就只能调用本身的方法,不具备用上转型对象调用子类方法的能力,也是没有意义的
  3. 抽象类中可以有抽象方法,也可以没有抽象方法

接口的定义:interface关键字修饰的类。

              注意:

  1. 接口中只有抽象方法,接口中常量都是用public修饰,方法都是用public abstract修饰,我们在定义时,这些修饰符,系统都是帮我们自动省略的。
  2. 一个类可以实现一个或者多个接口,接口名之间用逗号隔开
  3. 如果非抽象类实现接口,需要重写里面所有的方法抽象类可以重写接口中的方法,也可以直接拥有接口中的方法

区别:

1.接口和抽象类都不能实例化,接口必须是abstract方法,而抽象类不用。

2.接口可以用于多继承。抽象类只能继承一个。

3.接口只能有常量,抽象类可以有常量和变量。

4.继承的关键字不一样:接口继承接口和类继承类用extends,类继承接口用implements

5.抽象类将其抽象方法的实现交给子类,接口将抽象方法的实现交给实现该接口的类。

应用场景:

抽象类:模板设计模式。某个问题需要子类除了需要重写父类的abstract的方法,还需要从父类继承变量或者重写重要的非abstract方法,就考虑abstract

接口:代理模式。某个问题不需要继承,只需要很多子类给出重复的abstract方法的具体实现细节,就用接口

2.POP、OOP、 AOP区别。AOP 解决什么问题,在项目里面的使用?

POP(面向过程编程):

优势

  1. 流程化编程任务明确,在开发以前基本考虑了实现方式和最终结果;
  2. 开发效率高,代码的短小精悍,善于结合数据结构来开发高效率的程序;
  3. 流程明确,具体步骤清楚,便于节点分析。

缺点

  1. 须要深刻的思考,耗费精力;
  2. 代码重用性低,不易扩展,维护起来难度大;
  3. 对复杂业务,面向过程的模块化难度较高,耦合度比较高。

OOP(面向对象编程):

三大特征:封装、继承、多态

1)封装性:
封装是指将对象信息抽象成一个实体,其中属性方法不容许外部程序直接访问。简单来讲,封装就是要找出某一类事物的公共属性而后提取出来。
2)继承性:
子类继承了父类全部的成员方法和属性,能够拥有本身的属性,子类也能够重写父类方法。继承解决了代码的重用问题 .
3)多态性:
多态存在的三个条件:1.继承 2.重写 3.父类引用指向子类对象
多态的实现方式1.接口实现,继承父类方法重写,同一个类中进行重载数据结构

优势

  1. 结构清晰,注重 对象和职责,不一样的对象承担不一样的职责;
  2. 封装性,将事务高度抽象,便于流程中的行为分析、操做;
  3. 容易扩展,代码重用率高,可继承,可覆盖;
  4. 实现简单,可有效地减小程序的维护工做量。

缺点

  1. 面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互很是少,从而不适合底层开发和游戏开发,甚至是多媒体开发;
  2. 复杂性,对于事务开发而言,事务自己是面向过程的,过分的封装致使事务自己的复杂性提升。

AOP(面向切面编程):一种编程思想

优势

  1. 简单,易用;
  2. 下降模块的耦合度;
  3. 使系统容易扩展;
  4. 设计决定的迟绑定:设计师能够推迟为未来的需求做决定;
  5. 更好的代码复用性。

缺点

  1. 增长额外重复代码,且紧耦合;
  2. 每一个业务逻辑须要一个装饰器实现或代理;
  3. 使用麻烦,须增长容器。

AOP的核心作用是:在程序运行期间,不修改代码的同时为程序增强功能。将必不可少的公共功能做成切面,随着程序运行切入到代码中运行。编写业务时只关注于核心功能 ,不再考虑事务、日志等公共功能,减轻了编码负担,更专注于业务。

AOP在实际项目中的应用

权限管理、表单验证、事务管理、信息过滤、拦截器、过滤器、页面转发、LOGO日志


3.接口幂等性

概念:接口幂等性就是用户对同一操作发起了一次或多次请求的对数据的影响是一致不变的,不会因为多次的请求而产生副作用。

查询操作:具有幂等性

删除操作:1. 绝对删除:具有幂等性

2.. 相对删除:不具有幂等性

更新操作:1. 绝对更新:具有幂等性

2.. 相对更新:不具有幂等性

新增操作:1.自增主键:没有幂等性

          2.业务主键: 具有幂等性

4.索引的优缺点,使用场景

索引的优点:

1.加快查询或者检索的速度;

2.加快表关联的效率,在进行表关联时,可以对关联的字段建立索引;

3.使用分组或者排序的时候,可以减少分组或者排序的时间;

4.建立唯一索引,可以保证表中数据的唯一性等。

索引的缺点:

1.在数据分析或者开发或者中,创建索引和维护索引需要耗费大量的时间;

2.索引会占用物理空间,数据量越大,所用的空间也就越大;

3.索引会降低增删改的效率,因为每次增删改时都需要对索引进行动态维护等。

索引的使用场景,也就是什么我们应该去建立索引呢?可以对照索引的优点方面进行阐述:

1.主键建立唯一索引,创建表中指定某个列为主键列时,索引会自动创建;

2.频繁作为查询条件的字段建立索引;

3.排序时所用的字段建立索引;

4.分组时所用的字段建立索引;

5.常用于统计的字段建立索引等。

5.唯一索引, 主键索引,聚集索引,非聚集索引

唯一索引是不允许其中任何两行具有相同索引值的索引

主键索引为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。

6.索引失效

1. 索引失效案例

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了访问高效数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。

  • 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。
  • 如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。

大多数情况下都(默认)采用B+树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。

其实,用不用索引,最终都是优化器说了算。优化器是基于什么的优化器?基于cost开销(CostBaseOptimizer),它不是基于规则(Rule-BasedOptimizer),也不是基于语义。怎么样开销小就怎么来。另外,SQL语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系。

1.1 全值匹配我最爱

1.2 最佳左前缀法则

在MySQL建立联合索引时会遵守最佳左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

结论:MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于多列索引,过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。如果查询条件中没有使用这些字段中第1个字段时,多列(或联合)索引不会被使用。

1.3 主键插入顺序

对于一个使用InnoDB存储引擎的表来说,在我们没有显示的创建索引时,表中的数据实际上都是存储在聚簇索引的叶子节点的。而记录又存储在数据页中的,数据页和记录又是按照记录主键值从小到大的顺序进行排序,所以如果我们插入的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插,而如果我们插入的主键值忽小忽大的话,则可能会造成页面分裂和记录移位。

1.4 计算、函数、类型转换(自动或手动)导致索引失效

1.5 类型转换导致索引失效

1.6 范围条件右边的列索引失效

应用开发中范围查询,例如:金额查询,日期查询往往都是范围查询。应将查询条件放置where语句最后。(创建的联合索引中,务必把范围涉及到的字段写在最后)

1.7 不等于(!= 或者<>)索引失效

1.8 is null可以使用索引,is not null无法使用索引

结论:最好在设计数据表的时候就将字段设置为 NOT NULL 约束,比如你可以将INT类型的字段,默认值设置为0。将字符类型的默认值设置为空字符串('')

拓展:同理,在查询中使用not like也无法使用索引,导致全表扫描

1.9 like以通配符%开头索引失效

拓展:Alibaba《Java开发手册》

【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。

1.10 OR 前后存在非索引的列,索引失效

在WHERE子句中,如果在OR前的条件列进行了索引,而在OR后的条件列没有进行索引,那么索引会失效。也就是说,OR前后的两个条件中的列都是索引时,查询中才使用索引。

1.11 数据库和表的字符集统一使用utf8mb4

统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的字符集进行比较前需要进行转换会造成索引失效。

7.div居中方法

       1.绝对居中:首先给div添加绝对定位position: absolute;并设置上下左右边距为0,然后使用margin: auto;自动居中。

       2.水平垂直居中:给其父元素添加display: flex;弹性布局。通过定义伸缩容器的两个属性,justify-content主轴方向,align-items纵轴方向均为center

       3. (定位+变形)居中:给父元素添加 position: relative;相对定位。给自身元素添加position: absolute;绝对定位。top: 50%;使自身元素距离上方“父元素的50%高度”的高度。left: 50%;使自身元素距离上方“父元素的50%宽度”的宽度。transform: translate(-50%,-50%);使自身元素再往左,往上平移自身元素的50%宽度和高度。

8.微信支付设计逻辑考察

前置工作:

1.注册微信支付的商户号

2.小程序关联商户号

9.算法题初始[1,4,6,8,2,5,9,3,4]变为[[1,4,6,8],[2,5,9],[3,4]]//数组中元素后面遇到比前面小的就放进新数组

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. /**
  4. * @author zhangy
  5. * @create 2022-10-12 22:37
  6. */
  7. public class test {
  8. public static void main(String[] args) {
  9. int[] ints = {1, 4, 6, 8, 2, 5, 9, 3, 1, 4 ,7};
  10. List<List<Integer>> lists = new ArrayList<>();
  11. List<Integer> list = new ArrayList<>();
  12. for (int i = 0; i < ints.length; i++) {
  13. if (i != ints.length - 1){
  14. if (ints[i] < ints[i + 1]){
  15. list.add(ints[i]);
  16. }if (ints[i] > ints[i + 1]){
  17. list.add(ints[i]);
  18. lists.add(list);
  19. list = new ArrayList<>();
  20. }
  21. }else {
  22. //最后一个的处理
  23. if (ints[i - 1] < ints[i]){
  24. list.add(ints[i]);
  25. }else {
  26. // lists.add(list);
  27. list = new ArrayList<>();
  28. list.add(ints[i]);
  29. }
  30. }
  31. }
  32. lists.add(list);
  33. System.out.println(lists);
  34. }
  35. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/541332
推荐阅读
相关标签
  

闽ICP备14008679号