9.Class <?> class1 = Myclass.class 為什么要有通配符?傳給誰用的?
首先,這里的class特指某個對象在JVM中的元數據集合。
有普通、接口、數組、基本類型、 void 類型、局部類、匿名類、枚舉、注解
1.類型安全:通配符允許你編寫更通用的代碼,同時保持類型安全。通過使用 Class<?>,你可以表示任何類型的 Class 對象,而不需要指定具體的類型。
2.靈活性:通配符使得代碼可以處理多種類型的 Class 對象,而不需要為每種類型編寫特定的代碼。
3.避免類型轉換:使用通配符可以減少不必要的類型轉換,因為你不必在代碼中指定具體的類型。
泛型給誰用的?
方法參數:當你編寫一個方法,且該方法需要接受任何類型的 Class 對象時,你可以使用 Class<?> 作為參數類型。例如:
public void printClassName(Class<?> clazz) {System.out.println(clazz.getName());
}
這個方法可以接受任何類型的 Class 對象,并打印其類名。
泛型類或方法:在泛型類或方法中,當你不需要指定具體的類型參數時,可以使用通配符。例如:
public <T> void processClass(Class<T> clazz) {// 處理邏輯
}
這個方法可以處理任何類型的 Class 對象。
集合類型:在處理泛型集合時,通配符可以幫助你編寫更通用的代碼。例如:
public void printList(List<?> list) {for (Object item : list) {System.out.println(item);}
}
這個方法可以接受任何類型的 List,并打印其中的元素。
總結:
通配符 ? 在 Class<?> 中的使用是為了提高代碼的通用性和靈活性,使得你可以編寫能夠處理多種類型的代碼,而不需要為每種類型編寫特定的邏輯。它主要用于方法參數、泛型類和方法的定義中,以及處理泛型集合時。
11.為什么要有方法引用?應用場景?
13.為什么還要學JDBC?
- 深入理解底層機制
JDBC 是Java與數據庫交互的標準API,幾乎所有Java數據庫訪問框架(包括JdbcTemplate)都是基于JDBC構建的。掌握JDBC可以幫助你更深入地理解數據庫連接、事務管理、預編譯語句、結果集處理等核心概念。
連接管理:了解如何手動打開和關閉數據庫連接。
事務控制:學習如何顯式地開始、提交和回滾事務。
異常處理:熟悉SQL異常及其處理方式。
資源管理:理解如何正確釋放數據庫資源(如Connection, Statement, ResultSet)以避免內存泄漏。
- 調試和問題排查
當你遇到復雜的問題時,直接使用JDBC可以幫助你更好地理解和定位問題。例如,某些高級的SQL查詢或性能調優可能需要對底層數據庫操作有更細致的控制。
日志記錄:通過查看原始SQL語句和參數,更容易進行調試。
性能優化:直接操作JDBC可以讓你更好地控制批量操作、結果集大小等細節,從而優化性能。
- 靈活性和定制化需求
雖然JdbcTemplate提供了很多便捷的功能,但在某些特定場景下,你可能需要更多的靈活性和定制化能力,這時直接使用JDBC會更加合適。
復雜的查詢和更新:某些復雜的SQL操作(如存儲過程、動態SQL生成)可能需要更精細的控制。
非標準功能:一些數據庫提供的擴展功能(如特定數據庫的特性或優化)可能無法通過JdbcTemplate直接支持。
- 學習曲線和遷移成本
如果你已經掌握了JDBC的基礎知識,那么學習和使用JdbcTemplate會更加容易。反之,如果你從未接觸過JDBC,直接上手JdbcTemplate可能會在某些情況下感到困惑,因為你不知道它背后的工作原理。
快速上手:如果你已經熟悉JDBC,那么學習JdbcTemplate只需要了解其簡化和封裝的部分。
平滑過渡:在某些項目中,可能需要從傳統的JDBC代碼逐步遷移到Spring框架,了解兩者之間的關系有助于順利完成過渡。
- 全面掌握技術棧
作為一個開發人員,全面掌握相關技術棧是非常重要的。了解JDBC不僅可以幫助你在不同項目中靈活切換,還可以增強你的技術儲備,提升解決問題的能力。
多語言支持:如果你未來需要在其他編程語言或環境中工作,理解數據庫連接的基本原理將非常有用。
面試準備:在許多面試中,JDBC仍然是一個常見的考察點,尤其是在涉及數據庫操作的崗位中。
示例對比
使用JDBC的傳統方式
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JdbcExample {private static final String URL = "jdbc:mysql://localhost:3306/mydb";private static final String USER = "username";private static final String PASSWORD = "password";public void queryUsers() throws SQLException {Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try {// 獲取數據庫連接conn = DriverManager.getConnection(URL, USER, PASSWORD);// 創建PreparedStatement對象String sql = "SELECT id, name FROM users WHERE age > ?";stmt = conn.prepareStatement(sql);stmt.setInt(1, 18);// 執行查詢并處理結果集rs = stmt.executeQuery();while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");System.out.println("User ID: " + id + ", Name: " + name);}} finally {// 關閉資源if (rs != null) rs.close();if (stmt != null) stmt.close();if (conn != null) conn.close();}}
}
使用Spring的JdbcTemplate
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;public class JdbcTemplateExample {public static void main(String[] args) {DataSource dataSource = getDataSource();JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);String sql = "SELECT id, name FROM users WHERE age > ?";jdbcTemplate.query(sql, new Object[]{18}, (rs, rowNum) -> {int id = rs.getInt("id");String name = rs.getString("name");System.out.println("User ID: " + id + ", Name: " + name);return null;});}private static DataSource getDataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("username");dataSource.setPassword("password");return dataSource;}
}
總結
JDBC 提供了對數據庫操作的細粒度控制,適合需要高度自定義和優化的場景。
JdbcTemplate 簡化了數據庫操作,減少了樣板代碼,提高了開發效率,適合大多數日常開發任務。
因此,建議開發者同時掌握這兩種技術:
先學JDBC,理解數據庫連接和操作的基本原理。
再學JdbcTemplate,利用其便捷性和高效性來加速開發。
14.JUC 和 JVM 適合什么時候學?需要什么基礎?
有空就學,學好408-OS