原文链接:
https://blog.csdn.net/meism5/article/details/89021536
1.JDK 和 JRE 有什么区别?
JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。
JDK:Java Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。
JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。
2.== 和 equals 的区别是什么?
== 的作用:
基本类型:比较值是否相等
引用类型:比较内存地址值是否相等
equals 的作用:
引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法。
3.基本类型的包装类对象使用 == 和 equals进行比较的结果
4.什么是装箱?什么是拆箱?装箱和拆箱的执行过程?常见问题?
装箱:基本类型转变为包装器类型的过程。通过调用包装器类的 valueOf 方法实现的;
拆箱:包装器类型转变为基本类型的过程。通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型。
如int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的intValue方法。
常见问题:
整型的包装类 valueOf 方法返回对象时,在常用的取值范围内,会返回缓存对象。
浮点型的包装类 valueOf 方法返回新的对象。
布尔型的包装类 valueOf 方法 Boolean类的静态常量 TRUE | FALSE。
5.两个对象hashCode()相同,equals() 也一定为 true吗?
首先,答案肯定是不一定。同时反过来equals为true,hashCode也不一定相同。
类的hashCode方法和equals方法都可以重写,返回的值完全在于自己定义。
hashCode()返回该对象的哈希码值;equals()返回两个对象是否相等。
关于hashCode和equal是方法是有一些 常规协定 :
1、两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。
2、两个对象用equals()比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,亿提搞哈希表性能。
3、重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。
6.final 在 java 中的作用是什么?
final 语义是不可改变的。
被 final 修饰的类,不能够被继承。
被 final 修饰的成员变量必须要初始化,赋初值后不能再重新赋值(可以调用本对象方法修改属性值)。对基本类型来说是其值不可变;对引用变量来说其引用不可变,即不能再指向其他的对象。
被 final 修饰的方法代表不能重写。
7.final finally finalize()区别
final 表示最终的、不可改变的。用于修饰类、方法和变量。
finally 异常处理的一部分,它只能用在try/catch语句中,表示希望finally语句块中的代码最后一定被执行(但是不一定会被执行)
finalize()是在java.lang.Object里定义的,Object的finalize方法什么都不做,对象被回收时finalized方法会被调用。
特殊情况下,可重写finalize方法,当对象被回收的时候释放一些资源。但注意,要调用super.finalize()。
8.finally语句块一定执行吗?
答案是不一定。
直接返回未执行到finally语句块
抛出异常未执行到finally语句块
系统退出未执行到finally语句块
9.final 与 static 的区别
都可以修饰类、方法、成员变量。
static可以修饰类的代码块,final不可以。
static不可以修饰方法内的局部变量,final可以。
static修饰表示静态或全局,被修饰的属性和方法属于类,可以用类名.静态属性 / 方法名 访问
static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,只会被执行一次
static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,只会被创建一次
static修饰的变量可以重新赋值
static方法中不能用this和super关键字
static方法必须被实现,而不能是抽象的abstract
static方法只能被static方法覆盖
final修饰表示常量、一旦创建不可改变
final标记的成员变量必须在声明的同时赋值,或在该类的构造方法中赋值,不可以重新赋值
final方法不能被子类重写
final类不能被继承,没有子类,final类中的方法默认是final的
final不能用于修饰构造方法
private类型的方法默认是final类型的
10.return 与 finally 的执行顺序对返回值的影响
对于 try 和 finally 至少一个语句块包含 return 语句的情况:
finally 语句块会执行
finally 没有 return,finally 对 return 变量的重新赋值修改无效
try 和 finally 都包含return,return 值会以 finally 语句块 return 值为准
11.String对象中的replace和replaceAll的区别?
replace方法:支持字符和字符串的替换。
replaceAll方法:基于正则表达式的字符串替换。
12.Math.round(-1.5) 等于多少
-1。
扩展JDK中的java.lang.Math类
round:返回四舍五入,负.5小数返回较大整数,如-1.5返回-1。
ceil:返回小数所在两整数间的较大值,如-1.5返回-1。
tail:返回小数所在两整数间的较小值,如-1.5返回-2。
13.String 属于基础的数据类型吗?
不属于。
Java8种基础的数据类型:byte、short、char、int、long、float、double、boolean。
14.java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。
15.如何将字符串反转?
1、使用StringBuilder的reverse方法
2、不考虑字符串中的字符是否是Unicode编码,自己实现。
16.String 类的常用方法
equals 字符串是否相同
equalsIgnoreCase 忽略大小写后字符串是否相同
compareTo 根据字符串中每个字符的Unicode编码进行比较
compareToIgnoreCase 根据字符串中每个字符的Unicode编码进行忽略大小写比较
indexOf 目标字符或字符串在源字符串中位置下标
lastIndexOf 目标字符或字符串在源字符串中最后一次出现的位置下标
valueOf 其他类型转字符串
charAt 获取指定下标位置的字符
codePointAt 指定下标的字符的Unicode编码
concat 追加字符串到当前字符串
isEmpty 字符串长度是否为0
contains 是否包含目标字符串
startsWith 是否以目标字符串开头
endsWith 是否以目标字符串结束
format 格式化字符串
getBytes 获取字符串的字节数组
getChars 获取字符串的指定长度字符数组
toCharArray 获取字符串的字符数组
join 以某字符串,连接某字符串数组
length 字符串字符数
matches 字符串是否匹配正则表达式
replace 字符串替换
replaceAll 带正则字符串替换
replaceFirst 替换第一个出现的目标字符串
split 以某正则表达式分割字符串
substring 截取字符串
toLowerCase 字符串转小写
toUpperCase 字符串转大写
trim 去字符串首尾空格
17.普通类和抽象类有哪些区别?
抽象类不能被实例化
抽象类可以有抽象方法,抽象方法只需申明,无需实现
含有抽象方法的类必须申明为抽象类
抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
抽象方法不能被声明为静态
抽象方法不能用private修饰
抽象方法不能用final修饰
18.抽象类必须要有抽象方法吗?
不一定
19.抽象类能使用 final 修饰吗?
不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。
20.接口和抽象类有什么区别?
抽象类可以有构造方法;接口中不能有构造方法。
抽象类中可以有普通成员变量;接口中没有普通成员变量。
抽象类中可以包含非抽象普通方法;接口中的所有方法必须都是抽象的。
抽象类中的抽象方法的访问权限可以是 public、protected 和 default;接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
抽象类中可以包含静态方法;JDK1.8 前接口中不能包含静态方法,JDK1.8 及以后可以包含已实现的静态方法。
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是 public static final 类型。
一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。
接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
21.Java4种访问修饰符权限的区别?
Java语言中有四种权限访问控制符,能够控制类中成员变量和方法的可见性。
public
被public修饰的成员变量和方法可以在任何类中都能被访问到。
被public修饰的类,在一个java源文件中只能有一个类被声明为public,而且一旦有一个类为public,那这个java源文件的文件名就必须要和这个被public所修饰的类的类名相同,否则编译不能通过。
protected
被protected修饰的成员会被位于同一package中的所有类访问到,也能被该类的所有子类继承下来。
friendly
默认,缺省的。在成员的前面不写访问修饰符的时候,默认就是友好的。
同一package中的所有类都能访问。
被friendly所修饰的成员只能被该类所在同一个package中的子类所继承下来。
private
私有的。只能在当前类中被访问到。
22.Java中的 << >> >>> 什么意思?
<< 表示左移,不分正负数,低位补0
>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1
>>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
<< 1 相当于乘以2
>> 1 相当于除以2
>>> 不考虑高位的正负号,正数的 >>> 等同于 >>
23.javap 指令
javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码等。
24.throw 和 throws 的区别?
throw:
表示方法内抛出某种异常对象
如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
执行到 throw 语句则后面的语句块不再执行
throws:
方法的定义上使用 throws 表示这个方法可能抛出某种异常
需要由方法的调用者进行异常处理
25.try-catch-finally 中哪个部分可以省略?
catch 和 finally 语句块可以省略其中一个。
26.常见的异常类有哪些?
异常非常多,Throwable 是异常的根类。
Throwable 包含子类 错误-Error 和 异常-Exception 。
Exception 又分为 一般异常和运行时异常 RuntimeException。
运行时异常不需要代码显式捕获处理。
下图是常见异常类及其父子关系:
Throwable
| ├ Error
| │ ├ IOError
| │ ├ LinkageError
| │ ├ ReflectionError
| │ ├ ThreadDeath
| │ └ VirtualMachineError
| │
| ├ Exception
| │ ├ CloneNotSupportedException
| │ ├ DataFormatException
| │ ├ InterruptedException
| │ ├ IOException
| │ ├ ReflectiveOperationException
| │ ├ RuntimeException
| │ ├ ArithmeticException
| │ ├ ClassCastException
| │ ├ ConcurrentModificationException
| │ ├ IllegalArgumentException
| │ ├ IndexOutOfBoundsException
| │ ├ NoSuchElementException
| │ ├ NullPointerException
| │ └ SecurityException
| │ └ SQLException
27.java 中 IO 流有哪些?
按数据流向:输入流和输出流
输入和输出都是从程序的角度来说的。输入流:数据流向程序;输出流:数据从程序流出。
按处理单位:字节流和字符流
字节流:一次读入或读出是8位二进制;字符流:一次读入或读出是16位二进制。
JDK中后缀是Stream是字节流;后缀是Reader,Writer是字符流。
按功能功能:节点流和处理流
节点流:直接与数据源相连,读入或写出;处理流:与节点流一块使用,在节点流的基础上,再套接一层。
28.Collection 和 Collections 有什么区别?
Collection是JDK中集合层次结构中的最根本的接口。定义了集合类的基本方法。
Collections是一个包装类。它包含有各种有关集合操作的静态多态方法,不能实例化,像一个Collection集合框架中的工具类。