99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

400-800-8975

java開發技巧

java開發技巧

Java開發技巧從CRUD到架構師:10個讓你效率翻倍的實戰經驗

作為一名寫了8年代碼的Java程序員,我見過太多同行每天加班改BUG卻不見成長,也見過有人入職三年就晉升架構師。這其中的差距,往往不在于技術深度,而在于是否掌握了那些能大幅提升效率、減少踩坑的實戰技巧。本文整理了10個經過阿里、字節真實項目驗證的Java開發技巧,從基礎語法到性能優化,從異常處理到并發編程,每個都能幫你解決實際開發中的痛點問題。

一、集合操作:告別for循環嵌套的噩夢

你是不是也經常寫出這樣的代碼? 多層for循環嵌套遍歷集合,不僅可讀性差,性能更是堪憂。尤其是當數據量達到10萬級時,嵌套循環帶來的O(n2)復雜度能讓系統直接崩潰。

1.1 Stream API:一行代碼搞定復雜集合處理

Java 8的Stream API絕對是被低估的寶藏功能。比如要從訂單列表中篩選出金額大于1000的訂單,并按用戶ID分組統計總金額,傳統寫法需要50行代碼,而用Stream只需3行:

java

Map userTotalAmount = orderList.stream()

.filter(order -> order.getAmount().compareTo(new BigDecimal("1000")) > 0)

.collect(Collectors.groupingBy(Order::getUserId,

Collectors.reducing(BigDecimal.ZERO, Order::getAmount, BigDecimal::add)));

注意:使用Stream時要避免在中間操作中修改外部變量,這會導致線程安全問題。另外,并行流(parallelStream)并非銀彈,在小數據量場景下反而會因為線程切換降低性能。

1.2 巧用集合初始化提升性能

很多人習慣這樣初始化ArrayList:

java

List list = new ArrayList<>();

list.add("a");

list.add("b");

list.add("c");

但如果能預估集合大小,直接指定初始容量能減少50%的擴容開銷:

java

List list = new ArrayList<>(3); // 已知會添加3個元素

小技巧:HashMap初始化時建議設置initialCapacity = (需要存儲的元素個數 / 負載因子) + 1,負載因子默認0.75,比如要存100個元素,初始容量設為134(100/0.75+1)能避免自動擴容。

二、異常處理:別讓try-catch成為代碼的“牛皮癬”

我見過最夸張的代碼是一個方法里嵌套了7層try-catch,每個catch塊里只打印一句“發生異常”。這樣的異常處理不僅無法定位問題,還會掩蓋真正的錯誤原因。

2.1 精準捕獲異常,拒絕“大而全”

永遠不要捕獲Exception或Throwable這樣的頂級異常!正確的做法是捕獲具體異常,比如NullPointerException、IOException。例如文件操作應該這樣寫:

java

try (FileInputStream fis = new FileInputStream("data.txt")) {

// 業務邏輯

} catch (FileNotFoundException e) {

log.error("文件不存在: {}", "data.txt", e); // 記錄具體文件名

throw new BusinessException("讀取配置文件失敗,請檢查文件是否存在");

} catch (IOException e) {

log.error("文件讀取失敗", e);

throw new SystemException("系統IO異常,請聯系管理員", e);

}

2.2 使用try-with-resources自動關閉資源

JDBC連接、IO流如果忘記關閉,會導致資源泄露。Java 7的try-with-resources能自動關閉實現了AutoCloseable接口的資源,再也不用擔心漏寫finally:

java

try (Connection conn = DriverManager.getConnection(url);

PreparedStatement ps = conn.prepareStatement(sql);

ResultSet rs = ps.executeQuery()) {

// 數據庫操作

} catch (SQLException e) {

log.error("數據庫查詢失敗", e);

}

三、Optional:優雅解決NPE問題的“防坑神器”

NullPointerException被稱為Java程序員的“老朋友”,據統計它占了生產環境異常的30%以上。Optional雖然不能完全消滅NPE,但能讓代碼更優雅地處理null值。

3.1 從“層層判空”到“鏈式調用”

傳統判空寫法:

java

if (user != null) {

Address address = user.getAddress();

if (address != null) {

String city = address.getCity();

if (city != null) {

return city;

}

}

}

return "未知城市";

Optional優化后:

java

return Optional.ofNullable(user)

.map(User::getAddress)

.map(Address::getCity)

.orElse("未知城市");

避坑指南:不要使用Optional.get()方法,這和直接調用obj.method()一樣會拋出NPE。應該使用orElse()、orElseGet()或orElseThrow()來獲取值。

四、并發編程:別讓線程安全問題成為線上“定時炸彈”

去年我們線上出過一個嚴重故障:用戶充值后余額偶爾會翻倍。最后排查發現是使用了SimpleDateFormat這個線程不安全的類。并發編程的坑,每個Java開發者都得踩一遍才能長記性。

4.1 線程池:不是所有任務都適合用CachedThreadPool

很多人圖方便直接用Executors.newCachedThreadPool(),但這個線程池的核心線程數是0,最大線程數是Integer.MAX_VALUE,在高并發場景下會創建大量線程導致OOM。正確的做法是手動創建ThreadPoolExecutor

java

ThreadPoolExecutor executor = new ThreadPoolExecutor(

5, // 核心線程數

10, // 最大線程數

60L, // 空閑線程存活時間

TimeUnit.SECONDS,

new LinkedBlockingQueue<>(100), // 任務隊列

new ThreadFactoryBuilder().setNameFormat("order-process-%d").build(), // 線程名前綴

new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略:讓提交任務的線程自己執行

);

4.2 ThreadLocal:用完記得remove,否則內存泄露

ThreadLocal能解決線程間變量隔離問題,但如果使用不當(比如在線程池環境下不清理),會導致內存泄露。正確用法是在finally塊中調用remove():

private static ThreadLocal sdfThreadLocal = ThreadLocal.withInitial(

() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

);

public String formatDate(Date date) {

try {

return sdfThreadLocal.get().format(date);

} finally {

sdfThreadLocal.remove(); // 必須清理

}

}

五、代碼優化:這些細節能讓你的程序快10倍

5.1 字符串拼接:StringBuilder比+號快在哪里?

在循環中用+號拼接字符串,每次都會創建新的String對象,而StringBuilder只會在內部緩沖區擴容。測試表明,拼接10000個字符串時,StringBuilder比+號快200倍以上:

// 反例

String result = "";

for (int i = 0; i < 10000; i++) {

result += i; // 每次循環都創建新String

}

// 正例

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++) {

sb.append(i);

}

String result = sb.toString();

5.2 避免在循環中創建對象

下面這段代碼在循環中創建了10000個HashMap對象,會導致頻繁的GC:

// 反例

for (int i = 0; i < 10000; i++) {

Map map = new HashMap<>(); // 循環內創建對象

map.put("key", i);

process(map);

}

// 正例

Map map = new HashMap<>();

for (int i = 0; i < 10000; i++) {

map.clear(); // 復用對象

map.put("key", i);

process(map);

}

六、工具類:別重復造輪子,這些庫能幫你節省80%時間

6.1 Lombok:消除模板代碼的“神器”

用Lombok的@Data注解,能自動生成getter、setter、toString等方法,讓POJO類清爽不少:

java

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User {

private Long id;

private String name;

private Integer age;

}

注意:Lombok雖然好用,但在大型團隊中建議統一規范,避免濫用@Accessors(chain = true)等可能引起爭議的注解。

6.2 Hutool:國產工具類庫的驕傲

Hutool封裝了大量常用工具方法,比如日期處理、加密解密、Excel操作等。比如判斷字符串是否為空,傳統寫法需要判斷null和空字符串,用Hutool只需:

java

if (StrUtil.isEmpty(str)) { // 等同于 str == null || str.length() == 0

// 處理邏輯

}

七、數據庫操作:別讓SQL成為性能瓶頸

7.1 MyBatis:{}和${}的區別,90%的人都用錯

{}會預編譯SQL(PreparedStatement),能防止SQL注入;而${}是直接字符串替換。比如查詢用戶:

```xml

7.2 批量操作:一次插入1000條數據,用foreach還是BatchExecutor?

MyBatis的foreach標簽在插入大量數據時性能很差(會生成超長SQL)。正確做法是使用BatchExecutor:

java

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);

UserMapper mapper = session.getMapper(UserMapper.class);

for (User user : userList) {

mapper.insert(user);

}

session.commit();

session.close();

八、JVM調優:從“猜”到“看”的進階之路

很多程序員對JVM調優感到頭疼,其實掌握基本工具就能解決80%的問題。

8.1 學會看GC日志

在JVM參數中添加-XX:+PrintGCDetails -XX:+PrintGCDateStamps,能打印詳細的GC日志。比如:

2023-10-01T12:00:00.123+0800: [GC (Allocation Failure) [PSYoungGen: 51200K->1024K(61440K)] 51200K->2048K(204800K), 0.0012345 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]

這段日志表示:年輕代從51200K回收至1024K,總堆內存從51200K回收至2048K,耗時0.0012345秒。如果頻繁發生Full GC(日志中有Full GC字樣),通常是內存泄漏或堆內存不足導致。

8.2 常用JVM參數配置

生產環境推薦配置:

-Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log

其中-Xms和-Xmx設置為相同值,避免堆內存動態調整帶來的性能損耗。

九、單元測試:寫好測試用例,讓BUG無處遁形

9.1 JUnit 5 + Mockito:輕松搞定單元測試

測試Service層時,通常需要Mock掉DAO層依賴:

@ExtendWith(MockitoExtension.class)

public class UserServiceTest {

@Mock

private UserDao userDao;

@InjectMocks

private UserServiceImpl userService;

@Test

public void testGetUserById() {

// 準備測試數據

Long userId = 1L;

User mockUser = new User(userId, "張三", 20);

// Mock DAO方法返回

when(userDao.selectById(userId)).thenReturn(mockUser);

// 調用Service方法

User result = userService.getUserById(userId);

// 斷言結果

assertNotNull(result);

assertEquals("張三", result.getName());

// 驗證DAO方法是否被調用

verify(userDao, times(1)).selectById(userId);

}

}

9.2 測試覆蓋率:不是越高越好

很多團隊追求100%測試覆蓋率,但這往往會導致為了測試而測試。核心業務邏輯的覆蓋率必須達到100%,而工具類、POJO類可以適當降低要求

十、學習方法:成為高級Java工程師的3個秘訣

10.1 讀源碼:從JDK到框架

真正的Java高手都讀過源碼。推薦從JDK的ArrayList、HashMap開始,再到Spring的IOC容器、MyBatis的執行流程。讀源碼時帶著問題去看,比如“HashMap為什么線程不安全?”、“Spring Bean的生命周期是怎樣的?”。

10.2 寫博客:輸出倒逼輸入

把學到的知識寫成博客,不僅能加深理解,還能建立個人影響力。剛開始可以寫技術總結,慢慢嘗試寫源碼分析、架構設計。記住:教是最好的學

10.3 參與開源項目:提升實戰能力

即使是給開源項目提交一個文檔修改、修復一個小BUG,也能讓你學到很多。推薦從Spring Boot、MyBatis等成熟項目的issue列表中找“good first issue”開始。

Java開發之路沒有捷徑,但掌握這些技巧能讓你少走很多彎路。記住,真正的高手不是會多少技術,而是能把簡單的技術用得爐火純青。希望本文能幫你在Java開發的道路上走得更遠、更穩。

12 12 分享:

相關課程

發表評論

登錄后才能評論,請登錄后發表評論...
提交評論

最新課程

最新專題

国产成人精品综合| 国产亚洲男人的天堂在线观看| 四虎影视库| 精品视频一区二区三区| 欧美激情一区二区三区中文字幕| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久草免费在线观看| 久久久久久久男人的天堂| 欧美激情一区二区三区在线| 精品国产一区二区三区久久久蜜臀 | 精品国产一区二区三区精东影业| 国产亚洲精品aaa大片| 999久久66久6只有精品| 四虎久久精品国产| 国产伦精品一区三区视频| 亚欧成人毛片一区二区三区四区| 亚洲女初尝黑人巨高清在线观看| 高清一级做a爱过程不卡视频| 日本免费看视频| 国产精品自拍一区| 午夜欧美福利| 高清一级毛片一本到免费观看| 欧美大片a一级毛片视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产视频久久久久| 四虎久久影院| 日韩一级精品视频在线观看| 韩国毛片免费| 深夜做爰性大片中文| 国产a免费观看| 亚洲精品影院一区二区| 久草免费在线观看| 久久成人性色生活片| 一级片片| 欧美大片a一级毛片视频| 亚洲不卡一区二区三区在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产麻豆精品高清在线播放| 91麻豆爱豆果冻天美星空| 精品视频在线观看一区二区三区| 国产a视频| 国产麻豆精品免费密入口| 韩国三级视频在线观看| 日韩欧美一及在线播放| 国产视频一区二区三区四区| 欧美一级视| 久久精品免视看国产明星| 99久久精品国产国产毛片 | 精品视频在线看| 国产不卡在线观看视频| 亚洲爆爽| 午夜久久网| 精品视频在线观看一区二区| 成人免费观看网欧美片| 美女免费精品高清毛片在线视| 欧美一级视频免费| 一级毛片视频在线观看| 国产高清在线精品一区a| a级黄色毛片免费播放视频| 尤物视频网站在线| 精品久久久久久中文字幕2017| 日韩在线观看免费完整版视频| 国产伦久视频免费观看 视频| 国产精品1024永久免费视频| 亚久久伊人精品青青草原2020| 日韩免费在线观看视频| 亚洲女初尝黑人巨高清在线观看| 久久国产影院| 天天色色网| 欧美一区二区三区性| 精品视频在线观看一区二区三区| 一本伊大人香蕉高清在线观看| 九九久久99综合一区二区| 一本高清在线| 日韩在线观看视频黄| 色综合久久久久综合体桃花网| 日韩一级黄色| 夜夜操网| 午夜在线影院| 尤物视频网站在线| 99久久精品国产片| 国产不卡在线观看| 日日夜夜婷婷| 999精品在线| 国产原创视频在线| 欧美一区二区三区性| 欧美激情一区二区三区中文字幕| 国产不卡在线观看| 色综合久久天天综线观看| 天天色成人| 欧美a级片免费看| 99热热久久| 久草免费在线观看| 亚洲精品永久一区| 午夜激情视频在线播放| 日本在线不卡视频| 国产一区二区福利久久| 欧美另类videosbestsex| 尤物视频网站在线| 精品国产亚洲人成在线| 高清一级做a爱过程不卡视频| 日韩中文字幕一区二区不卡| 国产精品123| 国产成人精品综合在线| 国产视频网站在线观看| 欧美一区二区三区性| 999久久66久6只有精品| 国产高清在线精品一区a| 日韩欧美一二三区| 国产伦理精品| 精品视频免费观看| 亚欧成人毛片一区二区三区四区| 国产一区二区福利久久| 日韩专区亚洲综合久久| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产视频久久久久| 麻豆系列 在线视频| 久草免费资源| 麻豆午夜视频| 国产欧美精品| 91麻豆国产福利精品| 午夜在线亚洲男人午在线| 国产一区二区精品久久91| 黄视频网站免费看| 午夜久久网| 午夜欧美成人香蕉剧场| 麻豆午夜视频| 999久久久免费精品国产牛牛| 成人免费观看男女羞羞视频| 天天做日日爱| 九九国产| 欧美另类videosbestsex| 国产麻豆精品免费视频| 午夜家庭影院| 国产一区免费观看| 国产一区二区高清视频| 麻豆网站在线看| 尤物视频网站在线| 毛片的网站| 久久国产影院| 国产91精品一区| 可以免费看污视频的网站| 日韩中文字幕在线观看视频| 国产不卡精品一区二区三区| 国产麻豆精品hdvideoss| 精品在线免费播放| 精品视频免费在线| 欧美大片aaaa一级毛片| 亚洲第一页乱| 91麻豆精品国产综合久久久| 一本高清在线| 成人在免费观看视频国产| 可以在线看黄的网站| 国产高清视频免费| 成人高清护士在线播放| 天堂网中文字幕| 国产91精品一区| 99色视频在线| 亚飞与亚基在线观看| 国产亚洲精品aaa大片| 欧美1卡一卡二卡三新区| 黄色免费三级| 国产不卡精品一区二区三区| 欧美大片aaaa一级毛片| 久久国产影院| 午夜在线亚洲| 高清一级毛片一本到免费观看| 欧美大片a一级毛片视频| 99热视热频这里只有精品| 天天做人人爱夜夜爽2020| 国产欧美精品| 九九九国产| 国产视频一区二区在线播放| 韩国三级香港三级日本三级la| 精品久久久久久中文字幕2017| 国产成人精品影视| 国产一区二区精品久久91| 精品国产亚洲人成在线| 麻豆网站在线看| 毛片高清| 韩国三级香港三级日本三级la| 999久久66久6只有精品| 欧美另类videosbestsex视频 | 亚洲天堂一区二区三区四区| 亚洲 欧美 成人日韩| 免费国产一级特黄aa大片在线| 日本乱中文字幕系列| 精品视频在线看| 日韩欧美一二三区| 四虎影视久久久免费| 91麻豆精品国产片在线观看| 国产伦精品一区三区视频| 日本乱中文字幕系列| 国产一区二区精品久久91| 久久国产精品只做精品| 免费国产一级特黄aa大片在线| 九九精品久久久久久久久| 成人免费网站久久久| 国产91素人搭讪系列天堂| 精品视频一区二区三区免费|