上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(十六)-CSDN博客
三十三、try里面return,finally还会执行吗?
答案是:会执行。
在Java中,无论是否发生异常,或者是否在try
或catch
块中使用了return
语句,finally
块中的代码都会执行。这是finally
块的一个特性,确保了资源的正确释放,如关闭文件流、数据库连接等。
try-catch-finally
结构
try
块:包含可能会抛出异常的代码。catch
块:用于捕获并处理try
块中抛出的异常。finally
块:无论是否发生异常,finally
块中的代码都会执行,通常用于执行清理工作。
示例代码
public class FinallyExample {
public static void main(String[] args) {
int result = trySomething(10);
System.out.println("Result is: " + result);
}
public static int trySomething(int value) {
try {
if (value < 0) {
throw new IllegalArgumentException("Value cannot be negative");
}
return value * 2; // 假设这里有一个return语句
} catch (IllegalArgumentException e) {
System.out.println("Caught an exception: " + e.getMessage());
return -1; // 异常处理后的return
} finally {
// 无论是否通过try或catch返回,finally块都会执行
System.out.println("Finally block executed");
return -99; // finally块中的return会覆盖前面的return
}
}
}
在这个示例中,trySomething
方法中的try
块包含一个return
语句,如果value
大于等于0,它将返回value * 2
。然而,即使有return
语句,finally
块仍然会执行,并且由于finally
块中也有一个return
语句,它将覆盖try
块中的返回值,最终返回-99
。
注意事项
- 如果
finally
块中包含return
语句,那么它将改变方法的返回值,即使try
或catch
块中也有return
语句。 - 如果
try
或catch
块中有return
语句,并且随后finally
块中也有return
语句,那么finally
块中的return
语句将决定方法的最终返回值。 finally
块是在退出try
或catch
块之后,实际返回到方法调用者之前执行的。
总结来说,无论try
块中是否有return
语句,finally
块中的代码都会执行,除非程序在try
或catch
块中通过System.exit()
退出了 JVM。
三十四、int和Integer有什么区别?
以下是int
和Integer
之间的主要区别:
-
类型:
int
是Java中的一个基本数据类型,它是一个32位的整数,范围从-2^31到2^31-1。Integer
是一个包装类,它封装了一个int
类型的值。Integer
类是Java提供的所有包装类之一,位于java.lang包中。
-
自动装箱与拆箱:
- Java 5引入了自动装箱和拆箱的特性。自动装箱是将基本数据类型转换为对应的包装类的过程,反之,自动拆箱是从包装类转换为基本数据类型。
Integer referenceInt = 5; // 自动装箱(基本类型int转换为Integer对象) int num = referenceInt; // 自动拆箱(Integer对象转换为基本类型int)
- Java 5引入了自动装箱和拆箱的特性。自动装箱是将基本数据类型转换为对应的包装类的过程,反之,自动拆箱是从包装类转换为基本数据类型。
-
默认值:
int
类型的变量必须初始化,因为基本数据类型不能有默认值。Integer
类型的变量可以不初始化,因为对象可以被赋予null
值。
-
性能:
- 使用
int
通常比使用Integer
更快,因为Integer
是对象,而对象的操作涉及到更多的内存管理开销。
- 使用
-
集合框架:
- 集合框架(如
ArrayList
、HashMap
等)只能接受对象作为成员,因此当需要在集合中存储整数值时,必须使用Integer
。
- 集合框架(如
-
缓存:
Integer
类有一个缓存机制,它缓存了从-128到127的整数值对应的Integer
对象实例。当创建这个范围内的Integer
对象时,实际上是从缓存中获取的,而不是每次创建新对象。
-
比较:
- 当比较两个
int
类型的值时,使用的是==
操作符,它比较的是它们的值。 - 当比较两个
Integer
对象时,如果没有重写equals()
方法,比较的是对象的内存地址。为了比较两个Integer
对象的值,应使用equals()
方法或构造函数Integer(int i)
创建对象。
- 当比较两个
-
数学运算:
int
类型的变量可以直接进行数学运算。Integer
对象需要调用相应的方法来进行数学运算,如intValue()
、doubleValue()
等。
示例代码
public class IntAndIntegerExample {
public static void main(String[] args) {
int primitiveInt = 10;
Integer wrapperInt = new Integer(10);
// 自动装箱
Integer autoboxedInt = 20;
// 自动拆箱
int autounboxedInt = wrapperInt;
// 比较int和Integer
if (primitiveInt == wrapperInt) {
System.out.println("int and Integer are equal in value");
}
// 使用equals()比较两个Integer对象
if (wrapperInt.equals(autoboxedInt)) {
System.out.println("Integer objects are equal in value");
}
}
}
在示例中,primitiveInt
是一个int
类型的变量,而wrapperInt
是一个Integer
对象。autoboxedInt
演示了自动装箱的过程,而autounboxedInt
演示了自动拆箱的过程。比较int
和Integer
时,需要使用不同的方法,因为它们的比较机制不同。
总结来说,int
和Integer
在Java中有根本的不同:一个是基本数据类型,另一个是封装类。选择使用哪一个取决于具体的应用场景和性能要求。