面试题day22()

广联达

秋招面试22届java面经

秋招面试22届java面经

  • 自我介绍
  • 聊了聊项目
  • http与https,分别是什么,区别是什么

    端口、ssl加密、证书

  • https的请求方式
  • 封装继承多态

    将bean封装,提供调用方法、子类继承父类、重载和重写

  • hashmap底层,扩容机制,容量为什么是2的幂

    扰动函数

    (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞

    扩容

    链表引发

    链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

    数组引发

    数组元素大于容量与扩容因子之积,扩容

    put

    HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n – 1) & hash 判断当前元素存放的位置

    如果当前位置无元素的话直接放在当前位置
    如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)

  • 扰动函数

    (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞

  • (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞
  • 扩容

    链表引发

    链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

    数组引发

    数组元素大于容量与扩容因子之积,扩容

  • 链表引发

    链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

  • 链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

  • 数组大小大于64,转红黑树
  • 数组大小小于64,扩容
  • 数组引发

    数组元素大于容量与扩容因子之积,扩容

  • 数组元素大于容量与扩容因子之积,扩容
  • put

    HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n – 1) & hash 判断当前元素存放的位置

    如果当前位置无元素的话直接放在当前位置
    如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)

  • HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n – 1) & hash 判断当前元素存放的位置

    如果当前位置无元素的话直接放在当前位置
    如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)

  • 如果当前位置无元素的话直接放在当前位置
  • 如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)
  • 数据库怎么优化

    多表关联最多2张
    使用left join或right join代替not in和exist
    不使用外键和触发器
    查找避免索引失效
    逻辑删除
    更新使用id作为条件,更新非索引字段
    增加 id有顺序

  • 多表关联最多2张
  • 使用left join或right join代替not in和exist
  • 不使用外键和触发器
  • 查找避免索引失效
  • 逻辑删除
  • 更新使用id作为条件,更新非索引字段
  • 增加 id有顺序
  • 数据库索引

    b+树、hash索引、数组索引

  • java虚拟机组成

    方法区 堆
    本地方法栈、虚拟机栈、程序计数器、直接内存

  • 怎么判断一个对象要不要回收

    引用计数法、可达性分析

  • 什么是GC roots

    本地方法栈、虚拟机栈、静态变量、常量

  • 垃圾回收器
  • 进程和线程的理解

    进程是资源分配的基本单位。线程是独立调度的基本单位。

  • 创建线程的几种方式

    thread、runnable、callable

YY直播

Java开发一面:

Java开发一面:

  • 自我介绍
  • 常用集合类,然后挑一个熟悉的介绍

    arraylist、linkedlist、hashmap、hashset、treeset、treemap

  • JVM垃圾回收算法,垃圾回收过程

    分代、复制、清除、整理

  • MySQL的事务四大特性、索引底层实现、事务隔离级别实现

    acid
    b+树
    锁+mvcc

  • Redis的五大对象,然后他们底层的数据结构

    string

    int
    embstr
    raw

    list

    ziplist
    linkedlist

    hash

    hash
    ziplist

    set

    hash
    intset

    zset

    skiplist
    ziplist

  • int
  • embstr
  • raw
  • ziplist
  • linkedlist
  • hash
  • ziplist
  • hash
  • intset
  • skiplist
  • ziplist
  • 计算机网络OSI七层模型,介绍每一层的作用

    物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • 介绍项目(项目描述、自己负责什么,遇到的难点,如何解决的,你负责的模块,你当队长是怎么分配工作内容和管理的,挑一个模块细讲)
  • 项目中为什么要拿Reids做缓存,考量是什么

    中心化、支持数据类型丰富

  • 怎么实现缓存一致性的,怎么解决

    先修改数据库、再删除缓存
    先删除缓存、再修改数据库、在删除缓存(延时双删)

二面

二面

  • 介绍一下项目
  • 项目有上线吗?
  • 项目整个流程
  • 项目模块是怎么划分的,考量?
  • api模块和网关模块是干嘛的?说说网关作用,一个请求来了,网关如何处理?

    API网关是用户与服务器之间的连接器。

  • Nacos作用?
  • 物流、支付怎么做的,讲讲。
  • 用户支付了,怎么保证支付成功的,网络问题怎么办?
  • 用了ES是嘛,为什么要用ES?效率为什么比Mysql快?说一下他们各自的使用场景
  • 用了Redis来存储是吗?为什么要用redis,考量是什么?他的作用是什么?

    redis是基于内存存储计算,性能速读远超mysql等数据库,计算速度很快,所以在使用的时候数据响应很快,
    redis支持多种多样的数据结构,如字符串、tree、ztree、map、等,这些丰富的数据结构,可以满足我们在开发工作大部分常见数据结构,进行存储。
    redis丰富的api支持,让我们在使用的时候,常见的查询存储都能够很方便的使用,支持自定的查询的api等等
    redis的生态比较成熟,很多家大型公司都在使用,很多相关的知识扩展以及分析
    redis分布式集群化扩展性极高,而且稳定,能够支撑大量的数据吞吐,只要硬件支持。

  • Redis有哪些作用一般?

    计数器、分布式锁、缓存、排行榜

  • 讲讲分布式锁怎么实现的?

    关键命令

    SETNX

    SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

    EXPIRE

    EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

    DELETE

    DELETE key:删除key

    实现思想

    获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

    获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

    释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

  • 关键命令

    SETNX

    SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

    EXPIRE

    EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

    DELETE

    DELETE key:删除key

  • SETNX

    SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

  • SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
  • EXPIRE

    EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

  • EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
  • DELETE

    DELETE key:删除key

  • DELETE key:删除key
  • 实现思想

    获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

    获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

    释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

  • 获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
  • 获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
  • 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
  • Redis为什么可以在多线程下做分布式锁

    因为Redis是单线程处理的

  • spring?说说spring相比传统的开发好处是什么?

    ioc、aop

  • 说说你用过的注解
  • spring事务注解用过嘛?在什么情况下用的?什么情况下这个注解会失效?

    aop性质导致方法必须为public
    设置异常为exception
    隔离级别
    传播行为

  • spring特点,IOC的作用,好处是什么,为什么?

    Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

  • 用过ping吗?
  • 计算机网络,四层模型?具体讲讲传输层和网络层干嘛的?

    应用层、传输层、网络层、数据链路层
    https、tcp\udp、ip

  • 网络层不传输数据吗?

    传输,无连接、非可靠、不确认

渤海银行

提前批面经

提前批面经

  • 什么是反射?

    反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

  • 重载和重写的区别,多态的两个特性,子类能重写父类构造方法吗,为什么?

    方法重载、子类重写
    子类不能重写父类构造方法、重写必须保证参数个数、参数类型、参数顺序一致、构造不满足条件

  • 线程池是什么?

    7大参数,4中拒绝策略,和java提供好的4种线程池以及优缺点

  • redis中有1E条数据,找出1W条前缀相同数据。

    分批次Scan无阻塞提取列表,每次执行返回少量元素,非递增小心要去重,存入HashSet

  • redis线程模型

    IO多路复用、单线程的文件派发模型

————————

广联达

秋招面试22届java面经

秋招面试22届java面经

  • 自我介绍
  • 聊了聊项目
  • http与https,分别是什么,区别是什么

    端口、ssl加密、证书

  • https的请求方式
  • 封装继承多态

    将bean封装,提供调用方法、子类继承父类、重载和重写

  • hashmap底层,扩容机制,容量为什么是2的幂

    扰动函数

    (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞

    扩容

    链表引发

    链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

    数组引发

    数组元素大于容量与扩容因子之积,扩容

    put

    HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n – 1) & hash 判断当前元素存放的位置

    如果当前位置无元素的话直接放在当前位置
    如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)

  • 扰动函数

    (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞

  • (h = key.hashCode()) ^ (h >>> 16); 低16位与高16位做异或操作^,减少hash碰撞
  • 扩容

    链表引发

    链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

    数组引发

    数组元素大于容量与扩容因子之积,扩容

  • 链表引发

    链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

  • 链表长度大于8,判断是否转为红黑树

    数组大小大于64,转红黑树
    数组大小小于64,扩容

  • 数组大小大于64,转红黑树
  • 数组大小小于64,扩容
  • 数组引发

    数组元素大于容量与扩容因子之积,扩容

  • 数组元素大于容量与扩容因子之积,扩容
  • put

    HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n – 1) & hash 判断当前元素存放的位置

    如果当前位置无元素的话直接放在当前位置
    如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)

  • HashMap 通过 key 的 hashCode 经过 hash() 处理过后得到 hash 值,然后通过 (n – 1) & hash 判断当前元素存放的位置

    如果当前位置无元素的话直接放在当前位置
    如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)

  • 如果当前位置无元素的话直接放在当前位置
  • 如果当前位置有元素的话,通过key的equals方法进行判断,如果返回true的话直接更新当前位置,如果false的话需遍历链表,存在即覆盖,否则新增,此时链表时间复杂度为O(n)
  • 数据库怎么优化

    多表关联最多2张
    使用left join或right join代替not in和exist
    不使用外键和触发器
    查找避免索引失效
    逻辑删除
    更新使用id作为条件,更新非索引字段
    增加 id有顺序

  • 多表关联最多2张
  • 使用left join或right join代替not in和exist
  • 不使用外键和触发器
  • 查找避免索引失效
  • 逻辑删除
  • 更新使用id作为条件,更新非索引字段
  • 增加 id有顺序
  • 数据库索引

    b+树、hash索引、数组索引

  • java虚拟机组成

    方法区 堆
    本地方法栈、虚拟机栈、程序计数器、直接内存

  • 怎么判断一个对象要不要回收

    引用计数法、可达性分析

  • 什么是GC roots

    本地方法栈、虚拟机栈、静态变量、常量

  • 垃圾回收器
  • 进程和线程的理解

    进程是资源分配的基本单位。线程是独立调度的基本单位。

  • 创建线程的几种方式

    thread、runnable、callable

YY直播

Java开发一面:

Java开发一面:

  • 自我介绍
  • 常用集合类,然后挑一个熟悉的介绍

    arraylist、linkedlist、hashmap、hashset、treeset、treemap

  • JVM垃圾回收算法,垃圾回收过程

    分代、复制、清除、整理

  • MySQL的事务四大特性、索引底层实现、事务隔离级别实现

    acid
    b+树
    锁+mvcc

  • Redis的五大对象,然后他们底层的数据结构

    string

    int
    embstr
    raw

    list

    ziplist
    linkedlist

    hash

    hash
    ziplist

    set

    hash
    intset

    zset

    skiplist
    ziplist

  • int
  • embstr
  • raw
  • ziplist
  • linkedlist
  • hash
  • ziplist
  • hash
  • intset
  • skiplist
  • ziplist
  • 计算机网络OSI七层模型,介绍每一层的作用

    物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • 介绍项目(项目描述、自己负责什么,遇到的难点,如何解决的,你负责的模块,你当队长是怎么分配工作内容和管理的,挑一个模块细讲)
  • 项目中为什么要拿Reids做缓存,考量是什么

    中心化、支持数据类型丰富

  • 怎么实现缓存一致性的,怎么解决

    先修改数据库、再删除缓存
    先删除缓存、再修改数据库、在删除缓存(延时双删)

二面

二面

  • 介绍一下项目
  • 项目有上线吗?
  • 项目整个流程
  • 项目模块是怎么划分的,考量?
  • api模块和网关模块是干嘛的?说说网关作用,一个请求来了,网关如何处理?

    API网关是用户与服务器之间的连接器。

  • Nacos作用?
  • 物流、支付怎么做的,讲讲。
  • 用户支付了,怎么保证支付成功的,网络问题怎么办?
  • 用了ES是嘛,为什么要用ES?效率为什么比Mysql快?说一下他们各自的使用场景
  • 用了Redis来存储是吗?为什么要用redis,考量是什么?他的作用是什么?

    redis是基于内存存储计算,性能速读远超mysql等数据库,计算速度很快,所以在使用的时候数据响应很快,
    redis支持多种多样的数据结构,如字符串、tree、ztree、map、等,这些丰富的数据结构,可以满足我们在开发工作大部分常见数据结构,进行存储。
    redis丰富的api支持,让我们在使用的时候,常见的查询存储都能够很方便的使用,支持自定的查询的api等等
    redis的生态比较成熟,很多家大型公司都在使用,很多相关的知识扩展以及分析
    redis分布式集群化扩展性极高,而且稳定,能够支撑大量的数据吞吐,只要硬件支持。

  • Redis有哪些作用一般?

    计数器、分布式锁、缓存、排行榜

  • 讲讲分布式锁怎么实现的?

    关键命令

    SETNX

    SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

    EXPIRE

    EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

    DELETE

    DELETE key:删除key

    实现思想

    获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

    获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

    释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

  • 关键命令

    SETNX

    SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

    EXPIRE

    EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

    DELETE

    DELETE key:删除key

  • SETNX

    SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。

  • SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
  • EXPIRE

    EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。

  • EXPIRE key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
  • DELETE

    DELETE key:删除key

  • DELETE key:删除key
  • 实现思想

    获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

    获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

    释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

  • 获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
  • 获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
  • 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
  • Redis为什么可以在多线程下做分布式锁

    因为Redis是单线程处理的

  • spring?说说spring相比传统的开发好处是什么?

    ioc、aop

  • 说说你用过的注解
  • spring事务注解用过嘛?在什么情况下用的?什么情况下这个注解会失效?

    aop性质导致方法必须为public
    设置异常为exception
    隔离级别
    传播行为

  • spring特点,IOC的作用,好处是什么,为什么?

    Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

  • 用过ping吗?
  • 计算机网络,四层模型?具体讲讲传输层和网络层干嘛的?

    应用层、传输层、网络层、数据链路层
    https、tcp\udp、ip

  • 网络层不传输数据吗?

    传输,无连接、非可靠、不确认

渤海银行

提前批面经

提前批面经

  • 什么是反射?

    反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

  • 重载和重写的区别,多态的两个特性,子类能重写父类构造方法吗,为什么?

    方法重载、子类重写
    子类不能重写父类构造方法、重写必须保证参数个数、参数类型、参数顺序一致、构造不满足条件

  • 线程池是什么?

    7大参数,4中拒绝策略,和java提供好的4种线程池以及优缺点

  • redis中有1E条数据,找出1W条前缀相同数据。

    分批次Scan无阻塞提取列表,每次执行返回少量元素,非递增小心要去重,存入HashSet

  • redis线程模型

    IO多路复用、单线程的文件派发模型