八股文面试day4

Iterator_FailFast和Iterator_FailSafe

FailFast:一旦发现遍历的同时其他人来修改,则立刻抛异常(说明:debug模式正在遍历这时添加一个元素,等这轮遍历完才抛异常)

FailSafe:发现遍历的同时其他人来修改,应当能有应对策略,例如牺牲一致性来让整个遍历运行完成(说明:debug模式正在遍历这时添加一个元素,结果只是遍历之前集合中元素,刚才debug模式添加的元素没有被遍历出来) 

过滤器和拦截器的区别 

第一:运行顺序不同,过滤器是Servlet容器接收到请求之后,但是在Servlet被调用之前运行的,而拦截器呢,则是在Servlet被调用之后但是在响应被发送到客户端之前来运行的

第二:配置方式不同,过滤器是在web.xml里面去进行配置,而拦截器是在spring的配置文件中去进行配置或者使用注解的方式去进行配置

第三:Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器 

第四:Filter在过滤器中只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作,相当于interceptor多了对于springmvc生态下的组件的一个操作能力

微服务理解

微服务是一种架构风格,我们可以把应用程序划分为一种小型的松散耦合的服务,每个服务都运行在自己的进程里面,并通过轻量级的通信机制来进行通信,每个服务都可以独立部署,独立扩展,独立更新,从而提高了应用程序的可伸缩性,可维护性,可测试性。由于微服务是属于分布式架构下的一种针对于应用架构的一种设计风格,所以我们会面临到分布式架构下一些服务治理的复杂问题,因此spring官方提供了一套springcloud的解决方案,帮助我们快速实现微服务技术方案的落地

为什么公司禁止使用@Transactional声明式事务 

第一:在方法上增加@Transactional声明式事务,如果一个方法中存在较多耗时的操作,很容易引发长事务的问题,而长事务会带来锁的竞争,影响性能,同时也会导致数据库的连接池被消耗尽,影响到程序的正常执行

第二:如果方法存在嵌套调用,而被嵌套调用的方法也声明了@Transactional的事务,那么这个时候就会出现事务嵌套的调用行为,容易引起事务混乱,程序运行结果出现异常

第三:Transactional声明式事务是将事务控制逻辑放在注解里面,如果项目中的复杂度增加,事务的控制可能会变得更加复杂,导致代码的可读性和维护性下降,所以为了避免这种问题,有些公司会推荐使用编程式事务,这样可以更加灵活的去控制事务的范围,减少事务的锁定时间,提高系统性能

Mybatis是如何进行分页的 

第一: 直接在select语句上增加数据库提供的分页关键字,然后在应用程序里面传递当前页,以及每页展示条数即可

第二:使用Mybatis提供的RowBounds对象,实现内存级别分页

第三:基于Mybatis里面的Interceptor拦截器,在select语句执行之前动态拼接分页关键字

new String("abc")到底创建了几个对象

解释:首先这个代码里面有一个new关键字,这个关键字是在程序运行的时候,根据已经加载的系统类String在堆内存里面去实例化一个字符串对象,然后在这个String的构造方法里面呢,传递了一个"abc"的一个字符串,因为String里面的字符串成员变量是一个final修饰的,所以它是一个字符串常量,所以接下来JVM会去拿字面量"abc"去字符串常量池里面去试图找到对应它的一个String的对象引用,如果拿不到,就会去堆内存里面去创建一个“abc”的String对象,并且把引用保存到字符串常量池里面,后续如果再有字面量“abc”的一个定义,因为字符串常量池里面已经存在字面“abc”的一个引用,所以只需要从常量池里面获取对应的引用就可以了,不需要再去创建

答:1、如果abc这个字符串常量不存在,则创建2个对象,分别是abc这个字符串常量以及new String这个实例对象 2、如果abc这字符串常量存在,则只会创建一个对象即String这个对象

Synchronized和lock区别

第一:从功能角度来看,lock和synchronized都是java中去用来解决线程安全问题的一个工具

第二:从特性来看,首先synchronized是java中的同步关键字,而Lock是juc包中提供的接口,这个接口它有很多的实现类,其中就包括ReentrantLock这样一个重入锁的实现,其实synchronized可以通过两种方式去控制锁的力度,一种是吧synchronized关键字修饰在方法层里面,另一种是修饰在代码块上,并且我们可以通过synchronized加锁对象的生命周期来控制锁的作用范围,比如锁对象是静态对象或者是类对象,那么这个锁就是属于全局锁,如果锁对象是普通实例对象,那么这个锁的范围取决于这个实例的生命周期,而lock中锁的粒度是通过它里面提供的lock()方法和unlock()方法来决定的,像包裹在两个方法之间的是能够保证线程安全的,锁的作用域取决于lock实例的生命周期,lock比Synchronized的灵活性更高,lock可以自主去决定什么时候加锁,什么时候释放锁,只需要去调用lock()和unlock()这2个方法就可以了

第三:lock还提供了非阻塞的竞争锁的方法trylock(),这个方法可以通过返回true/false,来告诉当前线程是否有其他线程正在使用锁,而synchronized由于是关键字,所以它无法去实现非阻塞竞争锁的方法,另外synchronized锁的释放是被动的,都是当synchronized同步代码块执行结束以后或者代码出现异常的时候才会被释放,最后lock提供了公平锁和非公平锁的机制,公平锁是指线程竞争锁资源时候如果已经有其他线程正在排队或者等待锁释放,那么当前竞争锁的线程是无法去插队的,而非公平锁就是不管是否有线程在排队等待锁,它都会去尝试去竞争一次锁,synchronized只提供了一种非公平锁的实现

第四:从性能方面来看,synchronized和lock在性能方面相差不大,在实现上会有一定的区别,synchronized引入了偏向锁,轻量级锁和重量级锁以及锁升级的机制来去实现锁的优化,而lock中则用到了自旋锁的方式去实现性能的优化

@Autowired和@Resource注解区别

这2个注解都是Spring生态里面去实现Bean的依赖注入

首先@Autowired是spring里面提供的一个注解,它默认是根据类型进行依赖注入,里面有一个required属性,默认是true,表示强制要求bean实例的一个注入,在应用启动时候,如果IOC容器里面不存在对应类型的bean,那么启动的时候就会报错,但如果我们不希望去实现自动注入,可以把属性设置为false 其次如果在springIOC容器里面存在多个相同类型的bean实例,由于它是根据类型来注入bean实例的,所以spring容器启动的时候会提示一个错误意思是原本只能注入一个单实例bean,但是在IOC容器里面会有多个,导致注入失败,我们可以使用@Primary和@Qualifier注解来解决,primary表示主要的bean,当存在多个相同类型bean的时候,优先使用声明@Primary注解的一个bean,qualifier类似于条件筛选,它根据bean的名字去找到需要装配的目标bean

@Resource是JDK里面提供的注解,只是Spring在实现上提供了这种注解功能的一个知识,和Autowired注解使用相同,最大的差异是Resource可以支持ByName和ByType两种注入方式,如果使用name,Spring会根据bean的名字去进行依赖注入,如果使用type,Spring会根据类型去实现依赖注入,假设两个都没有配置的情况下,它会先根据定义的属性名字去匹配,如果没有匹配成功,再根据类型来匹配,如果两个没有匹配到的话,就会报错

总结:1.Autowired是根据类型来匹配的,而Resource可以根据name和type来匹配,默认是name

2.Autowired是Spring里面定义的注解,而Resource是JSR 250规范里面定义的注解,只是Spring对JSR 250提供了支持而已

3.Autowired如果需要支持name匹配,就需要使用Primary和Qualifier注解来实现支持

IOC工作流程

IOC是什么?IOC全称控制反转,它的核心思想是把对象的管理权限交给容器,应用程序如果需要使用某个对象的实例,那么直接从IOC容器里面去获取就可以了,这样设计的好处就是降低了程序里面对象与对象之间的耦合性,使得程序的整个体系结构变得更加灵活

Bean的声明方式:spring提供了很多方式去声明一个bean,比如在XML里面通过<bean>标签或者通过@Service注解或者通过@Configuration配置类里面通过@Bean注解去声明等等,那么Spring在启动的时候去解析这些bean然后保存到IOC容器里面

第一阶段是IOC容器的初始化阶段,这个阶段主要是根据程序里面定义的XML或者注解等bean的声明方式通过解析和加载后生成bean definition,然后把bean definition注册到IOC容器里面,通过注解或者XML声明的bean,都会解析得到一个bean definition实体,这个实体里面会包含bean的一些定义和基本的一些属性,最后把这个bean definition保存到一个map集合里面从而完成IOC的初始化 IOC作用就是对这些注册的bean的定义信息进行处理和维护,它是IOC容器控制繁殖的一个核心

第二阶段是完成bean初始化和依赖注入。第一个是通过反射去针对没有设置lazy-init属性的单例bean进行初始化,第二完成bean的依赖注入

最后一个阶段就是bean的一个使用,通常我们会通过Autowired注解或者BeanFactory.getBean()从IOC容器里面去获取一个指定bean的一个实例,另外针对设置lazy-init属性以及非单例bean的一个实例化,是在每一次获取bean对象的时候,调用bean的初始化方法来完成实例化,并且SpringIOC不会去管理这些bean

ArrayList扩容 

ArrayList是一个数组结构的存储容器,默认情况下数组的长度是10个,当然我们也可以在构建ArrayList对象的时候,指定初始长度,那么随着在程序里面不断的往ArrayList里面添加数据,当添加的数据达到10个时候,ArrayList里面就没有足够的容量去存储后续的数据,那么这个时候呢,ArrayList会触发自动扩容,首先创建一个新的数组,这个新数组的长度是原来数组长度的1.5倍,然后使用Arrays.copyOf方法把旧数组里面的数据拷贝到新的数组里面,扩容完成以后,再把当前需要添加的元素加入到新的数组里面,从而去完成动态扩容这样的一个过程

索引的优缺点

优点

1、可以大大加快数据的查询速度,特别是在数据表非常大的情况下,没有索引的查询速度会非常缓慢

2、使用索引可以降低数据库的IO成本,当索引命中时,MySQL就不需要扫描整个数据表,而是可以定位到相应的行

3、索引可以保证数据表中的数据唯一性、这对于一些需要唯一数据的场合尤其重要、如主键索引、唯一索引等

4、如果经常需要对某个字段排序,那么可以使用索引来优化排序操作,从而提高查询效率

缺点

1、索引需要占用存储空间,如果数据表非常大,索引可能会占用很多的磁盘空间

2、每次插入、更新或删除数据时,MySQL都需要更新索引,这会降低写入速度

3、索引需要占用内存,当数据表变得非常大时,索引可能会超出内存限制,从而导致性能下降(增加系统开销

4、如果索引设计不当,可能会导致查询性能下降。比如,如果使用了过多的索引,查询优化器可能无法选择最优的索引,从而导致查询性能下降

开启多线程的5种方法 

继承Thread类:创建一个新类,继承Java内置的Thread类,然后重写run()方法,之后创建这个类的实例,并调用start()方法启动线程

实现Runnable接口: 创建一个新类,实现Java内置的Runnable接口,然后重写run()方法,之后创建Thread类的实例,将Runnable对象作为参数传递给Thread构造器,并调用start()方法启动线程

使用ExecutorService和Executors类:Java提供了Executor Service接口和Executors类来更方便地创建和管理线程池,可以使用Executors.newFixedThreadPool()或其他创建线程池,然后通过submit()或者execute()将任务提交给线程池执行

使用Callable和Future接口:该方法能获取返回结果

使用Fork Join Pool和Recursive类或者Recursive Action类

面试经验话术

一、关于薪资方面问题

我看到贵公司岗位薪资范围是6k到8k,那我在同岗位有过相关行业的经验可以快速入手,希望争取能拿到8k的底薪

二、是否接受加班 

我会提高工作效率,尽量在下班之前把所有工作搞定,减少不必要加班,但同时也做好了充分的准备,为目标全力以赴。

三、上一家公司离职的原因

我想在这个专业深耕发展下去,在公司后面调整了产品业务方向,与我的职业规划不相符合

四、离职需要交接多久

现在工作岗位对公司影响还是特别大的,为了妥善稳定交接,大概还要半月左右时间,即使快要离职,我也要对我上一份工作负责任的

五、还有什么要问的

我想了解一下咱们公司目前这个岗位人员有多少,如果有幸加入公司的一员的话,我可以提前准备哪些东西呢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值