最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JAVA高質量代碼之數組與集合

 更新時間:2013年08月26日 15:39:23   作者:  
  在學習編程的過程中,我覺得不止要獲得課本的知識,更多的是通過學習技術知識提高解決問題的能力,這樣我們才能走在最前方,本文主要講述Java高質量代碼之數組與集合

  1.性能考慮,優(yōu)先選擇數組

  數組在項目開發(fā)當中使用的頻率是越來越少,特別是在業(yè)務為主的開發(fā)當中,首先數組沒有List,Set等集合提供的諸多方法,查找增加算法都要自己編寫,極其繁瑣麻煩,但由于List,Set等集合使用泛型支持后,存放的都為包裝類,而數組是可以使用基本數據類型,而使用基本數據類型的執(zhí)行運算速度要比包裝類型快得多,而且集合類的底層也是通過數組進行實現(xiàn).

  2.若有必要,使用變長數組

  在學習集合類當中,很多人喜歡將數組的定長拿來和集合類型的自變長來做比較,但其實這種比較并不合適,通過觀察集合類例如ArrayList的實現(xiàn)其實可以看出,所謂的集合變長,其實只是用婉轉的方式對原數組進行了擴容

  

復制代碼 代碼如下:

  public static T[] expandCapacity(T[] data, int newLength) {

  // 判斷是否為負值

  newLength = newLength < 0 ? 0 : newLength;

  // 生成新數組,拷貝原值并制定長度

  return Arrays.copyOf(data, newLength);

  }
 


  當性能要求高的時候,可以考慮使用對數組進行封裝使用,數組長度不變不是我們不使用它們的借口

  3.警惕數組的淺拷貝

  數組的淺拷貝在Java編程中亦是基礎中的基礎,淺拷貝是在為數組拷貝時,基本類型拷貝的是值,而引用類型拷貝的是引用地址,在上面的例子當中,拷貝數組使用的Arrays.copyOf為淺拷貝,在使用時需要注意

  4.在明確的場景下,為集合指定初始容量

  在我們平常的使用當中,因為集合類型是自動變長的,所以基本創(chuàng)建對象時不會為集合類附上初始值,就拿我們最常用的ArrayList來說明,我們首先要知道,當集合容量到達臨界點時,會將底層的數組進行copyOf的操作,生成新的數組,而新的數組容量為舊數組的1.5倍,而默認數組長度為10,當我們明確知道要放置入容器中的數據數量較多時,應該指明初始值,避免多次使用copyOf造成的性能開銷

  5.選擇合適的最值算法

  對數據進行最大值或最小值的查找,這是數據結構最基本的知識,在Java當中我們亦有很多種的方式進行實現(xiàn),以下列舉2種算法

  

復制代碼 代碼如下:

  public static int getMaxByArray(int[] data) {

  // 最簡單自行實現(xiàn)的查找方式

  int max = data[0];

  for (int i = 1, size = data.length; i < size; i++) {

  max = max < i ? i : max;

  }

  return max;

  }


復制代碼 代碼如下:

  public static int getMaxByArray(int[] data) {

  // 先排序后獲取最后位

  Arrays.sort(data);

  return data[data.length - 1];

  }


  6.基本類型數組轉換陷阱!

  請觀察以下代碼

復制代碼 代碼如下:

  public static void main(String[] args) {

  int[] nums = new int[] { 1, 2, 3, 4, 5 };

  List list = Arrays.asList(nums);

  System.out.println(list.size());

  // 此時輸出的size為1

  }


  我們期望的結果是將數組中的元素通過Arrays.asList轉換到集合類當中,但事與愿違,我們只將數組本身增加了進入,并沒有將數組內的值分拆分開來,此時若然對集合List增加了泛型就會在編譯期間給出錯誤的提示,或將數組本身改變成Integer就可以解決問題

  7.asList方法產生的List對象不可更改

  通過上面的例子,我們可以看到使用Arrays.asList方法可以將一個數組轉換成一個List,那通過asList方法返回的List有什么特別呢?注意,這個返回的List是不支持更改的,原因是因為asList方法返回的,并不是java.util.ArrayList,而是Arrays工具類中的一個靜態(tài)私有內部類,雖然都有實現(xiàn)和ArrayList一樣的父類AbstractList,但在復寫add等方法時,卻是拋出了UnsupportedOperationException,這個靜態(tài)私有內部類只實現(xiàn)了size,toArray,get,contains這幾個方法

  8.對不同的數據結構使用不同的遍歷方式

  請觀看以下代碼

復制代碼 代碼如下:

  public static void main(String[] args) {

  // 以下為ArrayList集合的遍歷方式

  int num = 80 * 10000;

  List arrayList = new ArrayList(num);

  for (int i = 0, size = arrayList.size(); i < size; i++) {

  arrayList.get(i);

  }

  // 以下為LinkedList集合的遍歷方式

  List linkedList = new LinkedList();

  for (Integer integer : linkedList) {

  }

  }


  為什么對LinkedList和ArrayList要選擇不同的遍歷方式?

  1.因為ArrayList實現(xiàn)了RamdomAccess接口(隨機存取接口),RamdomAccess接口和Serializable,Cloneable接口一樣是Java中的標示接口,代表這個這個類可以隨機存取,對ArrayList來說就標志著,數據之間沒有關聯(lián),即相鄰的兩個位置沒有互相依賴的關系,可以隨機訪問,

  2.Java中的foreach語法是iterator(迭代器)的變形用法,我們知道迭代器是23種設計模式的一種,但迭代器是需要知道兩個元素時間的關系的,不然怎么提供hasNext的支持呢?就是因為上一個元素要判斷下一個元素是否存在,強行建立了這種關系,違背了ArrayList隨機存取的特別

  3.在LinkedList中,因為是通過雙向鏈表的形式來存儲,所以對迭代器的支持非常好,因為LinkedList相鄰的兩個元素本來就存在關系所以在對LinkedList和ArrayList要采取不同的遍歷方式,讀者若然有興趣可以嘗試一下對LinkedList采用下標的形式訪問,會發(fā)現(xiàn)兩者的效率有較大的差距

  8.適時選擇ArrayList或LinkedList

  ArrayList和LinkedList的主要區(qū)別:

  1.ArrayList底層的數據結構為數組,而LinkedList底層結構為雙向鏈表

  2.在插入數據時,由于ArrayList每次插入后都需要將數組元素向后順延位置,而LinkedList只需要更改頭節(jié)點和尾節(jié)點即可完成插入操作,所以在插入操作較為頻繁時,優(yōu)先使用LinkedList

  3.在刪除數據時,由于ArrayList要保持數組的有序性,當刪除后元素要亦需要向后或向前移位,而LinkedList照舊還是更改頭尾節(jié)點.

  4.在更新時,由于LinkedList會使用折半遍歷的方式進行查找定位元素再進行更新,對比起ArrayList的直接定位下標元素替換,ArrayList對更新的效率更佳

  5.LinkedList可以模擬隊列,通過LinkedList的addFirst,addLast等操作

  9.列表相等只需關心元素數據

  Java為了我們可以安心的面向List,Set,Map等接口進行編程,因此對集合類中的equlas進行了復寫,讓我們在比較兩個集合是否相等時,只需要比較元素數據是否相等即可,避免了因為替換集合實現(xiàn)類造成的錯誤Java代碼

復制代碼 代碼如下:

  public static void main(String[] args) {

  List arrayList = new ArrayList();

  arrayList.add(1);

  arrayList.add(2);

  List linkedList = new LinkedList();

  linkedList.add(1);

  linkedList.add(2);

  System.out.println(arrayList.equals(linkedList));

  // 不用關心具體實現(xiàn),輸出為true

  }

相關文章

  • Springboot 2.x集成kafka 2.2.0的示例代碼

    Springboot 2.x集成kafka 2.2.0的示例代碼

    kafka近幾年更新非??欤部梢钥闯鰇afka在企業(yè)中是用的頻率越來越高。本文主要為大家介紹了Springboot 2.x集成kafka 2.2.0的示例代碼,需要的可以參考一下
    2022-04-04
  • java Jersey框架初體驗

    java Jersey框架初體驗

    本篇主要是Jersey體驗,你將在不做任何編碼的情況下,體驗Jersey框架的神氣魅力!本文還假定你在eclipse里安裝了Maven插件
    2016-07-07
  • jconsole使用介紹(圖文)

    jconsole使用介紹(圖文)

    大家在學習java的時候,難免會對jvm進行一些深入的了解。推薦大家使用jdk下面的jconsole.exe來輔助理解jvm的一些概念
    2015-12-12
  • Mybatis-Plus中的查詢指定字段

    Mybatis-Plus中的查詢指定字段

    在使用Mybatis-Plus進行數據查詢時,可以通過指定字段來優(yōu)化查詢效率,方法一和方法二分別執(zhí)行不同的SQL語句,其中方法二在執(zhí)行時通常會更高效,因為它可能通過減少數據處理量和優(yōu)化查詢結構來提升性能,比較兩種方法的SQL執(zhí)行情況
    2024-09-09
  • Java多線程中的Balking模式詳解

    Java多線程中的Balking模式詳解

    大家好,本篇文章主要講的是Java多線程中的Balking模式詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Java實現(xiàn)儲存對象并按對象某屬性排序的幾種方法示例

    Java實現(xiàn)儲存對象并按對象某屬性排序的幾種方法示例

    這篇文章主要介紹了Java實現(xiàn)儲存對象并按對象某屬性排序的幾種方法,結合實例形式詳細分析了Java儲存對象并按對象某屬性排序的具體實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • 微信小程序與Java后端接口交互

    微信小程序與Java后端接口交互

    本文主要介紹了微信小程序與Java后端接口交互,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導入Idea

    教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導入Idea

    這篇文章主要介紹了教你如何把Eclipse創(chuàng)建的Web項目(非Maven)導入Idea,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 解決Spring使用@MapperScan問題

    解決Spring使用@MapperScan問題

    這篇文章主要介紹了解決Spring使用@MapperScan問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中策略設計模式的實現(xiàn)及應用場景

    Java中策略設計模式的實現(xiàn)及應用場景

    策略設計模式是Java中一種常用的設計模式,它通過定義一系列算法并將其封裝成獨立的策略類,從而使得算法可以在不影響客戶端的情況下隨時切換。策略設計模式主要應用于系統(tǒng)中存在多種相似的算法、需要靈活調整算法邏輯或者需要擴展新的算法等場景
    2023-04-04

最新評論

辛集市| 商丘市| 芦溪县| 大同市| 江都市| 即墨市| 崇义县| 宁阳县| 宝丰县| 滕州市| 沭阳县| 塘沽区| 米脂县| 留坝县| 昭平县| 连城县| 中西区| 盘锦市| 越西县| 兴化市| 南丹县| 鞍山市| 汕尾市| 天祝| 大冶市| 兴和县| 邛崃市| 乌苏市| 沂南县| 沈丘县| 峨眉山市| 岑巩县| 新乡县| 普安县| 汉沽区| 荆州市| 武功县| 邹城市| 高碑店市| 彝良县| 天祝|