恒生电子面试 JAVA社招 两年经验(已通过)

文章目录

  • 恒生电子面试
    • 一面 2021.5.31 下午两点
      • 1. 自我介绍
      • 2. 工作过程中印象最深的一件事情
      • 3. 该事情有没有做复盘
      • 4. java 集合(八股文)
        • 4.1. 说说list set map 的理解
        • 4.2. arrayList和LinkedList的不同
        • 4.3. hashmap 1.7和1.8的不同
        • 4.4 concurrentHashmap讲讲
      • 5. 深拷贝和浅拷贝
      • 6. java四种引用方式
      • 7. java 1.8 新特性
      • 8. 数据库索引类型
      • 9. 数据库组合索引 什么情况下有效,什么情况下失效,如果通过函数包裹索引字段,查询是否走索引
      • 10. 数据库慢sql优化
      • 11. 平常排查思路 内存泄漏
      • 12. redis的哨兵模式和主从模式的区别
      • 13. 多个线程如何保证顺序执行
      • 14. 线程池的了解
      • 15. dubbo的分层基本十层
      • 16. sychornized和recentLock区别
      • 17. spring源码中用到的设计模式
      • 17. 为什么来杭州
      • 18. 期望薪资多少
    • 二面
      • 1. 自我介绍(着重介绍项目)
      • 2. 项目中印象最深刻的事情
      • 3. 线上故障的处理能力,以及临时应变能力
      • 4. 为什么来杭州
      • 5. 为什么选择恒生
      • 6. 对恒生的业务的了解
      • 7. 期望薪资多少
    • 结语

恒生电子面试

一面 2021.5.31 下午两点

1. 自我介绍

巴拉巴拉

2. 工作过程中印象最深的一件事情

说一件工作中印象最深刻的事情,并且会问问你排查的细节

3. 该事情有没有做复盘

关于印象最深刻事情的复盘以及后期如何处理

4. java 集合(八股文)

就是八股文的面试

4.1. 说说list set map 的理解

  • list (对付顺序的好帮⼿): 存储的元素是有序的、可重复的。
  • set(注重独一无二的性质):存储的数据是无序的、不可重复的。
  • Map(用Key搜索的专家):使用键值对(Key-Value)存储,类似数学上的函数 Key是无序的、不可重复的 Value是无序的、可重复的

4.2. arrayList和LinkedList的不同

  1. 是否线程安全
    ArrayListLinkedList都是不同步的,也就是不能保证线程安全
  2. 底层数据结构
    ArrayList底层使用的是Object数组 LinkedList底层使用的是双向链表
  3. 插入和删除是否受元素位置的影响
    1. ArrayList 采用的是数组存储,所以插入和删除元素的时间复杂度受元素位置的影响,比如:执行add(E e) 方法 ArrayList会默认将需要插入的元素插入到列表的尾部,这种情况下的时间复杂度是O(1)。但如果是在指定位置i插入和删除元素的话,时间复杂度就是O(n-i)。因为在进行上述操作的时候集合中的第i个元素和第i个元素之后的(n-i)个元素都要执行向后/前移一位的操作
    2. LinkedList 采用的是链表存储,所以插入和删除元素不会受元素位置的影响
  4. 是否支持随机快速访问
    1. LinkedList 不支持随机快速访问,因为其实链表结构,需要从头开始查找到指定位置
    2. ArrayList 支持随机快速访问,因为它是数组结构,可以根据下标直接查找对应位置
  5. 内存空间占用
    1. ArrayList的空间浪费体现在每个list列表的结尾都会预留一定的容量空间
    2. LinkedList的空间浪费体现在它的每一个数据都比ArrayList要消耗更多的空间(因为要存放前一个和后一个元素指针)

4.3. hashmap 1.7和1.8的不同

阿里面试官没想到一个HashMap,我能跟他扯半小时

4.4 concurrentHashmap讲讲

HashMap?ConcurrentHashMap?相信看完这篇没人能难住你!

5. 深拷贝和浅拷贝

  • 浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
  • 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。

6. java四种引用方式

  • 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出OutOfMemoryError错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间会回收该对象
  • 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用而不会被垃圾回收器回收只有在内存不足时,软引用才会被垃圾回收器回收。
  • 弱引用:具有弱引用的对象拥有更短的生命周期。因为当JVM进行垃圾回收时,一旦发现弱引用的对象,无论当前内存空间是否充足,都会进行回收,不过因为垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象
  • 虚引用 顾名思义,就是形同虚设,如果对一个对象仅仅持有虚引用,那么它相当于没有任何引用,在任何时候都有可能被回收
引用类型 GC回收时间 用途 生存时间
强引用 从不 对象的一般状态 JVM停止运行时
软引用 内存不足时 对象缓存 内存不足时终止
弱引用 GC时 对象缓存 GC后终止
虚引用 随时 UNKNOW 随时

7. java 1.8 新特性

  1. lamda表达式
  2. stream流 filter foreach map 等stream流只可以使用一次就会关闭
    Java 8的新特性—终极版

8. 数据库索引类型

我以为我对数据库索引十分了解,直到我遇到了阿里面试官。

9. 数据库组合索引 什么情况下有效,什么情况下失效,如果通过函数包裹索引字段,查询是否走索引

最左匹配原则

10. 数据库慢sql优化

腾讯面试:一条SQL语句执行得很慢的原因有哪些?—不看后悔系列

11. 平常排查思路 内存泄漏

12. redis的哨兵模式和主从模式的区别

13. 多个线程如何保证顺序执行

多个编程保证执行的方式有两种

  1. 通过join方法来实现
public static void main(String[] args) {
    try {
            System.out.println("main开始运行");
            thread1.start();
            thread1.join(); //让thread1强制执行完毕后,才可以执行后面的代码
            thread2.start();
            thread2.join();
            thread3.start();
            thread3.join();
            System.out.println("main运行结束");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

使用join()方法后,运行结果则会固定下来,如下:

main开始运行
thread1运行
thread2运行
thread3运行
main运行结束

  1. 使用线程池的方式
    Java5.0提供了java.util.concurrent(简称JUC)包,提供了并发编程中一些常用的工具类。Executors是JDK中java.util.concurrent包下线程池操作类,提供方便的线程池的操作。我们使用Executors中的newSingleThreadExecutor()方法,创建一个单线程的线程池,也可以达到控制线程执行顺序的目的
    关键代码如下:
static ExecutorService executorService = Executors.newSingleThreadExecutor();
  public static void main(String[] args) {
        System.out.println("main开始运行");
        executorService.submit(thread1);
        executorService.submit(thread2);
        executorService.submit(thread3);
        executorService.shutdown();
        System.out.println("main运行结束");
    }

运行结果如下:

main开始运行
main运行结束
thread1运行
thread2运行
thread3运行

原理介绍:
newSingleThreadExecutor()方法创建的线程池是一个基于FIFO(先进先出)的队列,也就是说,当我们依次将thread1,thread2,thread3加入队列中时,实际在就绪状态的只有thread1这个线程,thread2,thread3则会被添加到队列中等待,当thread1执行完毕后,则会按进入队列的先后顺序执行队列中的其他线程。

14. 线程池的了解

java线程池讲解

15. dubbo的分层基本十层

恒生电子面试 JAVA社招 两年经验(已通过)_第1张图片
dubbo基本结构为十层
可以分配三个层次

  1. Bussiness(业务层)
    • Service层 包括我们的业务代码 比如 接口 实现类 直接面向开发者
  2. RPC层(远程过程调用层)
    • Config 配置层,对外提供配置,以ServiceConfig和ReferenceConfig为核心,可以直接初始化配置类,也可以解析配置文件生成
    • proxy代理层 无论是provider还是consumer,框架都会产生一个代理类,使开发人员不需要关于底层的实现细节,Service层对远程调用无感
    • Registry 注册中心层 封装服务注册地址的发现与注册,以url为中心
    • Cluster 路由层(集群容错层)提供了多个服务提供者的路由策略和负载均衡策略,桥接注册中心,以invoker为核心
    • Monitor 监控层 监控RPC的相关调用信息,如调用次数,调用时间,成功失败的次数等
    • Protocol 远程调用层 封装RPC的调用,无论是服务的暴露还是服务的引用,都是以Protocol作为主功能入口,负责Invoker的整个生命周期
  3. Remoteing层(远程数据传输层)
    • Exchange 信息交换层 封装请求和响应的模式 如把请求同步异步相互转化
    • Transport 网络传输层 统一网络传输的接口 如netty和mina统一为一个网络传输接口
    • Serialize 数据序列化层 负责整个框架中数据传输的序列化和反序列化

16. sychornized和recentLock区别

17. spring源码中用到的设计模式

17. 为什么来杭州

18. 期望薪资多少

二面

恒生的二面应该是主管面,技术性的并不是特别多

1. 自我介绍(着重介绍项目)

2. 项目中印象最深刻的事情

3. 线上故障的处理能力,以及临时应变能力

4. 为什么来杭州

5. 为什么选择恒生

6. 对恒生的业务的了解

7. 期望薪资多少

结语

楼主已经走完面试流程,并成功拿到了offer,具体薪资就不在这儿透露了,想知道具体信息的小伙伴们私信我。
最后,希望各位前程似锦面试顺利与君共勉

你可能感兴趣的:(面试,java,面试)