Java面试基础笔记1

2019年11月28日,为了系统的复习java核心技术和准备20年春招,创建了CSDN账户,将自己系统复习阶段的一些笔记整理到博客,希望整理的过程中能起到复习的作用,也希望能帮到正在准备面试的同学。

1.JDK与JRE的区别是什么?

Java运行时环境(JRE),包括
1.虚拟机jvm
2.java核心类库

Java开发工具包(JDK)是完整的Java软件开发包,包含了
1.运行时环境JRE
2.编辑器javac,
3.调试工具和分析工具jconsole,jvisualbm等,
4.Java文档生成工具javadoc

2.什么是Java虚拟机?为什么Java被称为“平台无关的编程语言”?

Java虚拟机(JVM)是可以执行Java字节码的虚拟进程

1.Java的跨平台是指Java源文件经过javac编译后生成的二进制.class文件具有跨平台性。
2.各个平台装有对应平台的jvm,而jvm能将相同的字节码翻译成对应平台相关的机器码进行执行。

3.Java支持的数据类型有哪些?

Java语言支持8种基本数据类型

分别是:
byte,short,int,long,float,double,boolean,char

基本数据类型的自动转换顺序:

byte(1)-》char(2)-》short(2)-》int(4)-》long(8)-》float(4)-》doube(8)

各个基本类型对应的包装类:

基本类型  包装器类型
boolean Boolean
char Character
int Integer
byte Byte
short Short
long Long
float Float
double Double

包装类的作用:

提供:字符串、基本数据类型、对象之间互相转化的方式
包含每种基本数据类型的相关属性,如:最大值、最小值等

4.什么是自动拆装箱?

自动装箱:

数值赋给包装类对象时自动实现:
如:
Integer i = 10;
自动实现:
Integer i = Integer.valueOf(10);

自动拆箱:

包装类对象赋值给基本数据类型时自动实现:
如:
int b = i;
自动实现:
int b = i.intValue();

5.String,StringBuffer,StringBuilder有什么区别?

1.String创建机理:

1)创建一个字符串时,先检查字符串常量池中是否有相同值的字符串对象
如果有则直接使用字符串常量池中对象的引用
如果没有则创建新的字符串对象,返回对象的引用,将对象放入字符串常量池
2)通过new方法创建的String对象是不检查常量池的,而是直接在堆区或栈区创建一个新的对象

2.String的特性:

1)不可变性,String对象一旦生成就不能再对他进行改变,不可变使得对象被多线程频繁访问时大大提高系统性能。
2)针对常量池的优化,多个String对象拥有同样的值时,只引用常量池中的同一个拷贝,大大节省了内存空间

3. StringBuffer/StringBuilder

1).StringBuffer和StringBuilder都实现了abstractStringBuilder抽象类,
拥有几乎一致对外提供的调用接口;其底层在内存中的存储方式与String相同,都是以一个有序的字符序列(char类型的数组)进行存储

2).StringBuffer/StringBuilder对象的值是可以改变的,并且值改变以后,对象引用不会发生改变
两者对象在构造过程中,首先按照默认大小申请一个字符数组,由于会不断加入新数据,当超过默认大小后,
会创建一个更大的数组,并将原先的数组内容复制过来,再丢弃旧的数组。因此,对于较大对象的扩容会涉及
大量的内存复制操作,如果能够预先评估大小,可提升性能

3)StringBuffer是线程安全的,但是StringBuilder是线程不安全的

总结

(1)String是不可变的对象
	StringBuffer和StringBuilder是可变的对象
(2)StringBuffer是线程安全的,StringBuilder是线程不安全的
(3)三者的底层存储方式一致

6.final、finally、 finalize有什么不同?

final:

final 可以用来修饰类、方法、变量,分别有不同的意义
(1)final 修饰的 class 代表不可以继承扩展
(2)final 的变量是不可以修改的
(3)final 的方法也是不可以重写的(override)

final不等于immutable

final List<String> strList = new ArrayList<>();
strList.add("Hello");
strList.add("world");
List<String> unmodifiableStrList = List.of("hello", "world");
unmodifiableStrList.add("again");

(1)final只能约束strList这个引用不可以被赋值,但是这个对象的具体行为不受final影响,添加元素等操作时正常的。
(2)需要产生不可变对象需要对应的类支持的不可变行为,如List.of方法创建的就是不可变的list,添加操作就会抛出异常

实现immutable类的方式

(1)将class自身定义为final,避免通过扩展绕过限制
(2)将所有成员变量定义为final private,且不要实现setter方法
(3)构建对象时,成员变量采用深拷贝初始化
(4)若需要实现getter方法,或其他需要返回内部状态的方法,采用copy-on-write原则,在副本上进行操作

finally

finally 是 Java 保证重点代码一定要被执行的一种机制
我们可以使用 try-finally 或者 trycatch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作

finally不会执行的情况:

1. try-cach 异常退出。
try{
	system.exit(1)
}finally{
	print(abc)
}
2. 无限循环
try{
	while(ture){
		print(abc)
	}
}finally{
	print(abc)
}

finally执行时刻

若try or catch中和finally中都有return时,finally中的return会覆盖前面的return

若try or catch 中的return执行时,会把return后的值进行暂存,并在执行完finally之后再进行返回

finalize

finalize 是基础类 java.lang.Object 的一个方法
它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 开始被标记为deprecated

发布了15 篇原创文章 · 获赞 4 · 访问量 2218

猜你喜欢

转载自blog.csdn.net/qq_41170102/article/details/103301455