面试题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 在每个树行中找最大值