java每日精進 5.15【分頁實現】

1. 什么是對象轉換和數據翻譯?

對象轉換

對象轉換是指將一種類型的對象(如數據庫實體 UserDO)轉換為另一種類型的對象(如前端響應對象 UserVO 或服務層 DTO)。例如,一個 UserDO 包含用戶 ID、姓名和部門 ID,我們需要將其轉換為 UserVO,包含 ID、姓名和部門名稱。這種轉換在分層架構(如 Controller、Service、DAO)中非常常見。

數據翻譯

數據翻譯是指將某個字段的值“翻譯”為另一個值。例如,UserVO 的 deptId 字段需要讀取數據庫中 DeptDO 的 name 字段,設置為 UserVO 的 deptName 字段。這種操作通常涉及關聯查詢或手動拼接。

為什么需要這些操作?

  • 分層隔離:DO(Data Object)用于數據庫操作,VO(Value Object)用于前端響應,DTO(Data Transfer Object)用于服務層傳遞,各自職責不同。
  • 數據格式化:前端需要友好的數據格式(如部門名稱而非 ID)。
  • 性能優化:通過翻譯減少復雜 SQL 聯表查詢。

2. 對象轉換:MapStruct vs BeanUtils

項目中提供了兩種對象轉換工具:MapStructBeanUtils。我們先來對比它們的優缺點,然后分別展示使用方法。

2.1 MapStruct

MapStruct 是一個編譯時生成映射代碼的框架,通過注解(如 @Mapper 和 @Mapping)定義映射規則,生成高效的 getter/setter 調用代碼。

  • 優點
    • 高性能:生成純 Java 代碼,避免反射開銷。
    • 類型安全:編譯時檢查映射規則,減少運行時錯誤。
    • 靈活性:支持復雜映射、自定義邏輯。
  • 缺點
    • 需要編寫注解,配置稍復雜。
    • 學習成本稍高,需了解 MapStruct 語法。
  • 適用場景:高性能要求、復雜映射場景。

引入依賴

<dependencies><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${mapstruct.version}</version></dependency></dependencies>
public class UserDO {private Long id;private String name;private Long deptId;public UserDO() {}public UserDO(Long id, String name, Long deptId) {this.id = id;this.name = name;this.deptId = deptId;}public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public Long getDeptId() { return deptId; }public void setDeptId(Long deptId) { this.deptId = deptId; }
}public class DeptDO {private Long id;private String name;public DeptDO() {}public DeptDO(Long id, String name) {this.id = id;this.name = name;}public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }
}public class UserVO {private Long id;private String name;private String deptName;public UserVO() {}public UserVO(Long id, String name, String deptName) {this.id = id;this.name = name;this.deptName = deptName;}public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public String getDeptName() { return deptName; }public void setDeptName(String deptName) { this.deptName = deptName; }
}@Mapper
public interface UserConvert {UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);@Mapping(source = "user.id", target = "id")@Mapping(source = "user.name", target = "name")@Mapping(source = "dept.name", target = "deptName")UserVO convert(UserDO user, DeptDO dept);default List<UserVO> convertList(List<UserDO> users, Map<Long, DeptDO> deptMap) {return users.stream().map(user -> convert(user, deptMap.get(user.getDeptId()))).toList();}
}
  • UserDO:數據訪問層的用戶對象,包含用戶 ID、姓名和部門 ID
  • DeptDO:數據訪問層的部門對象,包含部門 ID 和部門名稱
  • UserVO:視圖層的用戶對象,包含用戶 ID、姓名和部門名稱(直接包含部門名稱而非部門 ID)
單個對象轉換(convert 方法)
  • @Mapper 注解:告訴 MapStruct 這是一個轉換器接口,會自動生成實現類
  • INSTANCE 常量:獲取 MapStruct 生成的實現類實例
  • @Mapping 注解:定義字段映射規則
    • source = "user.id", target = "id":將 user 對象的 id 字段映射到 VO 的 id 字段
    • source = "user.name", target = "name":將 user 對象的 name 字段映射到 VO 的 name 字段
    • source = "dept.name", target = "deptName":將 dept 對象的 name 字段映射到 VO 的 deptName 字段
列表轉換(convertList 方法)
  • 這是一個默認方法(Java 8 特性),提供了批量轉換的實現
  • 使用 Java Stream API 遍歷 UserDO 列表
  • 對于每個 UserDO,通過 deptId 從部門映射表中獲取對應的 DeptDO
  • 調用單對象轉換方法 convert () 完成轉換
  • 將轉換后的 UserVO 收集到新列表中返回

2.2 BeanUtils

BeanUtils(項目基于 Hutool 的 BeanUtil 封裝)通過反射復制字段,適合簡單場景。

  • 優點
    • 簡單易用:字段名一致時無需額外配置。
    • 封裝增強:支持 List、Page 轉換,允許 Consumer 自定義邏輯。
    • 易替換:封裝一層便于切換實現(如換成 Spring 的 BeanUtils)。
  • 缺點
    • 反射導致性能略低于 MapStruct。
    • 不適合復雜字段映射。
  • 適用場景:簡單映射、快速開發。
public class UserConvertBeanUtils {/*** 將用戶數據對象(UserDO)和部門數據對象(DeptDO)轉換為用戶視圖對象(UserVO)* <p>* 轉換邏輯:* 1. 先通過 BeanUtil 將 UserDO 自動轉換為 UserVO(自動映射 id、name 字段)* 2. 手動將 DeptDO 的 name 字段賦值給 UserVO 的 deptName 字段** @param user  用戶數據對象(包含 id、name、deptId)* @param dept  部門數據對象(包含 id、name,可為 null)* @return 轉換后的用戶視圖對象(UserVO),若 dept 為 null 則 deptName 為 null*/public static UserVO convert(UserDO user, DeptDO dept) {// 1. 自動轉換 UserDO -> UserVO(映射 id、name 字段)UserVO userVO = BeanUtil.toBean(user, UserVO.class);// 2. 手動填充部門名稱(若部門對象不為 null)if (dept != null) {userVO.setDeptName(dept.getName()); // 將 DeptDO 的 name 賦值給 UserVO 的 deptName}return userVO;}/*** 擴展轉換方法:支持在轉換后對 UserVO 進行自定義處理* <p>* 轉換邏輯:* 1. 繼承 convert() 方法的邏輯(自動映射 + 手動填充部門名稱)* 2. 通過 Consumer 對轉換后的 UserVO 進行額外處理(如屬性校驗、補充數據等)** @param user     用戶數據對象* @param dept     部門數據對象(可為 null)* @param consumer 自定義處理器,用于對 UserVO 進行后處理(如 set 其他屬性)* @return 處理后的用戶視圖對象*/public static UserVO convertWithConsumer(UserDO user, DeptDO dept, Consumer<UserVO> consumer) {// 先執行基礎轉換(自動映射 + 部門名稱填充)UserVO userVO = convert(user, dept);// 調用自定義處理器(若 consumer 不為 null)if (consumer != null) {consumer.accept(userVO); // 將 UserVO 傳入處理器進行額外處理}return userVO;}/*** 將用戶數據對象列表轉換為用戶視圖對象列表* <p>* 轉換邏輯:* 1. 遍歷用戶列表,逐個調用 convert() 方法進行轉換* 2. 通過部門 ID(deptId)從部門映射表(deptMap)中獲取對應的 DeptDO 對象** @param users    用戶數據對象列表(不可為 null)* @param deptMap  部門映射表(key=部門 ID,value=DeptDO 對象)* @return 轉換后的用戶視圖對象列表*/public static List<UserVO> convertList(List<UserDO> users, Map<Long, DeptDO> deptMap) {return users.stream() // 將列表轉換為流.map(user -> // 對每個用戶對象,根據 deptId 從 deptMap 中獲取部門對象,再調用 convert() 轉換convert(user, deptMap.get(user.getDeptId())) ).collect(Collectors.toList()); // 收集結果為列表}
}
輸入:
UserDO user = new UserDO(1L, "Alice", 10L);
DeptDO dept = new DeptDO(10L, "工程部");
Map<Long, DeptDO> deptMap = new HashMap<>();
deptMap.put(10L, new DeptDO(10L, "工程部"));
List<UserDO> users = Arrays.asList(user);
代碼:
// 簡單場景
UserVO userVO = UserConvertBeanUtils.convert(user, dept);
// 復雜場景(添加額外字段)
UserVO userVOWithConsumer = UserConvertBeanUtils.convertWithConsumer(user, dept, vo -> vo.setDeptName("自定義-" + vo.getDeptName()));
// 列表轉換
List<UserVO> userVOs = UserConvertBeanUtils.convertList(users, deptMap);
輸出:
// userVO: {id=1, name="Alice", deptName="工程部"}
// userVOWithConsumer: {id=1, name="Alice", deptName="自定義-工程部"}
// userVOs: [{id=1, name="Alice", deptName="工程部"}]
  • BeanUtil.toBean 使用反射復制字段,適合字段名一致的場景。
  • Consumer 提供靈活性,允許自定義字段處理。
  • convertList 通過 Stream API 實現列表轉換。

性能對比:MapStruct 性能優于 BeanUtils,但相比數據庫操作的耗時,差距可忽略。因此,簡單場景推薦 BeanUtils,復雜場景推薦 MapStruct。

3. 數據翻譯:SQL 聯表 vs Java 拼接 vs easy-trans

數據翻譯是將一個字段(如 deptId)轉換為另一個字段(如 deptName)。項目提供三種方案:

  1. SQL 聯表查詢:通過 MyBatis 的關聯查詢直接獲取目標字段(如 DeptDO.name)。
  2. Java 拼接:多次單表查詢(如先查 UserDO,再查 DeptDO),在 Java 代碼中拼接。
  3. easy-trans 框架:通過注解(如 @Trans)自動翻譯字段。

推薦:優先使用 Java 拼接(方案二)或 easy-trans(方案三),因為:

  • 減少數據庫壓力:避免復雜的 SQL 聯表查詢。
  • 易維護:Java 代碼邏輯清晰,SQL 改動成本高。
  • 靈活性:easy-trans 提供注解式翻譯,簡化開發。

3.1easy-trans

public class OperateLogRespVO implements VO {private Long id; // 操作日志IDprivate Long userId; // 用戶ID,關聯AdminUserDO的id字段// @Trans注解:聲明該字段需要從其他對象轉換而來@Trans(type = "SIMPLE", target = AdminUserDO.class, fields = "nickname", ref = "userNickname")private String userNickname; // 存儲從AdminUserDO映射過來的nickname字段// getter和setter方法public Long getId() { return id; }public void setId(Long id) { this.id = id; }public Long getUserId() { return userId; }public void setUserId(Long userId) { this.userId = userId; }public String getUserNickname() { return userNickname; }public void setUserNickname(String userNickname) { this.userNickname = userNickname; }
}public class AdminUserDO {private Long id; // 用戶IDprivate String nickname; // 用戶昵稱// 無參構造函數public AdminUserDO() {}// 全參構造函數public AdminUserDO(Long id, String nickname) {this.id = id;this.nickname = nickname;}// getter和setter方法public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getNickname() { return nickname; }public void setNickname(String nickname) { this.nickname = nickname; }
}
輸入:
OperateLogRespVO logVO = new OperateLogRespVO();
logVO.setId(1L);
logVO.setUserId(1L);
// 假設數據庫中 AdminUserDO(1L, "Alice") 存在
代碼:
// Spring MVC 自動翻譯(easy-trans 全局配置)
return logVO;
輸出:
// logVO: {id=1, userId=1, userNickname="Alice"}

實現原理

  • OperateLogRespVO 實現 VO 接口,啟用 easy-trans 翻譯。
  • @Trans(type = "SIMPLE", target = AdminUserDO.class, fields = "nickname", ref = "userNickname"):
    • type = "SIMPLE":使用 MyBatis Plus 查詢 AdminUserDO。
    • target:指定目標實體類。
    • fields:讀取 nickname 字段。
    • ref:設置到 userNickname 字段。
  • easy-trans 自動根據 userId 查詢 AdminUserDO,填充 userNickname。

3.2 場景二:跨模塊翻譯(easy-trans)

場景:在 yudao-module-crm 模塊的 CrmProductRespVO 中,將 ownerUserId 翻譯為 AdminUserDO 的 nickname。

/*** CRM產品響應視圖對象* 用于封裝產品信息并返回給前端,包含產品基本信息和關聯的所有者用戶昵稱*/
public class CrmProductRespVO implements VO {private Long id; // 產品ID,唯一標識一個產品private Long ownerUserId; // 產品所有者的用戶ID,關聯到AdminUserDO的id字段/*** 產品所有者的昵稱,通過@Trans注解自動映射* 映射規則:* - type="SIMPLE":簡單類型映射* - targetClassName:指定目標數據對象類的全限定名* - fields="nickname":從AdminUserDO中獲取nickname字段的值* - ref="ownerNickname":將獲取的值映射到當前類的ownerNickname字段*/@Trans(type = "SIMPLE", targetClassName = "com.example.model.AdminUserDO", fields = "nickname", ref = "ownerNickname")private String ownerNickname; // 存儲從AdminUserDO映射過來的nickname字段值// 以下是各字段的Getter和Setter方法public Long getId() { return id; }public void setId(Long id) { this.id = id; }public Long getOwnerUserId() { return ownerUserId; }public void setOwnerUserId(Long ownerUserId) { this.ownerUserId = ownerUserId; }public String getOwnerNickname() { return ownerNickname; }public void setOwnerNickname(String ownerNickname) { this.ownerNickname = ownerNickname; }
}
輸入:
OperateLogRespVO logVO = new OperateLogRespVO();
logVO.setId(1L);
logVO.setUserId(1L);
// 假設數據庫中 AdminUserDO(1L, "Alice") 存在
代碼:
// Spring MVC 自動翻譯(easy-trans 全局配置)
return logVO;
輸出:
// logVO: {id=1, userId=1, userNickname="Alice"}

3.3 場景三:Excel 導出翻譯(easy-trans)

場景:導出 UserVO 列表到 Excel,翻譯 deptId 為 deptName。

/*** 用戶數據導出工具類* 負責生成用戶數據并進行數據轉換,用于Excel導出*/
public class UserExcelExport {/*** 導出用戶列表數據* * 1. 創建用戶數據* 2. 調用TranslateUtils進行數據轉換(將部門ID轉換為部門名稱)* 3. 返回轉換后的用戶列表,用于Excel導出* * @return 轉換后的用戶視圖對象列表*/public List<UserVO> exportUsers() {// 創建單個用戶數據(實際場景可能從數據庫查詢)UserVO user = new UserVO();user.setId(1L);         // 設置用戶IDuser.setName("Alice");  // 設置用戶名user.setDeptId(10L);    // 設置部門ID(關聯DeptDO的ID)// 構建用戶列表List<UserVO> users = Arrays.asList(user);// 調用工具類進行數據轉換// 此方法會根據@Trans注解,將deptId轉換為對應的部門名稱deptNameTranslateUtils.translate(users);// 返回轉換后的用戶列表,此時列表中的deptName已被填充return users;}
}
/####################################################################//*** 用戶視圖對象* 用于前端展示或數據導出,包含部門名稱(通過@Trans注解自動映射)*/
public class UserVO implements VO {private Long id;         // 用戶IDprivate String name;     // 用戶名稱private Long deptId;     // 部門ID(關聯DeptDO的ID)/*** 部門名稱(通過@Trans注解自動映射)* * type="SIMPLE": 簡單類型轉換* target=DeptDO.class: 目標數據對象類* fields="name": 從DeptDO中獲取name字段* ref="deptName": 將值映射到當前類的deptName字段* * TranslateUtils會根據此注解,* 通過deptId查找對應的DeptDO對象,* 并將其name字段值賦給當前對象的deptName字段*/@Trans(type = "SIMPLE", target = DeptDO.class, fields = "name", ref = "deptName")private String deptName; // 部門名稱(通過@Trans自動映射)// 以下是各字段的Getter和Setter方法public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public Long getDeptId() { return deptId; }public void setDeptId(Long deptId) { this.deptId = deptId; }public String getDeptName() { return deptName; }public void setDeptName(String deptName) { this.deptName = deptName; }
}
/*** VO 數據翻譯 Utils*/
public class TranslateUtils {private static TransService transService;public static void init(TransService transService) {TranslateUtils.transService = transService;}/*** 數據翻譯** 使用場景:無法使用 @TransMethodResult 注解的場景,只能通過手動觸發翻譯** @param data 數據* @return 翻譯結果*/public static <T extends VO> List<T> translate(List<T> data) {if (CollUtil.isNotEmpty((data))) {transService.transBatch(data);}return data;}}

4. 擴展:實用技巧與注意事項

4.1 優化性能

  • MapStruct:優先用于高并發場景,生成代碼無反射開銷。
  • BeanUtils:適合快速開發,但避免在高頻接口中使用。
  • easy-trans:全局翻譯(easy-trans.is-enable-global=true)方便但可能影響性能,建議在數據量大或樹形結構時使用 @IgnoreTrans 注解:
    @IgnoreTrans
    public List<UserVO> getLargeData() {// 手動翻譯或避免翻譯return users;
    }

4.2 復雜邏輯處理

  • MapStruct 自定義邏輯:使用 @AfterMapping 或 default 方法處理復雜映射:
    @Mapper
    public interface UserConvert {@Mapping(target = "deptName", ignore = true)UserVO convert(UserDO user, DeptDO dept);@AfterMappingdefault void afterConvert(@MappingTarget UserVO userVO, DeptDO dept) {if (dept != null) {userVO.setDeptName("自定義-" + dept.getName());}}
    }

  • BeanUtils Consumer:通過 Consumer 添加動態邏輯:

  • UserVO userVO = UserConvertBeanUtils.convertWithConsumer(user, dept, vo -> {vo.setDeptName(vo.getDeptName() + "-增強");
    });

5.3 跨模塊翻譯優化

  • 緩存:跨模塊查詢(如 AdminUserDO)可能涉及多次數據庫訪問,建議緩存 DeptDO 或 AdminUserDO:
    Map<Long, DeptDO> deptMap = deptService.getDeptMap();
    List<UserVO> userVOs = users.stream().map(user -> UserConvertBeanUtils.convert(user, deptMap.get(user.getDeptId()))).collect(Collectors.toList());

5.4 Excel 導出優化

  • 批量翻譯:TranslateUtils.translate 支持批量處理,但大數據量時建議分批:
    List<List<UserVO>> batches = ListUtils.partition(users, 1000);
    batches.forEach(TranslateUtils::translate);

5. 總結

  • 對象轉換
    • MapStruct:高性能,適合復雜映射,需配置 @Mapping。
    • BeanUtils:簡單易用,適合字段名一致的場景,支持 Consumer 擴展。
  • 數據翻譯
    • SQL 聯表:適合簡單場景,但可能增加數據庫壓力。
    • Java 拼接:靈活,推薦多次單表查詢后拼接。
    • easy-trans:注解式翻譯,模塊內用 target,跨模塊用 targetClassName,Excel 導出用 TranslateUtils。
  • 注意事項
    • 性能敏感場景用 MapStruct 或禁用全局翻譯。
    • 復雜邏輯通過 default 方法或 Consumer 處理。
    • 跨模塊翻譯和 Excel 導出可結合緩存優化性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81279.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81279.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是API接口?API接口的核心價值

隨著互聯網技術的蓬勃發展&#xff0c;API 接口作為不同應用程序之間的關鍵紐帶&#xff0c;其重要性愈發凸顯。本文將從專業視角&#xff0c;深入剖析 API 接口的分類、原理、請求方式以及安全機制等核心要素&#xff0c;助力讀者全面理解這一數字化基礎設施。 一、API 接口及…

Linux_ELF文件

目錄 前言&#xff1a; 一、ELF文件的類型 二、ELF文件的組成格式 1. ELF頭部(ELF Header) 2. 節頭表(Section Header Table) 3. 程序頭表(Program Header Table) 4. 節(Sections)與段(Segments) 三、ELF文件從形成到加載輪廓 1、ELF可執行文件形成過程 2、 可執行文…

Go語言語法---輸入控制

文章目錄 1. fmt包讀取輸入1.1. 讀取單個值1.2. 讀取多個值 2. 格式化輸入控制 在Go語言中&#xff0c;控制輸入主要涉及從標準輸入(鍵盤)或文件等來源讀取數據。以下是幾種常見的輸入控制方法&#xff1a; 1. fmt包讀取輸入 fmt包中的Scan和Scanln函數都可以讀取輸入&#xf…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】附錄-C. 常用SQL腳本模板

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 附錄C. 常用SQL腳本模板速查表一、數據清洗與預處理模板二、數據聚合與分析模板三、窗口函數應用模板四、性能優化與監控模板五、數據備份與恢復模板六、權限管理與安全模板七、事務與錯誤處理模板八、時…

51單片機課設基于GM65模塊的二維碼加條形碼識別

系統組成 主控單元&#xff1a;51單片機&#xff08;如STC89C52&#xff09;作為核心控制器&#xff0c;協調各模塊工作。 掃描模塊&#xff1a;GM65條碼掃描頭&#xff0c;支持二維碼/條形碼識別&#xff0c;通過串口&#xff08;UART&#xff09;與單片機通信。 顯示模塊&a…

【OpenGL學習】(二)OpenGL渲染簡單圖形

文章目錄 【OpenGL學習】&#xff08;二&#xff09;OpenGL渲染簡單圖形OpenGL渲染圖形流程頂點&#xff0c;圖元和片元VAO&#xff0c;VBO &#xff0c;EBO著色器示例&#xff1a;使用OpenGL渲染三角形 【OpenGL學習】&#xff08;二&#xff09;OpenGL渲染簡單圖形 OpenGL渲…

基于STM32的INA226電壓電流檢測儀

系統總體框圖 功率檢測裝置原理圖功能及模塊連接說明 一、系統功能概述 該裝置以STM32F103C8T6微控制器為核心&#xff0c;集成功率檢測、數據交互、狀態顯示和用戶提示功能&#xff0c;通過模塊化設計實現穩定運行。 二、各模塊功能及連接方式 按鍵模塊 功能&#xff1a…

YOLOv2目標檢測算法:速度與精度的平衡之道

一、YOLOv2的核心改進&#xff1a;從V1到V2的蛻變 YOLOv2作為YOLO系列的第二代算法&#xff0c;在繼承V1端到端、單階段檢測的基礎上&#xff0c;針對V1存在的小目標檢測弱、定位精度低等問題進行了全方位升級&#xff0c;成為目標檢測領域的重要里程碑。 &#xff08;一&am…

將嵌入映射到 Elasticsearch 字段類型:semantic_text、dense_vector、sparse_vector

作者&#xff1a; Andre Luiz 討論如何以及何時使用 semantic_text、dense_vector 或 sparse_vector&#xff0c;以及它們與嵌入生成的關系。 通過這個自定進度的 Search AI 實踐學習親自體驗向量搜索。你可以開始免費云試用&#xff0c;或者在本地機器上嘗試 Elastic。 多年來…

uniapp取消瀏覽自動填充

為了防止瀏覽器自動將記住的密碼回填進type"password"輸入框&#xff0c;所以在type"password"輸入框上面加了兩行代碼&#xff0c;使瀏覽器將密碼填充到新加的輸入框里&#xff0c;并將這兩個input隱藏掉 <input type"password" autocomple…

從數據包到可靠性:UDP/TCP協議的工作原理分析

之前我們已經使用udp/tcp的相關接口寫了一些簡單的客戶端與服務端代碼。也了解了協議是什么&#xff0c;包括自定義協議和知名協議比如http/https和ssh等。現在我們再回到傳輸層&#xff0c;對udp和tcp這兩傳輸層巨頭協議做更深一步的分析。 一.UDP UDP相關內容很簡單&#xf…

顯卡、Cuda和pytorch兼容問題

這里寫目錄標題 驅動與CUDA版本兼容性問題1. **驅動與CUDA版本兼容性問題**2. **任務特性與硬件適配差異**3. **優化策略與框架配置差異**4. **散熱與功耗限制**5. **數據傳輸與CPU瓶頸**排查建議總結 查詢PyTorch中實際使用的CUDA版本**1. 查詢PyTorch中實際使用的CUDA版本***…

DeepSeek 大模型部署全指南:常見問題、優化策略與實戰解決方案

DeepSeek 作為當前最熱門的開源大模型之一&#xff0c;其強大的語義理解和生成能力吸引了大量開發者和企業關注。然而在實際部署過程中&#xff0c;無論是本地運行還是云端服務&#xff0c;用戶往往會遇到各種技術挑戰。本文將全面剖析 DeepSeek 部署中的常見問題&#xff0c;提…

Hadoop的目錄結構和組成

Hadoop 目錄結構 bin 目錄&#xff1a;包含了 Hadoop 的各種命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于啟動和管理 Hadoop 集群&#xff0c;以及執行各種數據處理任務。etc 目錄&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…

Python Matplotlib 庫【繪圖基礎庫】全面解析

讓AI成為我們的得力助手&#xff1a;《用Cursor玩轉AI輔助編程——不寫代碼也能做軟件開發》 一、發展歷程 Matplotlib 由 John D. Hunter 于 2003 年創建&#xff0c;靈感來源于 MATLAB 的繪圖系統。作為 Python 生態中最早的可視化工具之一&#xff0c;它逐漸成為科學計算領…

車載以太網驅動智能化:域控架構設計與開發實踐

title: 車載以太網驅動專用車智能化&#xff1a;域控架構設計與開發實踐 date: 2023-12-01 categories: 新能源汽車 tags: [車載以太網, 電子電氣架構, 域控架構, 專用車智能化, SOME/IP, AUTOSAR] 引言&#xff1a;專用車智能化轉型的挑戰與機遇 專用車作為城市建設與工業運輸…

圖論模板(部分)

圖論模板&#xff08;部分&#xff09; maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…

2025年【道路運輸企業安全生產管理人員】考試題庫及道路運輸企業安全生產管理人員考試內容

一、考試概述 2025年道路運輸企業安全生產管理人員考試題庫由【安全生產模擬考試一點通】平臺發布&#xff0c;涵蓋安全生產法律法規、車輛技術管理、從業人員管理、應急預案編制等核心領域。考試重點考察考生對安全生產主體責任、風險管控、隱患排查等實務操作的掌握程度&…

分貝計在噪音污染源識別中的用途

分貝計在噪音污染源識別中的作用 噪音污染是現代社會面臨的一個普遍問題&#xff0c;尤其在城市化進程加快的背景下&#xff0c;交通、工業、建筑和娛樂活動等產生的噪音對人們的生活質量和健康造成了嚴重影響。為了有效管理和控制噪音污染&#xff0c;首先需要準確識別噪音的…

deepin v23.1 搜狗輸入法next配置中文輸入法下默認用英文標點

deepin23.1下, fcitx5的 deepin next搜狗輸入法的屬性頁無法配置中文狀態下默認用英文標點, 但是可以改以下配置來實現這一點. 搜狗輸入法運行期間&#xff0c;用戶修改的配置被存儲在以下位置&#xff1a; ~/.config/cpis/module/im/fcitx5/com.sogou.ime.ng.fcitx5.deepin/k…