1,Java的基本数据类型有哪些
byte,short,int,long,float,double,boolean,char
2,浅拷贝和深拷贝的区别
浅拷贝只是拷贝了基本数据类型,引用数据类型复制后则会发生引用(引用类型只是拷贝的地址值)
3,重载和从写的区别
重载:只能发生在同一个类中,两个方法名称相同,但是返回值或入参的个数或顺序不同
重写:一般都发生在子父类中,子类重写父类中的方法,方法名,返回值,参数都必须一致,方法体可以不同
4,==与equals的区别
==:用于基本类型比较,比较的是内容,用于引用类型比较的是地址值
equals:主要用于引用类型比较,比较的是地址值,如果该类重写了tostring比较的则是内容,包装类,string都重写了tostring;
如果用==则对比的是在内存中的地址值,用equals则会对比两个封装类型中的具体值
基本数据类型和包装类型之间可以用==来比较,会自动拆箱
两个Interger == 比较,由于都是对象类型,所以不会拆箱比较
Integer i1= -128;的第二步自动装箱时,要调用valueOf(),Integer作为常量时,对于-128到127之间的树,会进行缓存。第二次创建 i2的时候,直接取出缓存,所以相等。而超出范围就是new了新对象了,所以不等。
5,String,StringBuffer,StringBuilder的区别
String是一个不可变的对象,每次String类型进行改变的时候,其实新创建了一个String对象
StringBuffer是线程安全的,也是可变的,每次改变的时候不会新建
StringBuider是线程不安全的,但是速度较快,适合单线程使用
- 操作少量的数据 => String
- 单线程操作字符串缓冲区下操作大量数据 =>StringBuilder
- 多线程操作字符缓冲区下操作大量数据 => StringBuffer
6,final关键字的作用
final主要用在类,变量,方法这三个地方
当final修饰一个类,则表示这个类为最终状态,不能被继承,这个类中的方法也会间接的被定义为final方法
当final修饰一个变量,则表示这个变量在初始化的时候就要指定值,且后续不能对这个值进行修改
使用final的原因有两个:
- 把方法锁定,以防止继承类修改方法的含义
- 节省效率
现在版本中只要对方法,变量设置为private,则会自动赋值为final
7,接口和抽象类的区别是什么
接口是抽象类的一种特例,接口中所有的方法必须都是抽象的
- 抽象类中可以有构造方法,接口中不能有构造方法
- 抽象类中可以有普通成员变量,接口中只能定义常量
- 接口中的方法默认public修饰,抽象类中可以是任意的
- 一个类可以实现多个接口,但是只能继承一个抽象类
- 抽象类的子类使用extends来继承,接口必须使用implements来实现接口
8,throw和throws的区别
throw:主要用在方法体中,进行抛出异常的行为
throws:
- 主要用于方法声明后,表示这个方法有可能会抛出哪些异常,但是并不代表这个方法一定会抛出这些异常
- 在throws可以指定多个异常类型
9,常见的5个RuntimeException
NullPointerException:空指针
ClassNotException:找不到指定类
NumberFormatException:转换为数字时产生异常
IndexOutOfBoundsException:数组下标越界异常
ClassCastException:数据类型转换异常
10,Set,List,Map有什么区别
- Set,List是存储单列数据的集合,Map是存储键值对类型的双列数据集合
- List存储是有序的且可重复,Map中存储的key不能重复,value可重复,Set是不能重复且无序的
- Set也可以说是有序的,元素在集合中的位置由元素的hashcode决定,位置是固定的,但是不能人为控制,所以对用户来说set是无序的
11,往ArrayList集合加入一万条数据,应该怎么提高效率
- 在初始化ArrayList 的时候就指定好具体的容量
- ArrayList 默认容量是 10 ,如果初始化时一开始指定了容量,或者通过集合作为元素,则容量为指定的大小或参数集合的大小。每次扩容为原来的1.5倍,如果使用无参构造器初始化容量只有 10,后面要扩容,扩容有比较伤性能,因为涉及到数组的复制和移动,将原来的数组复制到新的存储区域中去
12,HashMap,Hashtable,ConcurrentHashMap区别
1,线程安全不同
- HashMap是非线程安全的,只是用于单线程环境下
- ConcurrentHashMap是线程安全的,多线程环境下可用
- Hashtable是线程安全的,能用于多线程环境中
2,包含contains方法不同
- HashMap是没有contais方法的,而包括containsValue和containsKey方法
- Hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法
3,是否允许null值
- HashMap允许key和value为null值,containsValue和containsKey方法判断是否包含对应键值对
- HashTable键值对都不能为空,否则会空指针异常
13,ArrayList的扩容机制
- 直接使用ArrayList() 的无参构造,则长度是为0
- ArrayList(int initialCapacity)可以指定容量
- add(Object o) 在添加的时候,首次扩容为10,后续扩容上一次的1.5倍
- addAll(Collection c) 没有元素时,扩容 Math.max(10,实际元素个数),有元素为 Math.max(原容量1.5倍,实际元素个数)
- 实际元素个数 = 当前个数 + 添加个数
14,fail-fast fail-safe
- ArrayList 是 fail-fast 典型代表,遍历的同时不能修改,尽快失败
- CopOnWriteArrayList 是 fail-safe 的典型代表,遍历的同时可以修改,原理读写分离
- 所以 ArrayList 是非线程安全的,CopyOnWriteArrayList 线程安全
15,ArrayList 与 LinkedList 的比较(数据结构,效率方法)
数据结构方法
ArrayList是基于数组实现的,LinkedList是基于链表实现的
效率方面
ArrayList更适合随机查找,因为是用数组实现的,可以直接指定下标来查找
ListedList更适合删除和添加(头部),因为LinkedList 默认保存的有头部位置和尾部位
置,可以直接指定头部位置,然后放到头部位置前面,ArrayList 是需要整体往后挪,空
出一个位置,所以添加头部的时候比ArrayList 要快一些
查询,添加,删除的时间复杂度不同
16,HahMap底层的数据结构
- 在 1.7 及以前,使用的是数组 + 链表
- 在 1.8 及以后,使用的是数组 + (链表或红黑树)
17,jdk8 HashMap底层设计为什么加入红黑树
红黑树用来避免DOS攻击,防止链表超长时性能下降,树化应当是偶然情况,正常情况下概率非常低
18,HashMap 什么时候会触发树化
添加数据时,只有数组的长度大于64的时候,且索引位置元素个数大于8个的时候,才会树化
19,HashMap 什么时候会触发树退化
- 扩容时,原来红黑树上部分数据可能会转移到别的槽中,当红黑树中的元素小于等于6时,退化成链表
- 调用remove 方法删除数据时,删除之前校验红黑树节点 左儿子 左孙子 右儿子 是否存在,如果有一个不存在,退化链表
20,HashMap为什么要进行二次哈希
为了防止一次哈希,尤其是在数组长度较小的情况下,造成分布不均匀的情况
21,HashMap数组的长度为什么是2的n次幂
- 为了保证:%运算 和 &运算 的结果一致,提高计算效率
- 扩容时,hash & oldCap == 0 的元素留在原来位置,否则新的位置 = 旧位置索引 + 旧数组长度,可以提高扩容时重新计算存储索引位置的效率
22,&&与&区别
- &&和 | | 是短路运算符,& 和 | 是非短路运算符
- && 与 & 区别:两者都表示 “ 与 ” 运算,但是 && 运算符第一个表达式不成立的话,后界面的表达式不运算,直接返回。而 & 对所有表达式都判断
- | | 与 | 区别:两者都表示 “ 或 ” 运算,但是 | | 运算符第一个表达式成立的话,后界面的表达式不运算,直接返回。而 | 对所有表达式都判断
23,Java中的值传递和引用传递
- 值传递 在方法调用时,传递的参数是按值得拷贝传递
- 引用传递 在方法调用时,传递得是参数是按引用进行传递,其实传递得引用得地址,也就是变量所对应得内存空间的地址
24,char 类型变量为社么能存储一个中文汉字
char变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char变量中可以存储汉字。如果某个特殊的汉字没有被包含在Unicode编码字符集中,那么,这个char变量就不能存储这个特殊汉字。
unicode编码占用两个字节,所以,char类型的变量也占用两个字节
24,error 和 exception 的区别
- Error类对象由 JVM生成并抛出,大多数错误与代码编写者所执行的操作无关
- Exception又分为RunTimeException和其他Exception。