1: JDK、JRE、JVM三者的关系:
JVM是Java虚拟机,是虚拟出来的一个系统;JRE是Java的最小运行环境,它包含JVM和系统类库;JDK是Java的最小开发环境,它包含JRE+编译运行工具。
2:Java的基本数据类型:
byte(1个字节)
short(2个字节)
char(2个字节)
int(4个字节)
long(8个字节)
double(8个字节)
float(4个字节)
boolean(1个字节)
3:在进行小数计算的时候,可以使用double吗?
对精确度要求不高的时候可以使用double;
对精度要求高的时候则不能使用;
如果使用double可能会丢失精度,导致结果不正确。(我们可以使用JDK提供的BigDecimal进行计算)
4:什么是逻辑与和短路与(&和&&)
逻辑与和短路与都是需要整个判断都为true的时候表达式才为true;
当某一个判断为false时逻辑与会继续执行后续判断,短路与则不会再继续执行了。(逻辑或和短路或也是如此)
5:switch…case判断条件可以使用字符串类型吗?
在jdk1.7之前只能使用整形,在jdk1.7开始可以使用字符串类型。
6:如何定义一个方法?
修饰词,返回值类型,方法名,参数列表,方法体
7:return的用法
无返回值方法时,return用于结束方法;有返回值方法时,return用于结束方法并返回值给调用方。
8:面向对象的特征是什么;封装,继承,多态分别是什么?
封装,继承,多态。
封装:把一些具有相同属性或行为的类抽取出来
继承:目的是代码的重用,在java中是单继承的,继承后,子类就具有(父类+子类)的属性和行为。
多态:父类型的引用指向子类型的引用。主要的表现形式重写和重载。
9:重写和重载有什么区别
重写:发生在父子类中,方法名称相同,参数列表相同。
重载:发生在同一类中,方法名称相同,参数列表不同。
10:抽象类和接口有什么区别
接口只能包含常量和抽象方法
接口之间可以继承,接口可以被多实现
抽象类可以包含抽象方法,也可以包含非抽象方法,必须被继承,因为java是单继承的,
11:Java中常用的循环方式有哪些
do…while:至少会执行一次
while:可能一次都不执行
for:可能一次都不执行
12:break和continue有什么区别
break:用于结束循环。
continue:用于跳过本次循环
13:什么是嵌套循环,如何跳出嵌套循环,如果嵌套循多了有什么样的问题?
嵌套循环:循环中套循环,外层控制行,内层控制列。 运行规则是:外层走一次,内层走所有。
可以使用break outer来跳出循环, 层数一般控制在3层以内,太多可读性不好,还会有设计问题。
14:不写类的构造方法可以吗?如果写了类的有参构造方法,还会有无参构造方法吗?
可以,java编译器默认会生成无参构造方法,
不会。
15:类的构造器可以被重写吗?可以被重载吗?
构造器不可以被重写,但可以重载。
16:基本类型和引用类型的"=="号又什么区别?引用类型要判断内容是否相等应该怎么办?
基本类型: 是判断两个值是否相等;
引用类型: 是判断两个对象在堆的内存地址是否相同;
应该使用equals方法;
17:java中的this和super关键字
this: 指向对象本身的一个指针。
this.成员变量:表示访问本类的成员变量。
this.方法名:是访问本类的方法,调用方法时,可以省略不写this ,编译器会自动生成一个隐式的this
this(): 访问的是本类的构造方法
super: 发生在继承关系中的;指向父类对象的指针。
super.成员变量: 访问的是父类的成员变量。
super.方法名: 访问父类的方法。
super(): 访问的是父类的构造方法
在初始化子类时,一定会先初始化父类。默认子类中的构造器会隐式的调用super()方法。
18:java中的final, static关键字
final: 修饰 变量(不可以被重新赋值),方法(不能被重写),类(不能被继承)
static: 修饰的变量(静态变量),存在于方法区(元空间)中;通过类名.变量来访问,
修饰的方法(静态方法);存在于方法区(元空间)中;通过类名.方法名来访问,当方法的操作仅与参数有关而与对象无关时使用
static静态块: 在被类加载时自动执行,存在于方法区(元空间)中,常常用于加载静态资源。
19:什么是内部类?内部类分类有哪些?
内部类: 可以将一个类的定义放在另外一个类的定义内部。
分类4种: 成员内部类、局部内部类、匿名内部类和静态内部类。
20:通过字面量创建字符串和new一个字符串对象有什么区别?那什么是常量池呢?
内存的分配方式不一样
字面量创建: 字符串对象会分配到常量池中。(再次使用该字面量创建新字符串时,不再创建新对象,而是从常量池中获取。)
new创建: 字符串对象会分配到堆中。
常量池: 存在方法区(元空间中)
21:做字符串拼接的时候可以用String吗?StringBuilder和StringBuffer有什么区别呢?
不建议直接使用spring,最好用StringBuilder或者StringBuffer来做拼接。
StringBuilder: 非线程安全的,效率更高
StringBuffer: 线程安全的,效率低一些
22: 子类重写父类含有抛出异常的方法时,有哪些要求?
1:不再抛出任何异常;
2:仅抛出部分异常;
3:抛出子类异常;
4:不可以抛出额外异常;
5:不可以抛出父类异常;
23:final、finally、finalize有什么区别?
final: 修饰类(该类不可被继承)、变量(变量不可被重新赋值。)、方法(该方法不可被重写)
finally: 一般作用在try-catch捕获异常代码块中,不论代码是否发生异常,finally中的代码一定会被执行,通常用来关闭一些资源时使用。
finalize: 属于Object类中的一个方法, 当对象被回收的时候,会调用此方法。
24: List集合和Set集合有什么区别?
List: 是可重复,有序
Set: 不可重复,无序。
25:集合中的泛型有什么用?
用来约束元素的类型的
26:常用的List集合有哪些呢?有什么区别?
有:ArrayList(底层是数组,查询快,增删慢)、LinkedList(底层是链表,查询慢,增删快)、Vector(数组)。
ArrayList和LinkedList都是非线程安全的
Vector,是线程安全的。
27:什么是队列?什么是栈?它们遵循什么原则?
队列:存储一组元素的数据结构(先进先出)。
栈: 存储一组元素,(先进后出)
28:HashMap的底层数据结构是什么?那什么时候变为红黑树呢
在JDK1.7的时候是数组+链表;
在JDK1.8的时候是数组+链表+红黑树
当链表的长度大于8的时候,就会变为红黑树。
29:HashMap、HashTable、ConcurrentHashMap有什么区别
HashMap是线程不安全的;
HashTable是线程安全的,
其内部使用synchronized关键字进行加锁;ConcurrentHashMap结合了HashMap和HashTable,是线程安全的。
在JDK1.7其内部使用了分段锁的思想来进行加锁,每一把锁只锁容器中的一部分数据,降低了锁的力度,提高了效率。在JDK1.8的时候使用了CAS+synchronized来保证并发安全
30:什么是CAS算法?
CAS算法的全称是:compareAndSwap的意思,是能保证当操作的线程安全和原子性的算法。
CAS算法将预期值和更新值传入方法中进行比较,如果内存值和预期值不同,那么此次操作失败,继续循环获取新的内存值,预期值,更新值,直到这次操作成功,我们称这种操作为线程的自旋,其中的算法我们称为CAS算法。
31: HashMap的初始长度是多少?在什么时候进行扩容?
HashMap的初始长度是16。
当容量达到加载因子0.75的时候进行扩容。
扩容后的大小一定是2的N次方。
32:能否使用任何类作为HashMap的key?
可以,但需要注意的是,如果类重写了equals方法,我们就应当连同重写hashcode方法;因为hashcode的值应当与equals的结果相对应,两个对象若equals比较为true,hashcode值应当相同。两个对象equals比较结果为false,hashcode值最好不同。若依然相同,那么作为key存入HashMap中时会产生链表情况,影响HashMap查询性能。
33:sleep、wait、notify的作用
sleep用于线程的休眠,可以指定休眠的时长,如果在一个同步块中,sleep不会释放锁。
wait是Object提供的一个方法,可以对象来进行线程的休眠,如果在一个同步块中,wait会释放锁。
notify也是Object提供的一个方法,可以唤醒处于wait状态的线程,如果在一个同步块中,wait不会释放锁。
34: Java中的线程池有哪些?最常用的线程池是哪种?
有4种:
动态:newCachedThreadPool
固定线程数:newFixedThreadPool
固定只有一条线程:newSingleThreadExecutorPool
以固定频率执行:newScheduledThreadPool
一般来说,这4种线程池都不使用,一般使用ThreadPoolExecutor来自定义线程池。
35:ThreadPoolExcutor各参数的含义,核心线程数设置多大比较合理?
corePoolSize:核心线程数,指线程池不关闭就一直存活的线程数。maximumPoolSize:最大线程数,指线程池能同时存活的最大线程数。
keepAliveTime:空闲的线程保留的时间,指非核心线程空闲的最大时间,超过这个时间就会将这些空闲的非核心线程销毁掉。
unit:空闲线程的保留时间单位。
workQueue:工作的阻塞队列,存储等待执行的任务。
threadFactory:线程工厂,指定了线程池中的线程的创建方式和销毁方式。
handler:拒绝策略,指线程池在达到上限(达到最大线程数且任务队列也满了)的情况下的执行逻辑。
最大核心线程数设置为: CPU的核心数 * 2 +1 。
扩充知识树:
1:二叉搜索树
特点:左子树的键值小于根的键值,右子树的键值大于根的键值;此查找时间复杂度依赖于节点深度,如果节点很深,则查找效率降低;
2:平衡二叉查找树(AVL树)
特点:在满足二叉查找树的条件下,还需满足任何节点的两个子树的高度最大差为1,所以它呈现出是一种左右平衡的状态;
如图所示:
3:红黑树:
红黑树的性质:
1.每个节点不是红色就是黑色
2.不可能有连在一起的红色节点
3.根节点都是黑色
4.每个红色节点的两个子节点都是黑色