自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓 Java 程序運(yùn)行更快的 15 個(gè)技巧,肯定有你不知道的

開(kāi)發(fā) 后端
本篇給大家?guī)?lái)如何讓 Java 程序運(yùn)行更快的 15 個(gè)技巧,我相信一定有你不知道的,學(xué)會(huì)這些,讓你在開(kāi)發(fā)路上更得心應(yīng)手。

1、避免使用多個(gè) If-else 語(yǔ)句

我們?cè)诖a中使用條件語(yǔ)句進(jìn)行決策。條件語(yǔ)句不應(yīng)該被過(guò)度使用。如果我們使用太多條件 if-else 語(yǔ)句,則會(huì)影響性能,因?yàn)?JVM 每次都必須比較條件。

如果在 for 循環(huán)、while 循環(huán)等循環(huán)語(yǔ)句中使用相同的內(nèi)容,情況可能會(huì)變得更糟。

如果業(yè)務(wù)邏輯中有太多條件,請(qǐng)嘗試對(duì)條件進(jìn)行分組并獲取布爾結(jié)果并在 if 語(yǔ)句中使用它。

另外,如果可能的話,我們可以考慮使用 switch 語(yǔ)句來(lái)代替多個(gè) if-else。Switch 語(yǔ)句比 if-else 具有性能優(yōu)勢(shì)。下面提供了示例作為示例,應(yīng)避免如下情況:

例子:

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

注意: 應(yīng)避免使用上述示例,并按如下方式使用:

布爾結(jié)果 = (條件1 && 條件2) && (條件3 || 條件4)。

2、避免使用字符串對(duì)象進(jìn)行連接

字符串是一個(gè)不可變類(lèi),由 String 創(chuàng)建的對(duì)象不能被重用。因此,如果我們需要?jiǎng)?chuàng)建一個(gè)大字符串,那么使用“+”運(yùn)算符連接 String 對(duì)象是不好的做法。

這將導(dǎo)致創(chuàng)建多個(gè) String 對(duì)象,從而導(dǎo)致更多的堆內(nèi)存使用。

在這種情況下,我們可以使用 StringBuilder 或 StringBuffer,前者優(yōu)于后者,因?yàn)樗捎诜峭椒椒ǘ哂行阅軆?yōu)勢(shì)。

示例如下:

String str = str1+str2+str3;

注意: 應(yīng)避免使用上述示例,并按如下方式使用:

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

3、避免編寫(xiě)長(zhǎng)方法

這些方法不應(yīng)該太長(zhǎng),并且應(yīng)該特定于執(zhí)行單一功能。編寫(xiě)代碼時(shí)使用單一職責(zé)原則。

這對(duì)于維護(hù)和性能都有好處,因?yàn)樵陬?lèi)加載和方法調(diào)用期間,方法會(huì)加載到堆棧內(nèi)存中。

如果方法很大且處理量過(guò)多,它們將消耗內(nèi)存以及 CPU 周期來(lái)執(zhí)行。

嘗試在適當(dāng)?shù)倪壿孅c(diǎn)將這些方法分解為更小的方法。

我建議在 IDE 中使用Find Bug 或 Sonar Cube插件。它們基本上表明了方法的認(rèn)知復(fù)雜性何時(shí)從閥值開(kāi)始增加。

4、避免在循環(huán)中獲取集合的大小

迭代任何集合時(shí),都會(huì)在循環(huán)之前獲取集合的大小,而不會(huì)在迭代期間獲取它。下面提供了示例作為示例,應(yīng)避免如下情況:

例子:

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

注意:應(yīng)避免使用上述示例,并按如下方式使用:

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

5、避免使用BigInteger 和BigDecimal 類(lèi)

BigDecimal 類(lèi)為十進(jìn)制值提供準(zhǔn)確的精度。過(guò)度使用該對(duì)象會(huì)極大地影響性能,特別是當(dāng)使用該對(duì)象來(lái)計(jì)算循環(huán)中的某些值時(shí)。

BigInteger 和 BigDecimal在 long 或 double 上使用大量?jī)?nèi)存來(lái)執(zhí)行計(jì)算。

如果精度不是問(wèn)題,或者如果我們確定計(jì)算值的范圍不會(huì)超過(guò) long 或 double,我們可以避免使用 BigDecimal,而應(yīng)該使用 long 或 double 并進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換。

6、盡可能使用原始類(lèi)型

使用原始數(shù)據(jù)類(lèi)型比對(duì)象更好,因?yàn)樵碱?lèi)型數(shù)據(jù)存儲(chǔ)在堆棧內(nèi)存中,而對(duì)象存儲(chǔ)在堆內(nèi)存中。

如果可能,我們可以使用原始數(shù)據(jù)類(lèi)型而不是對(duì)象,因?yàn)閺亩褩?nèi)存訪問(wèn)數(shù)據(jù)比堆內(nèi)存更快。

因此,使用 double 優(yōu)于 Double 或使用 int 優(yōu)于 Integer 總是有益的。

7、使用存儲(chǔ)過(guò)程代替查詢(xún)

最好編寫(xiě)存儲(chǔ)過(guò)程而不是復(fù)雜而大的查詢(xún)并在處理時(shí)調(diào)用它們。

存儲(chǔ)過(guò)程作為對(duì)象存儲(chǔ)在數(shù)據(jù)庫(kù)中并進(jìn)行預(yù)編譯。與具有相同業(yè)務(wù)邏輯的查詢(xún)相比,存儲(chǔ)過(guò)程的執(zhí)行時(shí)間更短,因?yàn)槊看瓮ㄟ^(guò)應(yīng)用程序調(diào)用查詢(xún)時(shí)都會(huì)編譯和執(zhí)行查詢(xún)。

此外,存儲(chǔ)過(guò)程在數(shù)據(jù)傳輸和網(wǎng)絡(luò)流量方面具有優(yōu)勢(shì),因?yàn)槲覀儾恍枰看味紝?fù)雜的查詢(xún)傳輸?shù)綌?shù)據(jù)庫(kù)服務(wù)器來(lái)執(zhí)行。

8、避免經(jīng)常創(chuàng)建大對(duì)象

有某些類(lèi)在應(yīng)用程序中充當(dāng)數(shù)據(jù)持有者。這些對(duì)象很重,應(yīng)避免多次創(chuàng)建它們。

例如用戶(hù)登錄后的數(shù)據(jù)庫(kù)連接對(duì)象或會(huì)話對(duì)象。這些對(duì)象在創(chuàng)建時(shí)使用了大量資源。

我們應(yīng)該重用這些對(duì)象,而不是創(chuàng)建它們,因?yàn)閯?chuàng)建會(huì)由于更多的內(nèi)存使用而極大地影響應(yīng)用程序的性能。

我們應(yīng)該盡可能使用單例模式來(lái)創(chuàng)建對(duì)象的單個(gè)實(shí)例,并在需要時(shí)重用它,或者克隆該對(duì)象而不是創(chuàng)建一個(gè)新對(duì)象。

9、在 Java 應(yīng)用程序中謹(jǐn)慎使用“包含”

Lists、ArrayList 和Vectors都有一個(gè) contains 方法,允許程序員檢查集合是否已經(jīng)有類(lèi)似的對(duì)象??赡苷诘粋€(gè)大樣本,并且經(jīng)常需要在樣本中查找唯一對(duì)象的列表。代碼可能如下所示:

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);
	}
}

從功能上講,這段代碼很好,但從性能的角度來(lái)看,需要在循環(huán)的每次迭代中檢查 ArrayList 是否包含該對(duì)象。contains 方法每次都會(huì)掃描整個(gè) ArrayList。因此,隨著 ArrayList 變大,性能損失也會(huì)增加。

最好先將所有樣本添加到 ArrayList,進(jìn)行一次重復(fù)檢查,使用本質(zhì)上提供唯一性的集合(例如 HashSet),然后創(chuàng)建唯一的 ArrayList 一次?,F(xiàn)在不必對(duì) ArrayList 進(jìn)行數(shù)千次包含檢查,而是進(jìn)行一次性重復(fù)檢查。

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;
}

下表顯示了我們的原始代碼和上面修改的代碼之間的時(shí)間差:

比較

100

1000

10000

100000

原始代碼

0ms

5ms

171ms

49820ms

修改代碼

0ms

1ms

7ms

28ms

10、使用PreparedStatement代替Statement

在通過(guò)應(yīng)用程序執(zhí)行 SQL 查詢(xún)時(shí),我們使用 JDBC API 和類(lèi)來(lái)實(shí)現(xiàn)同樣的目的。

對(duì)于參數(shù)化查詢(xún)執(zhí)行來(lái)說(shuō), PreparedStatement比Statement更有優(yōu)勢(shì),因?yàn)閜reparedStatement 對(duì)象編譯一次并執(zhí)行多次。

另一方面,Statement 對(duì)象在每次調(diào)用時(shí)都會(huì)被編譯和執(zhí)行。此外,準(zhǔn)備好的語(yǔ)句對(duì)象是安全的,可以避免 SQL 注入攻擊。

11、在查詢(xún)中選擇所需的列

在從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)時(shí),我們使用選擇查詢(xún)來(lái)獲取數(shù)據(jù)。避免選擇不需要進(jìn)一步處理的列。

僅選擇我們需要進(jìn)一步處理或在前端顯示的那些列。選擇太多列會(huì)導(dǎo)致數(shù)據(jù)庫(kù)端的查詢(xún)執(zhí)行延遲。

從數(shù)據(jù)庫(kù)中選擇數(shù)據(jù)時(shí)避免使用“*”。

此外,它還會(huì)增加從數(shù)據(jù)庫(kù)到應(yīng)用程序的網(wǎng)絡(luò)流量,這是應(yīng)該避免的。下面提供了示例作為示例,應(yīng)避免如下情況:

例子:

select * from employee where emp_id = 100;

注意:應(yīng)避免使用上述示例,并按如下方式使用:

從員工中選擇 emp_name、emp_age、emp_gender、emp_ocupation、emp_address,其中 emp_id = 100;

12、使用不必要的日志語(yǔ)句和不正確的日志級(jí)別

日志記錄是任何應(yīng)用程序不可或缺的一部分,需要有效實(shí)施,以避免由于不正確的日志記錄和日志級(jí)別而導(dǎo)致性能下降。

我們應(yīng)該避免將大對(duì)象記錄到代碼中。日志記錄應(yīng)限于特定參數(shù)。

此外,日志記錄級(jí)別應(yīng)保持在較高級(jí)別,例如 DEBUG、ERROR,而不是 INFO。下面提供了示例作為示例,應(yīng)避免如下情況:

例子:

Logger.debug ( "員工信息:" + emp.toString ( )); 
Logger.info ( "設(shè)置員工數(shù)據(jù)調(diào)用的方法:" + emp.getData ( ));

注意:應(yīng)避免使用上述示例,并按如下方式使用:

Logger.debug(“員工信息:” + emp.getName() + ”:登錄ID:” + emp.getLoginId());

Logger.info(“設(shè)置員工數(shù)據(jù)所調(diào)用的方法”)。

13、使用join連接獲取數(shù)據(jù)

從多個(gè)表獲取數(shù)據(jù)時(shí),有必要在表上正確使用join聯(lián)接。如果未正確使用聯(lián)接或表未標(biāo)準(zhǔn)化,則會(huì)導(dǎo)致查詢(xún)執(zhí)行延遲,從而導(dǎo)致應(yīng)用程序性能下降。

避免使用子查詢(xún)而不是連接,因?yàn)樽硬樵?xún)比連接花費(fèi)更多的執(zhí)行時(shí)間。

在表中經(jīng)常使用的列上創(chuàng)建索引,以提高查詢(xún)執(zhí)行的性能并減少應(yīng)用程序的延遲。

在 join 或 where 子句中始終首先使用主鍵。

14、使用 EntrySet 而不是 KeySet

如果在地圖上進(jìn)行大量迭代,那么EntrySet會(huì)比KeySet更好。EntrySet 可以在一秒鐘內(nèi)比 KeySet 多運(yùn)行 9000 次操作,因此將通過(guò)這種方式獲得更好的性能。

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

如果正在使用 Enum 值,那么使用EnumSet更有意義。它允許比其他方法更快的計(jì)算。

EnumSet 的值以可預(yù)測(cè)的順序存儲(chǔ),而其他方法(如 HashSet)需要更長(zhǎng)的時(shí)間才能產(chǎn)生相同的結(jié)果。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-11-15 08:22:42

Java開(kāi)發(fā)小技巧

2023-11-30 08:32:31

OpenFeign工具

2025-03-17 00:45:00

JavaScriptAPI頁(yè)面

2024-10-21 17:46:54

前端開(kāi)發(fā)

2018-09-02 15:43:56

Python代碼編程語(yǔ)言

2024-05-20 09:27:00

Web 開(kāi)發(fā)CSS

2023-12-21 14:40:09

Python編程語(yǔ)言

2009-04-14 21:38:05

LinuxUbuntu技巧

2023-07-07 14:47:46

JavaScript技巧

2011-02-14 16:11:44

2020-08-11 11:20:49

Linux命令使用技巧

2024-03-04 00:00:00

Kubernetes技巧API

2017-03-02 14:05:42

AndroidAndroid Stu調(diào)試技巧

2015-08-13 09:03:14

調(diào)試技巧

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2018-09-20 17:05:01

前端程序員JavaScript

2023-09-08 08:23:29

Servlet程序MVC

2021-08-30 07:49:33

索引ICP Mysql

2020-06-22 08:09:22

GitHub工具開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)