1. JVM
、
JRE
、
JDK
的区别:
JVM:java
虚拟机,是
java
实现跨平台的最核心部分,能够运行
java
语言所开发的程序
JRE:java
运行环境,是运行
java
程序所必须的环境的集合,包括
JVM+java
系统类库
JDK:java
开发工具包,是
java
的核心,包括
JRE+
编译、运行等命令工具
2. switch
可以作用于哪些数据类型上
?
byte,short,int,char,String,
枚举,其余类型都不允许
3. java
的
8
种基本数据类型是什么
?(
简述
java
的
8
种基本数据类型
)
byte:
字节型,用于存储整数的,占用
1
个字节,范围
-128
到
127
short:
短整型,用于存储整数的,占用
2
个字节,范围
-32768
到
32767
int:
最常用的整型,用于存储整数的,占用
4
个字节,范围
-2^31
到
2^31-1
long:
长整型,用于存储较大的整数,占用
8
个字节,范围
-2^63
到
2^63-1
float:
单精度浮点数,用于存储小数的,占用
4
个字节,不能表示精确的值
double:
双精度浮点数,最常用的存储小数的类型,占用
8
个字节,不能表示精确的值
boolean:
布尔型,存储
true
或
false
,占用
1
个字节
char:
字符型,采用
Unicode
字符编码格式,存储单个字符,占用
2
个字节
4.
重写与重载的区别:
重写
:
发生在父子类中,方法名相同,参数列表相同
----
用于在子类中修改父类中的方法
重载
:
发生在同一类中,方法名相同,参数列表不同
----
方法名相同的完全不同的方法
5.
实例变量与静态变量的区别:
实例变量和静态变量都属于成员变量
实例变量
:
是属于对象的,在创建对象时存储在内存堆中,创建多少个对象,则实例变量就会
在内存堆中存在多少份,需要通过引用变量来访问
静态变量
:
是属于类的,在类被加载时存储在内存方法区中,无论创建多少个对象,静态变量
在内存中都只有一份,常常通过类名点来访问
6. java
是值传递还是引用传递
?
在
java
中,无论是基本类型还是引用类型,都是值传递
对于基本类型而言,传递的是具体的值的副本
对于引用类型而言,传递的是具体的地址的副本
7.
抽象类与接口的区别:
抽象类:
由
abstract
修饰
可以包含变量、常量、构造方法、普通方法、静态方法、抽象方法
派生类通过
extends
来继承
只能继承一个
(
体现单一继承
)
抽象类中的成员,任何访问权限都可以
(
默认为默认权限
(
同包中
))
接口:
由
interface
定义
只能包含常量和抽象方法
实现类通过
implements
来实现
可以实现多个
(
体现多实现
)
接口中的成员,访问权限只能是
public(
默认
public
权限
)
8. String s = new String("hello");
创建了几个对象
?
两个。一个是
hello
字面量对象,另一个是
new
出来的对象。
9. ==
和
equals()
的区别:
==
可以作用于基本类型,也可以作用于引用类型
若为基本类型,则是在比较值是否相等
若为引用类型,则是在比较地址值是否相等
equals()
只能作用于引用类型
Object
类的
equals()
默认比较的还是
==(
即比较地址
)
,但是没有参考意义,所以常常需要
重写
equals()
来比较对象的属性值是否相同。注意
:String
类重写了
equals()
来比较字符串
的内容是否相同
10. String
常用的方法有哪些
?
length():
获取字符串的长度
(
字符个数
)
trim():
去掉两边的空白字符
toUpperCase()/toLowerCase():
将英文部分给转换为全大写
/
全小写字母
startsWith()/endsWith():
判断是否是以
???
开始
/
结束的
charAt():
根据下标找字符
indexOf()/lastIndexOf():
查找字符串第一次出现
/
最后一次出现的下标
substring():
截取字符串
静态方法
valueOf():
将其它类型的数据转换为字符串
matches():
验证匹配
(
正则表达式
)
replaceAll():
替换
(
正则表达式
)
split():
拆分
(
正则表达式
)
11. String
、
StringBuilder
、
StringBuffer
的区别:
String:
由
final
修饰,所以不能被继承。底层封装的是
final
的字符数组,所以为不变对象。每
次修改
String
引用变量的值,都是在创建新的对象。适合查看,但不适合频繁修改在实际应用
中对于字符串大部分情况下都是在查看,
String
应用率最高。
StringBuilder:
底层封装的是字符数组,所做操作就是在该数组之上的,修改效率高。非线程
安全的,并发处理的,性能稍快
----
一般都是用
StringBuilder
StringBuffer:
底层封装的是字符数组,所做操作就是在该数组之上的,修改效率高。线程安全
的,同步处理的,性能稍慢
12. ArrayList
和
LinkedList
的区别:
ArrayList
是基于数组实现的,容量不够时采用复制方式扩容,而
LinkedList
使用链表实现
ArrayList
比
LinkedList
在随机访问的时候效率要高,因为
LinkedList
是链表结构,需要依次查
找元素,性能不高
LinkedList
首位增删具备很高的效率,而
ArrayList
的增删性能稍差
综合来说,需要频繁读取集合中的元素时,更推荐使用
ArrayList
,而在头尾增删操作较多
时,更推荐使用
LinkedList
。
ArrayList
综合性能优秀,应优选。
13. Collection
和
Collections
的区别:
Collection
是一个集合接口,是集合类的一个顶级接口,它里面定义了集合通用的方法,
List
与
Set
直接继承了
Collection
接口。
Collections
是集合的一个工具类,其中提供了一系列静态方法,用于对集合中的元素进行排
序、搜索以及线程安全等操作。
14. Map
、
List
、
Set
的区别是什么?
List
为线性表,有序可以重复的集合,元素有先后次序,可以按照位置访问元素,可以存储
null
Set
为元素不重复集合,不保证元素的先后次序,可以存储一个
null
Map
元素按照
key:value
成对存储,可以按照
key
查找
value
,查找性能好,
key
不可以重复,
可以存储一个
null key
15.
什么是节点流,什么是过滤流,并且说出常用的节点流和过滤流:
节点流:可以从或向一个特定的地方
(
节点
)
读写数据,直接跟数据源相接。常用的节点流有:
FileInputStream
、
FileOutputStream
、
ByteArrayInputStream
、
ByteArrayOutputStream
。
过滤流:是对一个已存在的流的基础之上进行功能扩展。常用的过滤流有:
BufferedInputStream
、
BufferedOutputStream
、
InputStreamReader
、
OutputStreamWriter
、
ObjectInputStream
、
ObjectOutputStream
。
16.
什么叫对象序列化?什么是反序列化?实现对象序列化需要做哪些工作?
序列化:把对象转化为可传输的字节序列的过程称为序列化
反序列化:把字节序列还原为对象的过程称为反序列化
其实序列化最终的目的是为了对象数据存储,或者进行网络传输。
Java
实现序列化很简单,只
需要被序列化对象类实现
Serializable
接口,然后使用对象流进行序列化和反序列化。可以使
用
ObjectOutputStream
进行对象序列化,使用
ObjectInputStream
进行对象反序列化。
17.
函数式接口是什么?方法引用?
所谓
"
函数式接口
"
,是指仅仅只包含一个抽象方法,但是可以有多个非抽象方法
(
默认方法
)
的
接口。
Java9
允许通过
::
关键字来传递方法或构造函数的引用。
18. Java
异常体系:
顶层是
Throwable
,然后是
Error
和
Exception
。
Error
就是虚拟机错误,比如典型的
OutOfMemoryError
、
StackOverFlowError
,出现以后系
统基本崩溃,不可恢复。
Exception
分为两部分:
RuntimeException
,也称为非检查异常,程序运行过程中才可能发生的异常,一般为代
码的逻辑错误。例如:类型转换异常,数组下标越界异常,空指针异常等等。
检查异常,为编译期间可以检查到的异常,必须是显示的进行处理
(
捕获或抛出到上一
层
)
,例如:
IOException
、
FileNotFoundException
等等。
19. final
、
finally
、
finalize
的区别:
final
:是关键字,被
final
修饰的变量初始化后不能被改变,被
final
修饰的方法不能被重写,
被
final
修饰的类不能被继承
finally
:是在异常处理时的
finally
块,不管有没有异常被抛出、捕获,
finally
块都会被执行
finalize
:是方法名,它是在
Object
类中定义的,因此所有的类都继承了它。
finalize()
方法是
在垃圾回收器删除对象之前对这个对象调用的。
20.
遍历
Hashmap
的方式:
Entry
遍历、
keySet
遍历、
foreach
遍历、
keySet foreach
遍历