您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java集合類有什么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java集合類有什么用”這篇文章吧。
集合類是Java數據結構的實現。Java的集合類是java.util包中的重要內容,它允許以各種方式將元素分組,并定義了各種使這些元素更容易操作的方法。Java集合類是Java將一些基本的和使用頻率極高的基礎類進行封裝和增強后再以一個類的形式提供。集合類是可以往里面保存多個對象的類,存放的是對象,不同的集合類有不同的功能和特點,適合不同的場合,用以解決一些實際問題。
集合類簡述:
集合類是用來存放某類對象的。集合類有一個共同特點,就是它們只容納對象(實際上是對象名,即指向地址的指針)。這一點和數組不同,數組可以容納對象和簡單數據。如果在集合類中既想使用簡單數據類型,又想利用集合類的靈活性,就可以把簡單數據類型數據變成該數據類型類的對象,然后放入集合中處理,但這樣執行效率會降低。
集合類容納的對象都是Object類的實例,一旦把一個對象置入集合類中,它的類信息將丟失,也就是說,集合類中容納的都是指向Object類對象的指針。這樣的設計是為了使集合類具有通用性,因為Object類是所有類的祖先,所以可以在這些集合中存放任何類而不受限制。當然這也帶來了不便,這令使用集合成員之前必須對它重新造型。
集合類是Java數據結構的實現。在編寫程序時,經常需要和各種數據打交道,為了處理這些數據而選用數據結構對于程序的運行效率是非常重要的。
一.集合
1、針對不同特點的數據,能夠選擇對應接口的主要的類進行實例化和方法的調用
2、熟悉接口的不同的實現類的區別、特點
3、相關接口實現類的底層實現:存儲結構
二.集合框架結構
Collection:存儲一個一個的數據
List:存儲有序的、可以重復的數據 : 替換數組,"動態數組"
ArrayList/LinkedList/Vector
Set:存儲無序的、不可重復的數據: 高中的集合
HashSet/LinkedHashSet/TreeSet
Map:存儲一對一對的數據(key-value):高中的函數。 y = f(x) (x1,y1),(x2,y2)
HashMap/LinkedHashMap/TreeMap/Hashtable/Properties
三、Collection包含List和Set兩個子接口;
其中List存放 有序、可重復數據 ----à動態數組
List是Collection的子接口,Collection中聲明的方法,在List的實現類中都可以使用。
ArrayList:Collection collection = new ArrayList();
List list = Arrays.aslist();//將數組轉化為list,一般是初始化時使用。且不支持add()和remove(),也就是說在不改變長度的情況下,可以使用。
ArrayList list = new ArrayList();
List list = new ArrayList();//多態性;
Collection中的常用方法
四、功能:增,刪,改,查,插,長度,遍歷
1. add(Object obj):添加元素obj到當前集合中,可以自動裝箱
2.size():獲取集合中元素的個數
3.addAll(Collection coll):將coll集合中的元素添加到當前集合中。
4.isEmpty():判斷當前集合是否為空。
5.clear():清空當前集合
6.contains(Object obj):判斷當前集合中是否包含obj元素
7.containsAll(Collection coll):判斷當前集合中是否包含coll集合中的所有元素
8.remove(Object obj):刪除當前集合中首次出現的obj元素
9.removeAll(Collection coll):差集:從當前集合中移除其與coll集合共有的元素
10.retainAll(Collection coll):交集:獲取當期集合與coll集合共有的元素
11. equals(Object obj):判斷當前集合與obj元素是否相等
12.hashCode():返回當前集合對象的哈希值
13.toArray():將集合轉換為數組
ArrayList:線程不安全,效率高,相對于其他List是主要實現類,適用于大量的查找工作,底層是Object[]數組,有序可重復。
Integer[] arr2 = new Integer[]{1,2,3};
int[] arr3 = new int[]{1,2,3};
List list2 = Arrays.asList(arr2);
List list3 = Arrays.asList(arr3);//存放的時地址值
List list4 = Arrays.asList(1,2,3);
System.out.println(list2.size());//3
System.out.println(list3.size());//1
System.out.println(list4.size());//3
System.out.println(list3);//[[I@4459eb14]
LinkedList:LinkedList list = new LinkedList();
線程不安全;底層使用雙向鏈表存儲數據,對于頻繁的插入、刪除操作,使用此類效率高。
Vector:Vector v = new Vector();
List的古老實現類,線程安全,效率低,底層使用Object[]存儲
Set:其中Set存放 無序、不可重復數據 ----à類似初中概念集合
HashSet:HashSet set = new HashSet();
Set set = new HashSet();
主要實現類,線程不安全,可以存放null值,底層也是使用數組+鏈表+紅黑樹存儲的。
無序性:不等于隨機性,元素在底層存儲的位置不是像數組一樣是依次緊密排列的,而是參考其hashCode值決定的存儲位置,理解為無序性。
不可重復性:跟據對象的equals()進行判斷。如果返回true,則添加失敗。保證了不可重復性。
所以,必須要重寫hashCode()和equals()方法,并且保持兩方法的一致性,相等的對象必須具有相等的散列碼。
LinkedHashSet:
LinkedHashSet set = new LinkedHashSet();
Set set = new LinkedHashSet();
是HashSet的子類,在添加數據之外,還通過一對指針記錄先后添加的順序,使得遍歷Set元素時,較HashSet效率更高。
TreeSet:TreeSet set = new TreeSet();
可以按照添加的元素的指定的屬性的大小進行遍歷,排列的方式有自然排序和定制排序,底層使用的紅黑樹。
特別注意:向TreeSet中添加的元素必須是同一個類型的對象,TreeSet中不能存放相同的元素,判斷的標準不是hashCode()和equals()方法,而是按照自然排序或定制排序中重寫的compareTo()或compare()方法進行比較。
Map接口,存放一對一對的數據,鍵值對(key-value),map中一個key-value構成了一個Entry,Map接口類似函數。
HashMap:HashMap map = new HashMap();//底層創建長度為16的Entry數組table
Map中的key彼此不可重復、無序,添加元素方法put();且添加遵循七上八下(jdk7中添加元素放在首端,jdk8中添加元素放在末尾);
Map中的常用方法:Object put(Object key,Object value); void putAll(Map m); Object remove(Object key); void clear(); Object get(Object key); boolean containKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty; boolean equals(Object obj); Set keyset(); Collection values(); Set entrySet();
五、總結:
增:put(Object key,Object value)
刪:remove(Object key)
改:put(Object key,Object value)
查:get(Object key)
長度:size()
遍歷:keySet();values();entrySet()
LinkedHashMap:
TreeMap:TreeMap map = new TreeMap();
向TreeMap中添加key-value,要求所有的key必須是同一個類的對象,針對于key,實現自然排序或定制排序。
Hashtable:
Properties:Hashtable的子類,其中key-value都是String類型,常用來處理屬性文件。
HashMap的源碼解析(底層實現原理)
HashMap使用的存儲結構:jdk8:數組+鏈表+紅黑樹 jdk7:數組+鏈表 (鏈表結構七上八下)
加了紅黑樹以后,提高數據的查找、對比的效率
鏈表:“七上八下”
初始化的問題:new HashMap();
jdk8:沒有初始化底層數組(懶漢式)
jdk7:實例化時就初始化了底層數組(餓漢式)
jdk8:底層的數組Node[] (class HashMap.Node implements Map.entry)
jdk7:底層的數組Entry[] (class HashMap.Entry implements Map.entry)
class Node/Entry
添加數據的過程:
在jdk8中,首次調用put(),底層會創建長度為16的數組,然后添加數據
在jdk7中,首次調用put(),直接添加數據擴容機制
臨界值threshold,當添加的元素超過臨界值時,要考慮擴容,默認擴容為原來的2倍
默認情況下等于
DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY.即為12
加載因子:默認時0.75
添加操作之外的,get(),remove()也參考put(key,value)
增強for循環(for-each循環)
格式:
for(集合元素類型 變量名稱 : 待遍歷的集合對象的引用){
}
例子:for( Object obj : collection){
System.out.println(obj);
}
迭代器Iterator
Iterator的對象成為迭代器,主要用于遍歷Collection集合中的元素Collection c = new ArrayList();
c.add(1);//自動裝箱
c.add(2);
c.add(3);
Iterator iterator = c.iterator();
While(iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
System.out.println(iterator.next());//可以,但是不推薦
}
以上是“Java集合類有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。