中科创达成都Java后端开发面经

中科创达成都Java后端开发面经,第1张

中科创达成都Java后端开发面经

成都今年十月份的面试。先问的技术问题,然后问的非技术问题。

非具体技术
  • 专业课与计算机相关的是啥 (Java和计算机网络)
  • 自学了多久(一年多)
  • 简历和公司涉及的项目的框架
  • 为什么想换公司(出于职业规划➕对这个公司的了解)
面向对象三大特性
  • (封装、继承、多态)
重写和重载区别
  • 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
  • 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
equals和==区别
  • 很多类比如包装类都是重写了equals方法,所以他们重写的equals方法是比较的内容。包装类与基础数据类型进行==、+、-、*、/运算时,会对包装类进行自动拆箱成基础数据运算。而包装类重写的equals具体来讲需要内容相同与类型相同(拆箱后运算的基础数据类型)
  • ==:他的作用是判断两个对象的地址是不是相等,来判断两个对象是不是同一个对象。
    基础数据类型比较的是值,引用数据类型比较的是内存地址。
  • equals()方法,他的作用也是判断两个对象的地址值。他不能比较两个基础数据类型。
    值得注意的是,String类重写了equals方法,判断的是内容是否相等。
arraylist和linklisted区别
  • 是否保证线程安全:ArrayList 和 linkedList 都是不同步的,也就是不保证线程安全;
  • 底层数据结构:Arraylist 底层使用的是Object数组;linkedList 底层使用的是双向循环链表数据结构;
  • 插入和删除是否受元素位置的影响:ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。linkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响。
  • 是否支持快速随机访问:linkedList 不支持高效的随机元素访问,而ArrayList 实现随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)
  • 内存空间占用:ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而linkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。
spring ioc了解得如何
  • IOC不是技术,而是一种思想。Ioc意味着将你设计好的对象交给容器控制,而不是传统地在你的对象内部直接控制。传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。优势就是,松耦合,代码更优良。
  • DI依赖注入,动态的向某个对象提供它所需要的其他对象。代码组件之间的依赖关系由容器决定。即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
  • Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
Bean的作用域
  • singleton:在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。
  • prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。
  • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
  • session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
  • application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。
如何解决循环依赖
  • 什么叫做循环依赖:一个Java类A中存在一个属性是类B的一个对象,那么我们就说类A的对象依赖类B,而在Spring中是依靠的IOC来实现的对象注入,也就是说创建对象的过程是IOC容器来实现的,并不需要自己在使用的时候通过new关键字来创建对象。
    那么当类A中依赖类B的对象,而类B中又依赖类C的对象,最后类C中又依赖类A的对象的时候,这种情况最终的依赖关系会形成一个环,这就是循环依赖。
    循环依赖里,常见的有:基于构造器的循环依赖、
  • 属性注入的方法
  • 抽象出一层为manager层,构造出service-manager-dao层的结构,让多个service需要复用的代码都在manager里面。
AOP了解得如何

可以参考:https://blog.csdn.net/mu_wind/article/details/102758005

理解AOP

为什么我们要用AOP呢,首先是代码里有很多需求比如权限校验、日志记录等,伴随着业务逻辑一起,冗余且不方便维护。所以我们希望把这些重复的代码抽离出来,写成公共方法进行复用。但这还不够,冗余与可维护性得到解决后,但每个业务方法依然要手动调用这些公共方法,也是繁琐。
我们则考虑用AOP将权限校验、日志记录等功能从业务代码中完全提取出来,与业务代码分离,并寻求节点切入业务代码中。

AOP主要做三类事:
  • 在哪里切入,也就是权限校验等非业务 *** 作在哪些业务代码里执行。
  • 在什么时候切入,事业务代码执行前还是执行后。
  • 切入后做什么事,比如权限检验、日志记录等。
AOP的一些概念
  • Pointcut 切点。决定权限校验、日志记录等在何处切入业务代码中(即织入切面),切点分为executionandannotation 前者可以用路径表达式指定哪些类织入切面,后者可以指定被哪些注释修饰等代码织入切面。
  • Advice 处理。包括处理时机和处理内容。处理内容就是要做什么事,比如权限校验、日志记录。处理时机就是在什么时机执行处理内容,分为前置处理(即业务代码执行前),后置处理(业务代码执行后)等。
  • Aspect 切面 即Pointcut、Advice
  • Joint point 连接点。程序执行的一个点。例如,一个方法的执行或者一个异常的处理。在Spring AOP中,一个连接点总是代表一个方法执行。
  • Weaving 织入 就是通过动态代理,在目标对象方法中执行处理内容的过程。
数据库事务特性
  • 原子性:事务中的 *** 作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。
  • 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
  • 隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的 *** 作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
order by 和 group by的区别
  • order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。
  • group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
左连接和右连接
  • select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID
    左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据,简言之 Left Join影响到的是右边的表,右连接同理。
mysql 的varchar和char的区别

char:定长,效率高,一般用于固定长度的表单提交数据存储 ;例如:身份z号,手机号,电话,密码等
varchar:不定长,效率偏低

Mybatis的XML里#和${}区别
  • 在mybatis中#和KaTeX parse error: Expected 'EOF', got '#' at position 8: 的主要区别是:#̲传入的参数在SQL中显示为字符…传入的参数在SqL中直接显示为传入的值,$方式无法防止Sql注入。
  • 大多数情况下还是经常使用#,一般能用#的就别用 ; 但 有 些 情 况 下 必 须 使 用 ;但有些情况下必须使用 ;但有些情况下必须使用,例:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。
mysql 悲观锁和乐观锁
  • 悲观锁,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。假定会发生并发冲突,屏蔽一切可能违反数据完整性的 *** 作。
  • 乐观锁,顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。假设不会发生并发冲突,只在提交 *** 作时检查是否违反数据完整性。
redis的集合类型
  • Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
redis持久化方式
  • 快照(RDB, Redis Database)
    快照是默认的持久化方式。RDB持久化,就是把当前时间点的数据库的状态保存到磁盘中。RDB可以手动触发,也可以根据服务器配置定期执行。
    RDB生成的文件,是一个经过压缩的二进制文件,数据库可以通过该文件还原到该时间点的状态。
  • 文件追加方式(AOF, Append only File)
    AOF是追加的持久化方式,其中保存的是写命令,而非数据。
  • RDB与AOF区别,RDB文件体积小,恢复速度快,但数据损失多。AOF,丢失数据少。
你用过什么消息队列
  • rabbitmq

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5482545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存