国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java編程中忽略這些細節(jié),Bug肯定找上你

開發(fā) 后端
在Java語言的日常編程中,也存在著容易被忽略的細節(jié),這些細節(jié)可能會導致程序出現各種Bug。

 [[436028]]

Java語言構建的各類應用程序,在人類的日常生活中占用非常重要的地位,各大IT廠商幾乎都會使用它來構建自己的產品,為客戶提供服務。作為一個企業(yè)級應用開發(fā)語言,穩(wěn)定和高效的運行,至關重要。在Java語言的日常編程中,也存在著容易被忽略的細節(jié),這些細節(jié)可能會導致程序出現各種Bug,下面就對這些細節(jié)進行一些總結:

1 相等判斷中的==和equals

在很多場景中,我們都需要判斷兩個對象是否相等,一般來說,判定兩個對象的是否相等,都是依據其值是否相等,如兩個字符串a和b的值都為"java",則我們認為二者相等。在Java中,有兩個操作可以判斷是否相當,即==和equals,但二者是有區(qū)別的,不可混用。下面給出示例:

 

  1. String a = "java"
  2. String b = new String("java"); 
  3. System.out.println(a == b);//false 
  4. System.out.println(a.equals(b));//true 

 

字符串a和b的字面值都為"java",用a == b判斷則輸出false,即不相等,而a.equals(b)則輸出true,即相等。這是為什么呢?在Java中,String是一個不可變的類型,一般來說,如果兩個String的值相等,默認情況下,會指定同一個內存地址,但這里字符串String b用new String方法強制生成一個新的String對象,因此,二者內存地址不一致。由于 == 需要判斷對象的內存地址是否一致,因此返回false,而equals默認(override后可能不一定)是根據字面值來判斷,即相等。

下面再給出一個示例:

 

  1. //integer -128 to 127 
  2. Integer i1 = 100; 
  3. Integer i2 = 100; 
  4. System.out.println(i1 == i2);//true 
  5. i1 = 300; 
  6. i2 = 300; 
  7. System.out.println(i1 == i2);//false 
  8. System.out.println(i1.equals(i2));//true 

 

這是由于Java中的Integer數值的范圍為-128到127,因此在這范圍內的對象的內存地址是一致的,而超過這個范圍的數值對象的內存地址是不一致的,因此300這個數值在 == 比較下,返回false,但在equals比較下返回true。

2 switch語句中丟失了break

在很多場景中,我們需要根據輸入參數的范圍來分別進行處理,這里除了可以使用if ... else ...語句外,還可以使用switch語句。在switch語句中,會羅列出多個分支條件,并進行分別處理,但如果稍有不注意,就可能丟失關鍵字break語句,從而出現預期外的值。下面給出示例:

 

  1. //缺少break關鍵字 
  2.  public static void switchBugs(int v ) { 
  3.        switch (v) { 
  4.             case 0: 
  5.                 System.out.println("0"); 
  6.                 //break 
  7.             case 1: 
  8.                 System.out.println("1"); 
  9.                 break; 
  10.             case 2: 
  11.                 System.out.println("2"); 
  12.                 break; 
  13.             default
  14.                 System.out.println("other"); 
  15.        } 

 

如果我們使用如下語句進行調用:

 

  1. switchBugs(0); 

則我們預期返回"0",但是卻返回"0" "1"。這是由于case 0 分支下缺少break關鍵字,則雖然程序匹配了此分支,但是卻能穿透到下一個分支,即case 1分支,然后遇到break后返回值。

3 大量的垃圾回收,效率低下

字符串的拼接操作,是非常高頻的操作,但是如果涉及的拼接量很大,則如果直接用 + 符號進行字符串拼接,則效率非常低下,程序運行的速度很慢。下面給出示例:

 

  1. private static void stringWhile(){ 
  2.     //獲取開始時間 
  3.     long start = System.currentTimeMillis(); 
  4.     String strV = ""
  5.     for (int i = 0; i < 100000; i++) { 
  6.         strV = strV + "$"
  7.     } 
  8.     //strings are immutable. So, on each iteration a new string is created. 
  9.     // To address this we should use a mutable StringBuilder: 
  10.     System.out.println(strV.length()); 
  11.     long end = System.currentTimeMillis(); //獲取結束時間 
  12.     System.out.println("程序運行時間: "+(end-start)+"ms"); 
  13.     start = System.currentTimeMillis(); 
  14.     StringBuilder sb = new StringBuilder(); 
  15.     for (int i = 0; i < 100000; i++) { 
  16.         sb.append("$"); 
  17.     } 
  18.     System.out.println(strV.length()); 
  19.     end = System.currentTimeMillis(); 
  20.     System.out.println("程序運行時間: "+(end-start)+"ms"); 

 

上述示例分別在循環(huán)體中用 + 和 StringBuilder進行字符串拼接,并統計了運行的時間(毫秒),下面給出模擬電腦上的運行結果:

 

  1. //+ 操作 
  2. 100000 
  3. 程序運行時間: 6078ms 
  4. StringBuilder操作 
  5. 100000 
  6. 程序運行時間: 2ms 

 

由此可見,使用StringBuilder構建字符串速度相比于 + 拼接,效率上高出太多。究其原因,就是因為Java語言中的字符串類型是不可變的,因此 + 操作后會創(chuàng)建一個新的字符串,這樣會涉及到大量的對象創(chuàng)建工作,也涉及到垃圾回收機制的介入,因此非常耗時。

4 循環(huán)時刪除元素

有些情況下,我們需要從一個集合對象中刪除掉特定的元素,如從一個編程語言列表中刪除java語言,則就會涉及到此種場景,但是如果處理不當,則會拋出

ConcurrentModificationException異常。下面給出示例:

 

  1. private static void removeList() { 
  2.     List<String> lists = new ArrayList<>(); 
  3.     lists.add("java"); 
  4.     lists.add("csharp"); 
  5.     lists.add("fsharp"); 
  6.     for (String item : lists) { 
  7.         if (item.contains("java")) { 
  8.             lists.remove(item); 
  9.         } 
  10.     } 

 

運行上述方法,會拋出錯誤,此時可以用如下方法進行解決,即用迭代器iterator,具體如下所示:

 

  1. private static void removeListOk() { 
  2.     List<String> lists = new ArrayList<>(); 
  3.     lists.add("java"); 
  4.     lists.add("csharp"); 
  5.     lists.add("fsharp"); 
  6.     Iterator<String> hatIterator = lists.iterator(); 
  7.     while (hatIterator.hasNext()) { 
  8.         String item = hatIterator.next(); 
  9.         if (item.contains("java")) { 
  10.             hatIterator.remove(); 
  11.         } 
  12.     } 
  13.     System.out.println(lists);//[csharp, fsharp] 

 

5 null引用

在方法中,首先應該對參數的合法性進行驗證,第一需要驗證參數是否為null,然后再判斷參數是否是預期范圍的值。如果不首先進行null判斷,直接進行參數的比較或者方法的調用,則可能出現null引用的異常。下面給出示例:

 

  1. private static void nullref(String words)  { 
  2.     //NullPointerException 
  3.     if (words.equals("java")){ 
  4.         System.out.println("java"); 
  5.     }else
  6.         System.out.println("not java"); 
  7.     } 

 

如果此時我們用如下方法進行調用,則拋出異常:

 

  1. nullref(null

這是由于假設了words不為null,則可以調用String對象的equals方法。下面可以稍微進行一些修改,如下所示:

 

  1. private static void nullref2(String words)  { 
  2.     if ("java".equals(words)){ 
  3.         System.out.println("java"); 
  4.     }else
  5.         System.out.println("not java"); 
  6.     } 

 

則此時執(zhí)行則可以正確運行:

 

  1. nullref2(null

6 hashCode對equals的影響

前面提到,equals方法可以從字面值上來判斷兩個對象是否相等。一般來說,如果兩個對象相等,則其hash code相等,但是如果hash code相等,則兩個對象可能相等,也可能不相等。這是由于Object的equals方法和hashCode方法可以被Override。下面給出示例:

 

  1. package com.jyd; 
  2. import java.util.Objects; 
  3. public class MySchool { 
  4.     private String name
  5.     MySchool(String name) { 
  6.         this.name = name
  7.     } 
  8.     @Override 
  9.     public boolean equals(Object o) { 
  10.         if (this == o) { 
  11.             return true
  12.         } 
  13.         if (o == null || getClass() != o.getClass()) { 
  14.             return false
  15.         } 
  16.         MySchool _obj = (MySchool) o; 
  17.         return Objects.equals(name, _obj.name); 
  18.     } 
  19.     @Override 
  20.     public int hashCode() { 
  21.         int code = this.name.hashCode(); 
  22.         System.out.println(code); 
  23.         //return code; //true 
  24.         //隨機數 
  25.         return (int) (Math.random() * 1000);//false 
  26.  
  27.     } 
  28. Set<MySchool> mysets = new HashSet<>(); 
  29. mysets.add(new MySchool("CUMT")); 
  30. MySchool obj = new MySchool("CUMT"); 
  31. System.out.println(mysets.contains(obj)); 

 

執(zhí)行上述代碼,由于hashCode方法被Override,每次返回隨機的hash Code值,則意味著兩個對象的hash code不一致,那么equals判斷則返回false,雖然二者的字面值都為"CUMT"。

7 內存泄漏

我們知道,計算機的內存是有限的,如果Java創(chuàng)建的對象一直不能進行釋放,則新創(chuàng)建的對象會不斷占用剩余的內存空間,最終導致內存空間不足,拋出內存溢出的異常。內存異常基本的單元測試不容易發(fā)現,往往都是上線運行一定時間后才發(fā)現的。下面給出示例:

 

  1. package com.jyd; 
  2.  
  3. import java.util.Properties; 
  4. //內存泄漏模擬 
  5. public class MemoryLeakDemo { 
  6.     public final String key
  7.     public MemoryLeakDemo(String key) { 
  8.         this.key =key
  9.     } 
  10.     public static void main(String args[]) { 
  11.         try { 
  12.             Properties properties = System.getProperties(); 
  13.             for(;;) { 
  14.                 properties.put(new MemoryLeakDemo("key"), "value"); 
  15.             } 
  16.         } catch(Exception e) { 
  17.             e.printStackTrace(); 
  18.         } 
  19.     } 
  20.  
  21.     /* 
  22.     @Override 
  23.     public boolean equals(Object o) { 
  24.         if (this == o) return true
  25.         if (o == null || getClass() != o.getClass()) return false
  26.         MemoryLeakDemo that = (MemoryLeakDemo) o; 
  27.         return Objects.equals(key, that.key); 
  28.     } 
  29.  
  30.     @Override 
  31.     public int hashCode() { 
  32.         return Objects.hash(key); 
  33.     } 
  34.     */ 
  35.  

 

此示例中,有一個for無限循環(huán),它會一直創(chuàng)建一個對象,并添加到properties容器中,如果MemoryLeakDemo類未給出自己的equals方法和hashCode方法,那么這個對象會被一直添加到properties容器中,最終內存泄漏。但是如果定義了自己的equals方法和hashCode方法(被注釋的部分),那么新創(chuàng)建的MemoryLeakDemo實例,由于key值一致,則判定為已存在,則不會重復添加,此時則不會出現內存溢出。

責任編輯:華軒 來源: 今日頭條
相關推薦

2011-06-10 13:57:00

SEO

2023-11-15 08:22:42

Java開發(fā)小技巧

2018-09-02 15:43:56

Python代碼編程語言

2023-01-28 09:38:48

接口SpringMVC

2020-10-14 14:44:51

iPhone 12蘋果iPhone

2023-09-08 08:23:29

Servlet程序MVC

2020-12-17 08:56:51

單例模式JVM

2023-01-16 08:09:51

SpringMVC句柄

2016-05-10 10:49:28

瀏覽網絡方法

2018-10-30 10:53:42

路由器無線網絡無線路由器

2023-05-10 07:42:26

Java多線程編程

2018-08-01 14:45:16

PHP編程語言

2018-04-04 08:47:16

數據中心基礎設施

2015-07-03 11:20:41

編程學習方法

2011-07-19 09:20:00

程序員編程

2017-09-15 13:52:36

iPhone

2023-09-08 07:23:52

2021-01-07 05:40:13

BLE模塊Android

2020-09-29 10:15:54

開發(fā)技能Kubernetes

2017-01-15 01:12:40

碼農簡歷專業(yè)名詞
點贊
收藏

51CTO技術棧公眾號

一区二区三区视频免费| 精品视频在线观看免费观看| 欧美美女直播网站| 国产丝袜精品丝袜| 日韩av成人在线观看| 老鸭窝亚洲一区二区三区| 欧美日韩亚洲第一| 欧美午夜无遮挡| 色综合视频一区二区三区日韩| 欧美极品第一页| 亚洲а∨精品天堂在线| 亚洲成人国产精品| 精品72久久久久中文字幕| 一区二区三区四区| 午夜国产精品一区| 精品裸体bbb| 狠狠色狠狠色综合人人| 日本一区二区高清| 都市激情亚洲一区| 国产精品美女黄网| 亚洲精品ww久久久久久p站| 欧美日韩一区二区三区免费| 欧美国产欧美综合| 欧美国产大片| 国产精品久久精品国产 | 久草精品在线观看| 在线黄色.com| 欧美第一淫aaasss性| 青青草成人在线观看| 在线视频中文字幕| 久久久久久久久久国产| 美女mm1313爽爽久久久蜜臀| 麻豆影视在线| 国产激情综合五月久久| 久久九九99视频| 日韩精品影院| 九九热久久66| 在线免费视频一区二区| 精品免费一区二区| 999www成人| 久久精品视频亚洲| 丁香婷婷综合色啪| 女厕盗摄一区二区三区| 免费av在线一区二区| 欧美性猛交xxxx免费看| 色综合综合网| 97国产视频| 91精品国产91久久| 中文av一区二区| 视频国产精品| 波多野结衣家庭教师视频| 国产亚洲激情在线| 韩国v欧美v日本v亚洲v| 啊啊啊久久久| 在线视频福利一区| 精品视频一区在线视频| 另类专区欧美蜜桃臀第一页| 日本高清成人vr专区| 日本一区免费在线观看| 91精品国产一区二区三区蜜臀 | 国产成人一二三区| 亚洲女同性videos| 国产高清不卡一区| 四虎在线精品| 国产视频一区二区视频| 欧美www在线| 99久久精品国产网站| 综合欧美精品| 日韩欧美黄色大片| 1769国产精品| 亚洲观看高清完整版在线观看| 精品理论电影| 免费在线性爱视频| 精品久久久久久一区二区里番| 在线综合亚洲欧美在线视频| 欧美亚洲自偷自偷| 国产啊啊啊视频在线观看| 国产日韩视频在线播放| 亚洲性生活视频| 久久久亚洲高清| 日韩成人一级| 日韩欧美在线番号| 日韩av电影免费在线| 日韩精品免费电影| 久久综合狠狠综合| 精品少妇av| 天天综合视频在线观看| 先锋影音一区二区三区| 色噜噜久久综合伊人一本| 中文字幕国产一区| 97精品97| 日韩免费视频在线观看| 久久精品这里热有精品| 成人在线丰满少妇av| 九色视频网站在线观看| 日本电影一区二区三区| 伊人久久大香线蕉av一区二区| 久久久久久综合| 91嫩草亚洲精品| 亚洲区欧洲区| 国产精品又粗又长| 日韩av电影免费观看高清| 免费一级片91| 色噜噜成人av在线| 成人做爰高清视频网站| 国产精品露出视频| 亚洲欧美日韩一区在线| 亚洲欧洲美洲综合色网| 在线观看国产精品入口| 美女一区网站| 米奇.777.com| 性欧美.com| 91国在线精品国内播放| 777久久久精品| 国产色产综合色产在线视频| 一本一道久久综合狠狠老| gay欧美网站| 精品一二三四| 中国女人做爰视频| 国产成人高清激情视频在线观看 | 欧美黄污视频| 忘忧草在线日韩www影院| 午夜免费看视频| 国产一区二区精品在线| 日韩视频在线观看免费| 在线亚洲免费视频| 久久先锋资源网| 国产手机视频一区二区| 亚洲成人影音| 男女羞羞视频在线观看| 婷婷福利视频导航| 国产精品一区在线免费观看| 国产精品中文久久久久久久| 亚洲天堂2020| 欧美视频一区二区三区| 久久精品亚洲一区二区三区浴池| 999亚洲国产精| 久久久免费毛片| 另类激情视频| www黄在线观看| 拍拍拍999自拍偷| 国产日本欧美在线| 亚洲最大的网站| 久久人人97超碰精品888 | 日韩黄色网络| av成人 com a| 国产日本在线| 国产理论片免费观看| 91动漫在线看| 日本在线免费观看一区| 成人a在线观看| 欧美精品videos性欧美| 精品视频在线播放| 欧美日本视频在线| 亚洲国产aⅴ天堂久久| 久久夜色精品国产噜噜av| 久热成人在线视频| 一区二区三区福利| 久久精品久久久| 黄色免费大全亚洲| 黄色成人小视频| 欧美办公室脚交xxxx| 欧美性天天影视| 最近最新中文字幕在线| jizzjizzjizz亚洲女| 18岁网站在线观看| 国产一级黄色录像片| 日韩精品久久久| 久久精品一区二区三区不卡免费视频 | 精品无人码麻豆乱码1区2区 | 国产欧美日韩小视频| 天天久久人人| 国产九色精品| 成人免费淫片aa视频免费| 久久久久久久色| 欧美精品一区三区| 日韩中文字幕视频在线观看| 亚洲大尺度美女在线| 日韩视频中午一区| 91超碰这里只有精品国产| 在线看日韩精品电影| 日本韩国欧美三级| 欧美性xxxxhd| 疯狂欧美牲乱大交777| 亚洲一区二区四区蜜桃| 亚洲免费在线视频| 亚洲人吸女人奶水| 自拍av一区二区三区| 自拍偷自拍亚洲精品播放| 亚洲国产精品ⅴa在线观看| 久久影院电视剧免费观看| av一二三不卡影片| 成人免费毛片片v| www.在线成人| 91社区在线播放| 国产日韩欧美电影| 亚洲免费观看高清完整版在线观看熊 | 国产精品视频免费观看www| 国产精品扒开腿做爽爽爽男男 | 精品国产乱码一区二区三区|