面试题答案
一键面试资源管理方法
- 使用
try-with-resources
语句:- 在Java 7及以上版本,
try-with-resources
语句可以自动关闭实现了AutoCloseable
接口的资源。例如,在文件读取时:
CompletableFuture<Void> readFileAsync() { return CompletableFuture.runAsync(() -> { try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } }); }
- 对于数据库连接,
Connection
、Statement
等通常也实现了AutoCloseable
接口,可以类似使用:
CompletableFuture<Void> queryDatabaseAsync() { return CompletableFuture.runAsync(() -> { try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users")) { while (rs.next()) { System.out.println(rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); } }); }
- 在Java 7及以上版本,
- 显式关闭资源:
- 在Java 7之前,需要手动在
finally
块中关闭资源。例如:
BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("example.txt")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }
- 数据库连接同理:
Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password"); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM users"); while (rs.next()) { System.out.println(rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
- 在Java 7之前,需要手动在
对性能的影响
-
try - with - resources
性能影响:- 优点:代码简洁,可读性好,并且由于编译器自动生成关闭资源的代码,出错概率低。在性能上,虽然编译器会生成额外的字节码来处理资源关闭,但现代JVM的优化机制可以很好地处理这些额外开销,对于大多数应用场景,这种开销可以忽略不计。
- 缺点:对于非常频繁的资源创建和关闭操作(例如在高并发的短生命周期任务中),可能会因为频繁的对象创建和字节码执行带来一定的性能损耗,但通常这种情况比较少见,并且通过合理的资源池化技术可以缓解。
-
显式关闭资源性能影响:
- 优点:对于一些特定场景,手动关闭资源可以更精细地控制关闭时机。例如,如果希望在某些特定条件下延迟关闭资源以复用,可以在
finally
块中灵活实现。在性能敏感的应用中,通过精心优化关闭逻辑,可以避免不必要的资源关闭和重新创建开销。 - 缺点:代码冗长,容易出错,如果在
finally
块中关闭资源的逻辑有遗漏或者异常处理不当,就可能导致资源泄漏。而且手动管理资源需要更多的代码维护成本,容易在代码修改过程中引入错误。
总体而言,在大多数情况下,
try - with - resources
是一种既简单又高效的资源管理方式,只有在对资源管理有非常特殊需求的情况下,才考虑显式手动关闭资源。 - 优点:对于一些特定场景,手动关闭资源可以更精细地控制关闭时机。例如,如果希望在某些特定条件下延迟关闭资源以复用,可以在