成都-友邦咨询-线下面试-Java开发
笔试:英语逻辑题 英语作文
面试:
1. 英语自我介绍 口语交流(问答一个问题)
2. Java 四个特性:面向对象、封装、继承、多肽的各自特点
面向对象:Java是一门面向对象的编程语言,所有的操作都是基于对象的。它将真实世界中的事物抽象成对象,然后通过类的定义来描述对象的属性和行为,并且支持封装、继承和多态等特性,让程序更加模块化和易于维护。
封装∶封装是指将对象的状态信息隐藏起来,只提供有限的访问方式。Java中的封装可以通过访问修饰符来实现,比如public、private、protected等。通过封装,我们可以保证对象的安全性和可靠性,同时也可以隔离对象的内部实现,让客户端无需关心具体的实现细节。
继承:继承是指在已有类的基础上定义新的类。在Java中,子类可以继承父类的属性和方法,同时也可以通过重写和覆盖来实现自己的特殊需求。继承可以提高代码的复用性,同时也可以简化代码的实现。
多态:多态是指同一种行为具有多种不同的表现形式。在Java中,多态可以通过方法的重载和覆盖来实现。在重载中,同一方法名可以根据参数列表的不同调用不同的方法;在覆盖中,子类可以重写父类的方法,并且在运行时根据具体的对象调用相应的方法。多态可以提高代码的灵活性和扩展性,同时也可以减少代码的耦合性。
3. private和protected的区别
private是完全私有的,只有自己可以访问,派生类和外部都不可以访问
protected是受保护的,只有派生类可以访问,外部不能访问
在类外如果想使用类中的成员,只能直接使用public类型的,proteced和private都是不能访问的,对于类外而言,这两个是完全相同的
4. 数据库 事物
1.1 事务传播方式(七种)
spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则 按REQUIRED属性执行。
1.2 五个隔离级别
spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:
1. ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;
2. ISOLATION_READ_UNCOMMITTED:读未提交,最低隔离级别、事务未提交前,就可被其他事务读取(会出现脏读、幻读、不可重复读);
3. ISOLATION_READ_COMMITTED:读已提交,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;
4. ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;
5. ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、幻读、不可重复读。
脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
幻读 :指同一个事务内多次查询返回的结果集不一样。
不可重复读 :是指在一个事务内,多次读同一个数据,结果不一样。
1.3 acid有冲突吗覆盖
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)
原子性:事务是数据库的逻辑工作单位,事务中包括的所有操作要么都做,要么都不做。
一致性:事务执行的结果必须是使数据库从一个一致性状态变成另一个一致性状态。
隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
持续性:持续性也称永久性(Permanence),指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
5. Java1.8jdk中的stream流介绍
Stream 支持并行处理,可以通过 parallel() 方法将流转换为并行流,目前我们使用的Stream流是串行的,就是在一个线程上执行。parallelStream其实就是一个并行执行的流。
获取Stream流的方式:java.util.stream.Stream 是Java 8新加入的流接口。(并不是一个函数式接口)
获取一个流非常简单,有以下几种常用的方式:
● 所有的 Collection 集合都可以通过 stream 默认方法获取流(顺序流);
● 所有的 Collection 集合都可以通过parallelStream获取并行流
● Stream 接口的静态方法 of 可以获取数组对应的流。
● Arrays的静态方法stream也可以获取流
6. redis中可以设置null吗?可以,可以解决缓存穿透。
缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致查询这个不存在的数据,请求每次都要到数据库去查询,失去了缓存的意义。
解决方案
1. 利用过滤器:由于请求的参数是不合法的(每次都请求不存在的参数),使用布隆过滤器 (BloomFilter)或者压缩 filter 提前拦截,不合法就不让这个请求到数据库层!
2. 设置空值:当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。这种情况我们一般会将空对象设置一个较短的过期时间(不超过 5 分钟)。
7. redis roketmq
基于RocketMQ和Redis实现削峰、重复消费问题、幂等性处理;
幂等性是指对同一操作进行多次执行,结果与仅执行一次的效果相同。简单来说,无论执行多少次,结果都是一致的。在消息系统中,幂等性非常重要。当涉及到消息的发送、处理和消费时,保持消息的幂等性可以确保系统在面对重复消息时不会产生副作用或不一致的结果。
RocketMQ消息重复消费原因
1. 客户端重复发送:在某些情况下,客户端可能由于网络问题或其他原因导致消息发送失败,然后再次尝试发送相同的消息。这将导致消息在 RocketMQ 中重复消费。
2. 重试机制:RocketMQ 提供了消息重试机制,如果消息在消费过程中发生异常,消费者可能会重新拉取相同的消息进行消费。如果消费者的处理逻辑没有幂等性,则消息可能会重复消费。
3. 消息消费者宕机和重启:当消息消费者由于宕机、重启或其他原因停止消费一段时间后再次启动时,它可能会重新从上次的消费位置开始消费。如果消息消费者没有正确维护消费进度或消费进度存储出现问题,就可能导致消息被重复消费。
4. 集群模式下的消息重复消费:在 RocketMQ 的集群模式下,如果多个消费者订阅相同的主题,并且每个消费者组都独立消费消息,那么同一条消息就有可能被不同的消费者组重复消费。
幂等性处理原理
在RocketMQ的消费端,我们可以通过Redis实现幂等性处理的原理如下:
1. 消息消费前,先判断Redis中是否存在该消息的消费记录。
2. 如果Redis中存在该消息的消费记录,则说明该消息正在被消费,可以跳过当前消息的消费,避免重复执行。
3. 如果Redis中不存在该消息的消费记录,则进行消费并将该消息的消费记录写入Redis。
4. 消息消费完成后,可以释放Redis中该消息的消费记录。
流量削峰:
流量峰值时刻是一个非常恶性的问题,当一大批的用户同时访问应用程序时,可能会导致服务器崩溃和应用程序的严重延迟。这是因为在流量高峰期间,服务器无法同时服务于大量的请求,导致应用程序无法及时响应并提供服务。
1. 为了解决这个问题,我们可以借助Redis实现流量削峰,从而更加高效地处理并发请求访问。流量削峰的基本思路是将高峰期的请求存储在一个缓存队列中,然后逐步将请求从队列中取出并处理。通过这种方式,我们可以重点关注应用程序的承载能力,避免服务器的压力过大。基于Redis的流量削峰的实现相对简单,我们可以使用Redis的列表(List)结构来作为存储请求的队列。具体来说,我们可以使用一个Redis列表模拟队列,将所有的请求添加到队列的末尾。而当请求被一个工作线程取出并处理后,它会从队列的头部取出。
2. 通过MQ的方式,将订单存储到MQ队列中,消费端通过拉取的方式,并且拉取速度由消费端来控制,则就可以控制流量趋于平稳。这样对于结算系统来讲,就达到了削峰填谷的目的。或者说起到控流的目的
8. 集合
集合类包括 :Collection(集合)和 Map(映射)两大类,Collection接口包括Set(无序不重复)和List(有序可重复)两个子接口。
1. List 接口的实现类主要有:ArrayList、LinkedList 以及 Vector 等;
2. Set 接口的实现类主要有:HashSet、TreeSet
3. Map 接口的实现类主要有:HashMap、TreeMap、HashTable。
Set: treeset hashset
相同点:单例集合,数据不可重复
不同点1:底层使用的储存数据结构不同:
1,Hashset底层使用的是HashMap哈希表结构储存
2,而Treeset底层用的是TreeMap二叉树结构储存。
不同点2:储存的数据保存唯一方式不用。
1,Hashset是通过复写hashCode()方法和equals()方法来保证的。
2,Treeset是通过Compareable接口的compareto方法来保证的。
不同点3:
1. hashset无序 Treeset有序
储存原理:
hashset:底层数据结构是哈希表,本质就是哈希值储存。通过判断元素的hashcode方法和equals方法来保证元素的唯一性。当哈希值不同时就直接进行储存。如果相同,会判断一次equals方式是否返回为true ,如果是true 则视为用的同一个元素,不用再储存。
Treeset:底层数据结构式一个二叉树,可以对set集合中的元素进行排序,这种结构,可以提高排序性能。
9. map底层数据结构是什么?
在 JDK 1.7 中,HashMap 底层使用数组+链表的形式进行存储,在 JDK 1.8 之后,增加了红黑树,即数组+链表+红黑树的形式存储元素。
链表和红黑树之间的转换?
• 链表长度大于 8 且数组长度大于 64,则将链表转换成红黑树;
• 链表长度小于 6 时会将红黑树转换成链表。
为何使用红黑树而非二叉树或平衡树?
相比普通二叉树,红黑树是一棵平衡树,它的添加、删除和查找操作最差时间复杂度为 O(logn),避免了普通二叉树最差情况下 O(n) 的复杂度。平衡二叉树是比红黑树更加严格的平衡树,为了达到平衡需要进行更多的旋转次数,所以红黑树插入删除操作效率更高。
10. list去重
1 HashSet去重:将 List 集合转换成 HashSet 集合
2 LinkedHashSet去重:既能去重又能保证集合的顺序
3 迭代器去重:使用迭代器循环判断每一项数据,如果当前循环的数据,在集合中存在两份或两份以上,就将当前的元素删除掉,这样循环完之后,即可得到一个没有重复数据的集合
4 Stream去重:使用jdk1.8新增的Stream流操作,过滤(Filter): filter() 方法接受一个 Predicate 函数作为参数,用于过滤 Stream 中的元素。只有满足 Predicate 条件的元素会被保留下来。
5 contains判断去重:新建一个集合,然后循环原来的集合,每次循环判断原集合中的循环项,如果当前循环的数据,没有在新集合中存在就插入,已经存在了就舍弃,就得到了一个没有重复元素的集合了
11. 计算机网络地址 四种 C类地址
A类地址:1.0.0.1~126.255.255.254 私有:(10.0.0.1—10.255.255.254)
B类地址:128.0.0.1~191.255.255.254 私有:(172.16.0.0—172.31.255.254)
C类地址:192.0.0.1~223.255.255.254 私有:(192.168.0.1—192.168.255.255)
D类地址:224.0.0.1~239.255.255.254 (D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110)
E类地址:240.0.0.1~255.255.255.254 (同D类也不分网络和主机地址,它的第1个字节的前四位固定为1111。)
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。C类ip地址默认的子网掩码为255.255.255.0。
12. linux内核相关东西? 我不会。
13. 学习新技术的方式:自由发挥(我的是任务驱动法,直接上手项目,需要用到什么技术就现学什么技术)
后面就反问HR一些问题。(实习期间做什么,能学到什么新技术)
#面经#