日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

讓 Java 程序運行更快的 15 個技巧,肯定有你不知道的

來源: 責編: 時間:2023-12-13 17:02:49 277觀看
導讀1、避免使用多個 If-else 語句我們在代碼中使用條件語句進行決策。條件語句不應該被過度使用。如果我們使用太多條件 if-else 語句,則會影響性能,因為 JVM 每次都必須比較條件。如果在 for 循環、while 循環等循環語句

5eN28資訊網——每日最新資訊28at.com

1、避免使用多個 If-else 語句

我們在代碼中使用條件語句進行決策。條件語句不應該被過度使用。如果我們使用太多條件 if-else 語句,則會影響性能,因為 JVM 每次都必須比較條件。5eN28資訊網——每日最新資訊28at.com

如果在 for 循環、while 循環等循環語句中使用相同的內容,情況可能會變得更糟。5eN28資訊網——每日最新資訊28at.com

如果業務邏輯中有太多條件,請嘗試對條件進行分組并獲取布爾結果并在 if 語句中使用它。5eN28資訊網——每日最新資訊28at.com

另外,如果可能的話,我們可以考慮使用 switch 語句來代替多個 if-else。Switch 語句比 if-else 具有性能優勢。下面提供了示例作為示例,應避免如下情況:5eN28資訊網——每日最新資訊28at.com

例子:5eN28資訊網——每日最新資訊28at.com

if(條件1){         if(條件2){             if (條件3 || 條件4) { 執行..}              else{執行..}

注意: 應避免使用上述示例,并按如下方式使用:5eN28資訊網——每日最新資訊28at.com

布爾結果 = (條件1 && 條件2) && (條件3 || 條件4)。5eN28資訊網——每日最新資訊28at.com

2、避免使用字符串對象進行連接

字符串是一個不可變類,由 String 創建的對象不能被重用。因此,如果我們需要創建一個大字符串,那么使用“+”運算符連接 String 對象是不好的做法。5eN28資訊網——每日最新資訊28at.com

這將導致創建多個 String 對象,從而導致更多的堆內存使用。5eN28資訊網——每日最新資訊28at.com

在這種情況下,我們可以使用 StringBuilder 或 StringBuffer,前者優于后者,因為它由于非同步方法而具有性能優勢。5eN28資訊網——每日最新資訊28at.com

示例如下:5eN28資訊網——每日最新資訊28at.com

String str = str1+str2+str3;

注意: 應避免使用上述示例,并按如下方式使用:5eN28資訊網——每日最新資訊28at.com

StringBuilder strBuilder = new StringBuilder(“”);strBuilder.append(str1).append(str2).append(str3);字符串查詢 = strBuilder.toString();

3、避免編寫長方法

這些方法不應該太長,并且應該特定于執行單一功能。編寫代碼時使用單一職責原則。5eN28資訊網——每日最新資訊28at.com

這對于維護和性能都有好處,因為在類加載和方法調用期間,方法會加載到堆棧內存中。5eN28資訊網——每日最新資訊28at.com

如果方法很大且處理量過多,它們將消耗內存以及 CPU 周期來執行。5eN28資訊網——每日最新資訊28at.com

嘗試在適當的邏輯點將這些方法分解為更小的方法。5eN28資訊網——每日最新資訊28at.com

我建議在 IDE 中使用Find Bug 或 Sonar Cube插件。它們基本上表明了方法的認知復雜性何時從閥值開始增加。5eN28資訊網——每日最新資訊28at.com

4、避免在循環中獲取集合的大小

迭代任何集合時,都會在循環之前獲取集合的大小,而不會在迭代期間獲取它。下面提供了示例作為示例,應避免如下情況:5eN28資訊網——每日最新資訊28at.com

例子:5eN28資訊網——每日最新資訊28at.com

List<String> empListData = getEmpData (); for ( int i = 0 ; i < empListData.size ( ); i++) {執行代碼 .. }

注意:應避免使用上述示例,并按如下方式使用:5eN28資訊網——每日最新資訊28at.com

List<String> empListData= getEmpData();int size = empListData.size();for (int i = 0; i < 大小; i++) {執行代碼..}

5、避免使用BigInteger 和BigDecimal 類

BigDecimal 類為十進制值提供準確的精度。過度使用該對象會極大地影響性能,特別是當使用該對象來計算循環中的某些值時。5eN28資訊網——每日最新資訊28at.com

BigInteger 和 BigDecimal在 long 或 double 上使用大量內存來執行計算。5eN28資訊網——每日最新資訊28at.com

如果精度不是問題,或者如果我們確定計算值的范圍不會超過 long 或 double,我們可以避免使用 BigDecimal,而應該使用 long 或 double 并進行適當的轉換。5eN28資訊網——每日最新資訊28at.com

6、盡可能使用原始類型

使用原始數據類型比對象更好,因為原始類型數據存儲在堆棧內存中,而對象存儲在堆內存中。5eN28資訊網——每日最新資訊28at.com

如果可能,我們可以使用原始數據類型而不是對象,因為從堆棧內存訪問數據比堆內存更快。5eN28資訊網——每日最新資訊28at.com

因此,使用 double 優于 Double 或使用 int 優于 Integer 總是有益的。5eN28資訊網——每日最新資訊28at.com

7、使用存儲過程代替查詢

最好編寫存儲過程而不是復雜而大的查詢并在處理時調用它們。5eN28資訊網——每日最新資訊28at.com

存儲過程作為對象存儲在數據庫中并進行預編譯。與具有相同業務邏輯的查詢相比,存儲過程的執行時間更短,因為每次通過應用程序調用查詢時都會編譯和執行查詢。5eN28資訊網——每日最新資訊28at.com

此外,存儲過程在數據傳輸和網絡流量方面具有優勢,因為我們不需要每次都將復雜的查詢傳輸到數據庫服務器來執行。5eN28資訊網——每日最新資訊28at.com

8、避免經常創建大對象

有某些類在應用程序中充當數據持有者。這些對象很重,應避免多次創建它們。5eN28資訊網——每日最新資訊28at.com

例如用戶登錄后的數據庫連接對象或會話對象。這些對象在創建時使用了大量資源。5eN28資訊網——每日最新資訊28at.com

我們應該重用這些對象,而不是創建它們,因為創建會由于更多的內存使用而極大地影響應用程序的性能。5eN28資訊網——每日最新資訊28at.com

我們應該盡可能使用單例模式來創建對象的單個實例,并在需要時重用它,或者克隆該對象而不是創建一個新對象。5eN28資訊網——每日最新資訊28at.com

9、在 Java 應用程序中謹慎使用“包含”

Lists、ArrayList 和Vectors都有一個 contains 方法,允許程序員檢查集合是否已經有類似的對象。可能正在迭代一個大樣本,并且經常需要在樣本中查找唯一對象的列表。代碼可能如下所示:5eN28資訊網——每日最新資訊28at.com

ArrayList al = new ArrayList();for (int i=0; i < vars.size(); i++){	String obj = (String) vars.get(i);	if (!al.contains(obj))	{		al.add(obj);	}}

從功能上講,這段代碼很好,但從性能的角度來看,需要在循環的每次迭代中檢查 ArrayList 是否包含該對象。contains 方法每次都會掃描整個 ArrayList。因此,隨著 ArrayList 變大,性能損失也會增加。5eN28資訊網——每日最新資訊28at.com

最好先將所有樣本添加到 ArrayList,進行一次重復檢查,使用本質上提供唯一性的集合(例如 HashSet),然后創建唯一的 ArrayList 一次。現在不必對 ArrayList 進行數千次包含檢查,而是進行一次性重復檢查。5eN28資訊網——每日最新資訊28at.com

ArrayList al = new ArrayList();…for (int i=0; i < vars.size(); i++){	String obj = (String) vars.get(i);	al.add(obj);}al = removeDuplicates(al);…static ArrayList removeDuplicates(ArrayList list) {	if (list == null || list.size() == 0)	{		return list;	}  Set set = new HashSet(list);	list.clear();	list.addAll(set); 	return list;}

下表顯示了我們的原始代碼和上面修改的代碼之間的時間差:5eN28資訊網——每日最新資訊28at.com

比較5eN28資訊網——每日最新資訊28at.com

1005eN28資訊網——每日最新資訊28at.com

10005eN28資訊網——每日最新資訊28at.com

100005eN28資訊網——每日最新資訊28at.com

1000005eN28資訊網——每日最新資訊28at.com

原始代碼5eN28資訊網——每日最新資訊28at.com

0ms5eN28資訊網——每日最新資訊28at.com

5ms5eN28資訊網——每日最新資訊28at.com

171ms5eN28資訊網——每日最新資訊28at.com

49820ms5eN28資訊網——每日最新資訊28at.com

修改代碼5eN28資訊網——每日最新資訊28at.com

0ms5eN28資訊網——每日最新資訊28at.com

1ms5eN28資訊網——每日最新資訊28at.com

7ms5eN28資訊網——每日最新資訊28at.com

28ms5eN28資訊網——每日最新資訊28at.com

10、使用PreparedStatement代替Statement

在通過應用程序執行 SQL 查詢時,我們使用 JDBC API 和類來實現同樣的目的。5eN28資訊網——每日最新資訊28at.com

對于參數化查詢執行來說, PreparedStatement比Statement更有優勢,因為preparedStatement 對象編譯一次并執行多次。5eN28資訊網——每日最新資訊28at.com

另一方面,Statement 對象在每次調用時都會被編譯和執行。此外,準備好的語句對象是安全的,可以避免 SQL 注入攻擊。5eN28資訊網——每日最新資訊28at.com

11、在查詢中選擇所需的列

在從數據庫獲取數據時,我們使用選擇查詢來獲取數據。避免選擇不需要進一步處理的列。5eN28資訊網——每日最新資訊28at.com

僅選擇我們需要進一步處理或在前端顯示的那些列。選擇太多列會導致數據庫端的查詢執行延遲。5eN28資訊網——每日最新資訊28at.com

從數據庫中選擇數據時避免使用“*”。5eN28資訊網——每日最新資訊28at.com

此外,它還會增加從數據庫到應用程序的網絡流量,這是應該避免的。下面提供了示例作為示例,應避免如下情況:5eN28資訊網——每日最新資訊28at.com

例子:5eN28資訊網——每日最新資訊28at.com

select * from employee where emp_id = 100;

注意:應避免使用上述示例,并按如下方式使用:5eN28資訊網——每日最新資訊28at.com

從員工中選擇 emp_name、emp_age、emp_gender、emp_ocupation、emp_address,其中 emp_id = 100;5eN28資訊網——每日最新資訊28at.com

12、使用不必要的日志語句和不正確的日志級別

日志記錄是任何應用程序不可或缺的一部分,需要有效實施,以避免由于不正確的日志記錄和日志級別而導致性能下降。5eN28資訊網——每日最新資訊28at.com

我們應該避免將大對象記錄到代碼中。日志記錄應限于特定參數。5eN28資訊網——每日最新資訊28at.com

此外,日志記錄級別應保持在較高級別,例如 DEBUG、ERROR,而不是 INFO。下面提供了示例作為示例,應避免如下情況:5eN28資訊網——每日最新資訊28at.com

例子:5eN28資訊網——每日最新資訊28at.com

Logger.debug ( "員工信息:" + emp.toString ( )); Logger.info ( "設置員工數據調用的方法:" + emp.getData ( ));

注意:應避免使用上述示例,并按如下方式使用:5eN28資訊網——每日最新資訊28at.com

Logger.debug(“員工信息:” + emp.getName() + ”:登錄ID:” + emp.getLoginId());5eN28資訊網——每日最新資訊28at.com

Logger.info(“設置員工數據所調用的方法”)。5eN28資訊網——每日最新資訊28at.com

13、使用join連接獲取數據

從多個表獲取數據時,有必要在表上正確使用join聯接。如果未正確使用聯接或表未標準化,則會導致查詢執行延遲,從而導致應用程序性能下降。5eN28資訊網——每日最新資訊28at.com

避免使用子查詢而不是連接,因為子查詢比連接花費更多的執行時間。5eN28資訊網——每日最新資訊28at.com

在表中經常使用的列上創建索引,以提高查詢執行的性能并減少應用程序的延遲。5eN28資訊網——每日最新資訊28at.com

在 join 或 where 子句中始終首先使用主鍵。5eN28資訊網——每日最新資訊28at.com

14、使用 EntrySet 而不是 KeySet

如果在地圖上進行大量迭代,那么EntrySet會比KeySet更好。EntrySet 可以在一秒鐘內比 KeySet 多運行 9000 次操作,因此將通過這種方式獲得更好的性能。5eN28資訊網——每日最新資訊28at.com

15、EnumSet 是枚舉值的最佳選擇

如果正在使用 Enum 值,那么使用EnumSet更有意義。它允許比其他方法更快的計算。5eN28資訊網——每日最新資訊28at.com

EnumSet 的值以可預測的順序存儲,而其他方法(如 HashSet)需要更長的時間才能產生相同的結果。5eN28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-44412-0.html讓 Java 程序運行更快的 15 個技巧,肯定有你不知道的

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Tomcat 架構原理解析到架構設計借鑒

下一篇: 怎么寫一個Maven插件來提升生產效率?

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 8月總票房已突破10億!《封神》第一:口碑已經成了

    8月5日消息,據燈塔專業版數據,截至8月5日9時35分,8月總票房(含預售)已突破10億。其中,《封神》以大比分的優勢領先。根據官方消息,目前該片總票房已經超過14.
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 微軟邀請 Microsoft 365 商業用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • AMD的AI芯片轉單給三星可能性不大 與臺積電已合作至2nm制程

    據 DIGITIMES 消息,英偉達 AI GPU 出貨逐季飆升,接下來 AMD MI 300 系列將在第 4 季底量產。而半導體業內人士表示,近日傳出 AMD 的 AI 芯片將轉單給
Top 主站蜘蛛池模板: 北流市| 岳西县| 石泉县| 乌拉特中旗| 白银市| 高邮市| 宜昌市| 梅州市| 张家川| 天等县| 曲麻莱县| 黑河市| 大邑县| 定襄县| 绥滨县| 赤水市| 长顺县| 霍州市| 河津市| 抚松县| 衡阳县| 阳西县| 定安县| 莱芜市| 潼南县| 南漳县| 安达市| 沙河市| 姚安县| 凯里市| 章丘市| 宾阳县| 保德县| 麟游县| 潮安县| 工布江达县| 马尔康县| 连城县| 尉犁县| 武义县| 孟村|