List相关面试题
ArrayList底层的实现原理
- ArrayList底层是用动态的数组实现的
- ArrayList初始容量为0.当第一次添加数据的时候才会初始化容量为10
- ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝数组
- ArrayList在添加数据的时候
- 确保数组已使用长度(size)加一之后足够存下一个数据
- 确保新增的数据有地方存储之后,则将新元素添加到位于size的位置上
- 返回添加成功布尔值
- 计算数组的容量,如果当前数组已使用长度+1后大于当前的数组长度,则调用grow方法扩容
String 、StringBuffer 、StringBuilder的区别
- String是不可变的,如果尝试改变,会生成一个字符串对象,StringBuffer和StringBuilder是可变的
- StringBuffer是线程安全的,StringBuilder是线程不安全的,所以单线程环境下StringBuilder效率更高
==和equals的区别
- ==:如果是基本数据类型,比较的是值,如果是引用数据类型,比较的是引用地址
- equals:具体看各个类重写equals方法之后的比较逻辑,比如String类。虽然是引用类型,但是String类重写了equals方法,方法内部比较的是字符串中的各个字符是否全部相等。重写equals方法必须重写hashcode方法。
泛型中extends和super的区别
- <? extends T>表示包括T在内的任何T的子类
- <? super T>表示包括T在内的任何T的父类
ApplicationContext和BeanFactory有什么区别
- Beanfactory是spring的核心组件,表示Bean工厂,可以生成Bean
- ApplicationContext继承了Beanfactory,所以拥有Beanfactory的所有特点,并且它还继承了其他接口,从而还获取了系统环境变量、国际化、事件分布等功能,这个是Beanfactory不具备的。
ArrayList和LinkedList区别
- 底层数据不同,ArrayList底层基于数组,LinkedList底层基于链表
- 基于底层数据的不同,所以使用场景也不同,ArrayList适合随机查找,LinkedList更适合删除和添加
- 两个都实现了list接口,但是LinkedList还额外实现了Deque接口,所以它还可以当作队列使用。
- 两个都线程不安全,如果想要保证线程安全:
- 在方法内使用,局部变量则是线程安全的
- 使用Collections调用一个synchronizedList来包装它们两其中的一个
八大基本数据类型有哪些?
int,short,double,long,布尔,float,char,byte
问题一:String为什么不是基本数据类型,它是什么类型?
答:string是引用数据类型
问题二:int和integer的区别,介绍一下integer
答:int是基本数据类型,而integer是int的封装类,是引用类型。int默认值是0、integer的默认值是null
问题三:float和double有什么区别
答:float和double都是浮点数类型,但是它们的精度和存储空间不同,double类型的精度更高,但是占用的存储空间也更大,float类型存储空间占用少,节省存储空间。
问题四:基本数据类型和引用数据类型有什么区别
- 基本数据类型保存在栈内存当中,保存的是一个具体的值
- 引用数据类型保存在堆内存当中,保存的是引用类型数据的值
Java的特性和优势
简单性、面向对象、可移植性、高性能、分布式、动态性、多线程、安全性、健壮性
数据结构(标红的)
什么是二叉树?
- 每个节点最多有两个叉,分别是左子节点和右子节点
- 不要求每个节点都有两个子节点,有的节点只有左节点、有的只有右节点
什么是二叉搜索树?
- 没有键值相等的节点
- 二叉搜索树的时间复杂度为O(logn)
- 树中的任意一个节点,左子树的每一个节点的值,都要小于这个节点的值,右子树节点的值都要大于这个节点的值
什么是红黑树
- 是一种自平衡的二叉搜索树
- 所有的红黑规则都是希望红黑树能够保证平衡
- 红黑树的时间复杂度:查找、添加、删除都是O(logn)
什么是散列表
- 散列表又名哈希表
- 根据键直接访问在内存存储位置值的数据结构
- 由数组演化而来,利用数组支持按照下标进行随机访问数据
什么是散列冲突
- 又名哈希冲突
- 指多个key映射到同一个数组下标位置
散列冲突-链表法
- 数组的每一个下标位置称之为桶或者槽
- 每个桶会对应一条链表
- hash冲突后的元素都放到相同槽位对应的链表中或红黑树中
HashMap的底层实现原理
- 底层是hash表数据结构,数组+(链表 | 红黑树)
- 添加数据时,计算key的值确定元素在数组中的下标
- key相同则替换
- 不同则存入链表或红黑树中
- 获取数据通过key的hash计算数组下标获取元素
HashMap的jdk1.7和1.8有什么区别
- jdk1.8之前采用的是拉链法,数组+链表
- 1.8之后采用的是数组+链表+红黑树,链表长度大于8并且数组长度大于64则会从链表转化为红黑树
HashMap的put方法具体流程
HashMap的扩容机制