Java 數組和集合

〇、Java 基本類型。

今天一個同學問我,Java 基本類型 int 類型是 4 個字節 ? char 呢 ?

Java 有兩大基本類型:基本數據類型和引用數據類型

  • 基本數據類型(8 種,四整兩浮一符一布):默認的整型是 int ,默認的浮點型是 double。
    對於數值類型的基本類型的取值範圍,我們無需強制去記憶,因爲它們的值都已經以常量的形式定義在對應的包裝類中了。
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 引用數據類型(除去上述基本類型的包裝類以外,還有由類的構造函數創建,可以使用它們訪問所引用的對象。):對象、數組都是引用數據類型,引用數據類型的默認值都是 null 。

需要注意緩存。

  • Boolean(全部緩存)
  • Byte(全部緩存)
  • Integer(-128 — 127 緩存)
  • Short(-128 — 127 緩存)
  • Long(-128 — 127 緩存)
  • Character(<= 127緩存)
  • Float(沒有緩存)
  • Doulbe(沒有緩存)

一、Java 數組

Java 語言中提供的數組是用來存儲固定大小的同類型元素。
Java語言使用new操作符來創建數組,語法如下:(詳細內容請查看菜鳥教程

arrayRefVar = new dataType[arraySize];
上面語句做了兩件事:1、使用 dataType[arraySize] 創建了一個數組。
          2、把新創建的數組的引用賦值給變量 arrayRefVar。

  1. 創建和聲明同時 :dataType[] arrayRefVar = new dataType[arraySize];
  2. 聲明時,直接填充內容:dataType[] arrayRefVar = {value0, value1, ..., valuek};

數組轉集合( Arrays.asList(array) ),集合轉數組( list.toArray() )。

  1. 數組轉集合使用 Arrays 的 asList 方法,它將數組轉化成一個List,可以用這個 List 構造Set。Set set = new HashSet(Arrays.asList(array));
  2. 集合轉數組使用 toArray 方法,可以通過強轉來得到目標數組。
    array2 = (String[]) set.toArray(new String[set.size()]); ( 將 list 中的內容放入參數數組中,當參數數組的長度小於 list 的元素個數時,會自動擴充數組的長度以適應 list 的長度,這條語句直接使用了集合的長度 )

需要注意的問題。

  1. asList() 原始類型不能作爲 Arrays.asList 方法的參數,否則會被當做一個參數。
    查看源碼:T 作爲泛型的參數,而基本類型是不能夠作爲泛型參數的。
int[] list = {1,2,3,4};
List list = Arrays.asList(list);
System.out.println(list.size()); 	 // 編輯器把 int[] 數組當做了一個引用的參數對象,輸出值 1
  1. Arrays.asList(list) 返回的 ArrayList 是 Arrays 的靜態內部私有類實現,繼承了 AbstractList ,屬於不可變結構,不是常用的那個 ArrayList ,只實現了size 、toArray、get、set、contains幾個方法,具體請看源碼【Ctrl + 點擊方法名】。
    下圖中,不可變結構的 Arrays 的 ArrayList 通過構造放入真正的 ArrayList,就可以正常使用了。
    在這裏插入圖片描述
    在這裏插入圖片描述
  2. 集合的相等只在乎元素數據的比較,其中 equals 方法都是 AbstractList 中實現的,比較的依據是通過迭代器遍歷元素挨個 equals 比較。
    在這裏插入圖片描述

二、Java 集合

集合按照存儲結構可以分爲,單列集合 Collection 和 雙列集合 Map 。

  1. Collection :單列集合類的根接口,用於存儲一系列符合某種規則的元素。重要的兩個子類 List 和 Set 。List 是有序可重複,接口主要實現類 ArrayList 和 LinkedList 。Set 是無序不能重複,接口主要實現類有 HashSet 和 TreeSet 。
  2. Map :雙列集合類的根接口,用於存儲具有鍵值(Key-Value)映射關係的元素。可以通過指定的 Key 找到對應的 Value 。Map 的主要實現類有 HashMap 和 TreeMap 。

在這裏插入圖片描述

①、List 是有序可重複,接口主要實現類 ArrayList 和 LinkedList

ArrayList 集合

  1. Array 與 ArrayList 的區別。
    ①、Array 可以包含基本類型和對象類型,ArrayList 只能包含對象類型。
    ②、Array 的大小是固定的,ArrayList 的大小是動態變化的,ArrayList 提供了更多的方法和特性,addAll()、removeAll()、iterator() 等方法。

LinkedList 集合

集合內部維護了一個雙向循環鏈表,鏈表元素都使用引用的方式來記住它的前一個元素和後一個元素,從而將所有元素連接起來。

  1. 最基本的使用。
    在這裏插入圖片描述

ArrayList 和 LinkedList 的區別。

主要區別:

  1. ArrayList 是實現了基於動態數組的數據結構,ArrayList 集合在查詢元素的時候速度很快,但在增刪元素時效率較低。因爲 LinkedList 要移動指針。
  2. LinkedList 基於鏈表的數據結構,對於新增和刪除操作 add 和 remove,LinedList 比較佔優勢,因爲 ArrayList 要移動數據,而 linkedList 只需要改變引用的前後關係。

Iterator 接口(迭代器)

Iterator 主要用於迭代訪問(即遍歷)Collection 中的元素。

  1. Collection 集合遍歷
    在這裏插入圖片描述
  2. Map 集合遍歷
    在這裏插入圖片描述

②、Set 是無序不能重複,接口主要實現類有 HashSet 和 TreeSet

HashSet 集合

爲保證 HashSet 正常操作,要求在存入對象時,重寫 Object 類中的 hashCode() 和 equals() 方法。

  1. add("Json") ,會先調用對象的 hashCode() 方法獲取哈希值,通過哈希值確定存儲地址,地址沒對象直接存入,地址有對象則進行 equals() 方法進行判斷,相等則捨棄,不等則覆蓋。在使用自定義對象的時候,一定要注意重寫 hashCode() 與 equals() .
    在這裏插入圖片描述

TreeSet 集合

③、Map 的實現類有 HashTable、HashMap 和 TreeMap

HashTable 集合

HashMap 集合

  1. 遍歷集合的兩種方式。
// 第一種:先遍歷 Map 集合中的所有鍵,再根據鍵獲取相應的值
Set keys = map.keySet(); 		// 獲取鍵的集合
Iterator it = keys.iterators();		// 迭代鍵值
it.hasNext();		// 判斷下一個元素是否有內容
it.next();		// 獲取值
map.get(key);		// 通過 key  獲取 values 。
// 第二種:通過 values() 方法直接獲取 Map 集合的所有值的 Collection 集合。
Collection values = map.values();	// 獲取 map 存儲的所有值。

TreeMap 集合

  1. TreeMap 的紅黑樹。

紅黑樹就是節點是紅色或者黑色的平衡二叉樹,它通過顏色的約束來維持着二叉樹的平衡。對於一棵有效的紅黑樹二叉樹而言我們必須增加如下規則:
1、每個節點都只能是紅色或者黑色
2、根節點是黑色
3、每個葉節點(NIL節點,空節點)是黑色的。
4、如果一個結點是紅的,則它兩個子節點都是黑的。也就是說在一條路徑上不能出現相鄰的兩個紅色結點。
5、從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

Properties 集合

  1. Java 讀取 Properties 文件(注意文件路徑)。
    在這裏插入圖片描述

叄、Collections 集合工具類。

Collections 則是集合類的一個工具類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各種操作。

  1. 對集合進行排序。Collections.sort(Collection);
    在這裏插入圖片描述
  2. 進行隨機排序。Collections.shuffle(Collection);
    在這裏插入圖片描述
  3. 返回所查找元素的索引。Collections.binarySearch(Collection,Object);

這裏我採用了兩種情況進行測試,已知存在和不存在的部分,但是出現如圖所示的問題,查找存在和不存在的字符串都是 負數(表示不存在的意思。)
在這裏插入圖片描述
原因:Collections 的 binarySearch 方法的查找功能,但是要是用二分查找的 List 必須是有序的,也就是使用 Collections 中的 sort 方法進行自然排序。
在這裏插入圖片描述
補充內容:-1 不是判斷不存在的唯一標準,Java 編程技巧 2019.05.19 第5條

  1. 替換批定元素爲某元素,若要替換的值存在剛返回true,反之返回false。Collections.replaceAll(List list,Object old,Object new);
  2. 反轉集合中元素的順序。Collections.reverse() ;
    在這裏插入圖片描述
  3. 集合中的元素向後移m個位置,在後面被遮蓋的元素循環到前面來。Collections.rotate(List list,int m)
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 集合 n 中的元素全部複製到 m 中,並且覆蓋相應索引的元素。Collections.copy(List m,List n);
  5. 交換集合中指定元素索引的位置。Collections.swap(List list,int i,int j);
    在這裏插入圖片描述
  6. 用對象 o 替換集合 list 中的所有元素Collections.fill(List list,Object o);
  7. 返回大小爲 n 的 List,List 不可改變,其中的所有引用都指向 o。Collections.nCopies(int n,Object o);
  8. 返回集合中的最大最小值。max();、min();
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章