面试题day9

BIGO

  • 实习做了什么

  • 介绍实习的项目

  • 有哪些数据结构

    数组 arraylist

    栈 stack

    队列 blockqueue

    链表 linkedlist

    树 TreeSet

    散列表 HashSet

  • 链表和数组的区别

    arraylist 底层为数组,判断add扩容1.5倍,设置初始大小。 多读少写

    linkedlist 底层为双向指针 多写少读

    arraylist线程安全

    • vector
    • conllections.synchronized()
    • CopyOnWriteArrayList
  • 跳表的原理和插入过程

    通过建立索引的方式,对于数据量越大的有序链表,通过建立多级索引,查找效率提升会非常明显。

    这种链表加多级索引的结构 就是 跳表。

    为了保证原始链表中数据的有序性,我们需要先找到新数据应该插入的位置。 可以基于多级索引,快速查找到新数据的插入位置,时间复杂度为O(log n)。

  • 场景题:有很多数据,各自具有依赖关系,采用什么数据结构存储

  • 三次握手和四次挥手的过程

    syn y

    ack y+1 syn x

    ack x+1

    syn y

    ack y+1

    syn x

    ack x+1

  • 工厂模式的设计思路,优缺点

    提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

    优点: 扩展性好,符合了开闭原则,新增一种产品时,只需增加改对应的产品类和对应的工厂子类即可。符合单一职责原则,每个工厂只负责一种产品,而不是由一个工厂去生成所有商品。

    缺点: 当我们新增产品时,还需要提供对应的工厂类,系统中类的个数将会成倍增加,相当于增加了系统的复杂性。

  • 单例模式

    单例模式面试题

  • 四种引用

    强引用>软引用>弱引用>虚引用

    强引用:此引用引用的对象,生命力最强。(对象不会被GC)
    软引用:此引用引用的对象,在内存不足时可能会被GC。
    弱引用:此引用引用的对象,在GC执行时可能直接会被销毁
    虚引用:用的最少,类似没有引用,主要用于记录对象的销毁。

  • 场景题:如果是一个服务器用于存储数据,然后里面有一些数据是热点数组,需要缓存,用哪种引用

    软引用,防止oom

  • 面向对象和面向过程的区别

    封装继承多态

    封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏(private)

    继承,使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

    多态,允许将子类类型的指针赋值给父类类型的指针。

  • 接口和抽象类的区别

    抽象类:

    构造方法:有构造方法,用于子类实例化使用。
    成员变量:可以是变量,也可以是常量。
    成员方法:可以是抽象的,也可以是非抽象的。

    接口:
    构造方法:没有构造方法
    成员变量:只能是常量。默认修饰符:public static final
    成员方法:jdk1.7只能是抽象的。默认修饰符:public abstract
    jdk1.8可以写以default和static开头的具体方法

  • 多态的分类

    重载、重写

  • finally 的作用

    关闭资源

  • 如果在 finally 块中有 return 语句,发生异常会执行吗?不发生呢?

    • 无论什么情况(try和catch中有return或者try中有异常),finally都是会被执行的。
    • finally是在return后面的表达式运算完之后执行的,在执行完return时,并没有跳出,而是进行到finally中继续执行。
    • 如果在finally中对返回值进行了重新赋值,分两种情况:
      • 当返回值为值类型的时候,返回值不受影响,就是在try catch的时候就已经确定了。
      • 当返回值时引用类型时,会影响到返回值。
  • ArrayList 的扩容过程

    对于ArrayList ,new无参对象时,底层是一个空数组,当添加第一个元素时,会进行扩容,将底层数组长度扩为10,
    其中扩容触发的条件是:存元素时,即先让size+1的值判断是否大于底层elementData.length的长度,如果大于,则先扩容再添加,
    扩容的倍数为1.5倍。ArrayList的详细扩容过程

  • 非线程安全的集合怎么改为线程安全

    conllections.synchronized()

  • LC 21 合并有序链表

  • 怎么实现 IOC 的

    1.先准备一个容器对象,map结构

    2.进行配置文件的读取,或注解的解析操作,将需要创建的bean封装为BeanDefinition对象存储在容器中

    3.容器将封装好的beanDefiniotn对象,通过反射进行实例化操作

    4.通过di注入给类中的对应属性值进行设置,完成整个对象的创建,变成一个完成的bean对象,存储在某个map结构中

    5.通过容器对象来获取对象,进行对象的获取和逻辑处理工作

    6.提供销毁操作,当对象不用,或者容器关闭的时候,将无用的对象进行销毁

  • Shiro 怎么集成的

  • 怎么解决循环依赖的情况

    使用 setter/field 方法注入

    使用 @Lazy

    使用 @PostConstruct

    实现ApplicationContextAware and InitializingBean接口

  • 做了这个项目的收获

  • Redis 的数据结构有哪些?使用场景?

    • string 缓存 session共享 分布式锁
    • list 消息队列
    • hash 存储对象
    • set 集合
    • zset 排行榜
  • 场景题:记录活跃用户

  • 核心组件有哪些以及对应的功能

  • Netty 的线程模型

  • LC 515 在每个树行中找最大值

posted @ 2022-07-20 13:35  Faetbwac  阅读(17)  评论(0编辑  收藏  举报