java集合类总结
Collection:單列集合類的跟接口,用于存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別時List和Set還有Queue。其中List的特點時元素有序,元素可重復,Set的特點時元素無序且不可重復,Queue與List性質一樣,不同之處時Queue是先進先出。
Map:鍵值對存儲,每個值對應一個鍵,是一種映射關系,在Map集合中可以通過鍵值Key找到對應的值Value
List接口
方法聲明 | 功能描述 |
Void add(int? index,Object element) | 將元素element元素插入在List集合的index處 |
Boolean addAll(int index,Collection c) | 將集合c所包含的所有元素插入到List集合的index處的元素 |
Object get(int index) | 返回集合索引index處的元素 |
Object remove(int index) | 刪除index索引處的元素 |
Object set(int index,Object element) | 將索引index處元素替換成element對象,并將替換后的元素返回 |
Int indexOf(Object o) | 返回對象o在List集合中出現的位置索引 |
Int lastIndexOf(Object o) | 返回對象o在List集合中最后一次出現的位置索引 |
List subList(int fromIndex,int toIndex) | 返回從索引fromIndex(包括)到toIndex(不包括)處所有元素集合組成的子集合 |
?
ArrayList集合
?
ArrayList常見功能
添加public boolean add(E e)
public void add(int index,E element) // 在指定的索引位置添加元素?
獲取元素
public E get(int index)// 根據索引值獲取元素
獲取元素個數
public int size() //獲取元素個數
刪除元素
public boolean remove(Object o) // 直接刪除元素?
public E remove(int index) //根據索引刪除元素 ,并把刪除的元素返回?
修改元素
public E set(int index,E element)// 使用element 去替換指定索引的元素 , 并返回被替換的元素
LInkedList集合
查詢快,增刪慢
package com.ajax;import java.util.ArrayList; import java.util.LinkedList;public class Example10 {public static void main(String[] args){LinkedList link=new LinkedList();link.add("1");link.add("2");link.add("3");link.add("4");link.add("5");System.out.println(link.toString());Object st= link.getFirst();System.out.println(st);} }
?
?
?
Iterator接口
?
Iterator接口也是Java集合框架的成員,但它與Collection系列、Map系列的集合不一樣:Collection系列集合、Map系列集合主要用于盛裝其他對象,而Iterator則主要用于遍歷(即迭代訪問)Collection集合中的元素,Iterator對象也被稱為迭代器。
Iterator接口里定義了如下4個方法:
–booleanhasNext():如果被迭代的集合還元素沒有被遍歷,則返回true。
–Objectnext():返回集合里下一個元素。
–voidremove() :刪除集合里上一次next方法返回的元素
–voidforEachRemaining(Consumer action),這是Java 8為Iterator新增的默認方法,該方法可使用Lambda表達式來遍歷集合元素。
package com.ajax; import java.util.ArrayList; importjava.util.Iterator; importjava.util.LinkedList;public classExample10 {public static void main(String[] args){LinkedList link=newLinkedList();link.add("1");link.add("2");link.add("3");link.add("4");link.add("5");Iterator it = link.iterator();while(it.hasNext()){System.out.println(it.next());}} }?
?
Foreach循環
?
for(容器中元素類型 臨時變量:容器變量)
package com.ajax;importjava.util.ArrayList;public classExample10 {public static void main(String[] args){ArrayList list1=newArrayList();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");for(Object obj:list1){System.out.println(obj);}} }?
?
ListIterator接口
?
為了迭代方式的多元化,在父類的基礎上鄭家了一下特有的方法
方法聲明??????? 功能描述
void add(Object o)? 插入
ObjecthasPrevious()?????? 判斷對象是否有上個元素
void remove() 刪除next或者previous返回的最后一個元素
package com.ajax;
?
import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator;public classExample10 {public static void main(String[] args){ArrayList link=newArrayList();link.add("1");link.add("2");link.add("3");link.add("4");link.add("5");ListIterator it=link.listIterator(link.size());while(it.hasPrevious()){System.out.println(it.previous());}} }?
//本例表示以集合的最后一個元素開始迭代
?
Enumeration接口
?
遍歷Vector集合,Vector集合是線程安全的,而ArrayList集合是線程不安全的。
package com.ajax;
?
importjava.util.ArrayList;
importjava.util.Enumeration;
importjava.util.Iterator;
importjava.util.LinkedList;
importjava.util.ListIterator;
importjava.util.Vector;
?
public classExample10 {
???????? public static void main(String[] args){
????????????????? Vector link=new Vector();
????????????????? link.add("1");
????????????????? link.add("2");
????????????????? link.add("3");
????????????????? link.add("4");
????????????????? link.add("5");
????????????????? Enumeration it=link.elements();
????????????????? while(it.hasMoreElements()){
????????????????????????? System.out.println(it.nextElement());
????????????????? }
????????????????? }
}
?
?
?
Set接口
?
Set接口和List接口一樣,同樣繼承Collection接口,并沒有對接口進行功能上的補充,只是比該接口更加嚴格了,Set無序沒有重復
HashSet集合
?
當該集合添加一個對象時,首先會調用對象的hashCode()方法來確定與元素的存儲位置,然后再調用對象的equals()方法來確保該位置沒有出現重復元素,可以理解為像數據結構中的哈希散列表
package com.ajax;
?
importjava.util.ArrayList;
importjava.util.Enumeration;
importjava.util.HashSet;
importjava.util.Iterator;
importjava.util.LinkedList;
importjava.util.ListIterator;
importjava.util.Vector;
?
public classExample10 {
???????? public static void main(String[] args){
????????????????? HashSet link=new HashSet();
????????????????? link.add("1");
????????????????? link.add("2");
????????????????? link.add("3");
????????????????? link.add("4");
????????????????? link.add("1");
????????????????? Iterator it=link.iterator();
????????????????? while(it.hasNext()){
????????????????????????? System.out.println(it.next());
????????????????? }
????????????????? }
}
?
?
//結果
3 2 1 5 4
沒有出現重復值,之所以出現的順序時無序因為此處的哈希散列表是根據對象的地址來存儲的,地址越靠前優先輸出
TreeSet集合
?
原理是自平衡的排序二叉樹,特點是存儲的元素會按照大小排序,并能去重(平衡二叉樹的左孩子必須小于根節點,右孩子大于根節點的值,當出現重復的元素時不做處理,樹的結構不會放生變化,因為節點中已經出現該值)。
package com.ajax;
?
importjava.util.ArrayList;
importjava.util.Enumeration;
importjava.util.HashSet;
importjava.util.Iterator;
importjava.util.LinkedList;
importjava.util.ListIterator;
importjava.util.TreeSet;
importjava.util.Vector;
?
public classExample10 {
???????? public static void main(String[] args){
????????????????? TreeSet link=new TreeSet();
????????????????? link.add("1");
????????????????? link.add("2");
????????????????? link.add("3");
????????????????? link.add("4");
????????????????? link.add("1");
????????????????? Iterator it=link.iterator();
????????????????? while(it.hasNext()){
????????????????????????? System.out.println(it.next());
????????????????? }
????????????????? }
}
?
?
//結果:1234 根據平衡二叉樹的原理,中序遍歷的結果得出1234
Map接口
?
?
Map接口利用鍵值對的方式保存數據,其實現原理就是紅黑樹,紅黑樹是二叉查找樹,如果讀者想具體了解紅黑樹可以參考:http://blog.csdn.net/eric491179912/article/details/6179908寫的很詳細
常用的方法
方法聲明??????????? ??????? 功能描述
void put(Objectkey,Object calue) 將指定的值與此映射的值相關聯(可選操作)
Object get(Objectkey)?? 通過key返回值,沒有返回null
boolean containsKey(ObjectKey) 如果有映射關系返回true
booleancontainsValue(Object? value)???????? 同上
?
HashMap集合
?
package com.ajax;
?
importjava.util.*;
?
public classExample10 {
???????? public static void main(String[] args){
????????????????? Map link=new HashMap();
????????????????? link.put(1, 'a');
????????????????? link.put(3, 'c');
????????????????? link.put(2, 'b');
????????????????? link.put(5, 'd');
????????????????? link.put(4, 'd');
????????????????? link.put(4, 'e');
????????????????? link.put(4, 'f');
????????????????? Set keySet=link.keySet();//獲取鍵的集合
????????????????? Iterator it=keySet.iterator();
????????????????? while(it.hasNext()){
????????????????????????? Object key=it.next();
????????????????????????? System.out.println("key:"+key+"value:"+link.get(key));
????????????????? }
???????? }
}
?
?
//結果:
key:1value:a
key:2value:b
key:3value:c
key:4value:f
key:5value:d
通過測試可以發現,當鍵相同的元素存入map集合中的時候,每次保存的值都會發生改變直到最后一個存儲的值為止
TreeMap集合
?
自平衡二叉樹排序
package com.ajax;
?
importjava.util.*;
?
public classExample10 {
???????? public static void main(String[] args){
????????????????? Map link=new TreeMap();
????????????????? link.put(1, 'a');
????????????????? link.put(4, 'd');
????????????????? link.put(2, 'b');
????????????????? link.put(5, 'd');
????????????????? link.put(3, 'c');
????????????????? Set keySet=link.keySet();//獲取鍵的集合
????????????????? Iterator it=keySet.iterator();
????????????????? while(it.hasNext()){
????????????????????????? Object key=it.next();
????????????????????????? System.out.println("key:"+key+"value:"+link.get(key));
????????????????? }
???????? }
}
?
?
?
Properties集合
?
map接口還有一個實現類Hashtable,它和HashMap十分相似,區別在于Hashstable是線程安全(線程安全不理解的參考:https://zhidao.baidu.com/question/168637634.html)的。
Hashtable存取元素的速度很慢目前基本被HashMap取代,但Hashtable有一個子類Properties主要用來存儲字符串類型的鍵值對,開發中經常存取應用的配置項。
總結
- 上一篇: servlet中用out.print输出
- 下一篇: C++ Deque(双向队列