------- android教育訓練、java教育訓練、期待與您交流! ----------
黑馬學習日志之十一 集合(二)
1 Map集合
Map<K,V>: 和Collection是并行的接口,将鍵映射到值的對象,該集合存儲鍵值對,一對一對往裡存,而且要保證鍵的唯一性,一個映射不能包含重複的鍵,每個鍵最多隻能映射到一個值。
K—此映射所維護的鍵的類型
V—映射值的類型
Collection 是單列集合。Map是雙列集合,像是夫妻,可以給元素加索引甚至起名字。
Map集合方法:
添加:
V put(k ,v): 傳回值。鍵是唯一的,當再次存入的鍵和集合中已有的鍵相同,會将原有的值覆寫。
void putAll(map); 将整個集合的元素添加到調用的集合中。
删除:
void clear():清除集合中所有的元素。
v remove(k) 通過鍵去删除元素,并傳回該鍵對應的值。
判斷:
boolean containsKey(Object key):是否包含這個鍵,傳回值是布爾類型。
boolean containsValue(Object value):是否包含這個值,傳回值的類型是布爾類型。
boolean isEmpty(): 傳回值是布爾類型,判斷集合是否為空。
擷取:
v get(k):根據鍵擷取值。當鍵不存在傳回null,要盡量使用引用類型進行接收。
int size():擷取集合中的長度。
Collection values() 擷取集合中所有的值,傳回是單列的集合。
Set keySet():擷取map集合中所有的鍵,傳回的是Set集合
Set entrySet():擷取的是鍵值的映射的關系。将映射關系封裝成對象存入到了Set集合。
2 Map集合的取出
第一種方法:
Set keyset(): 傳回此集合映射中的所有的鍵的集合Set集合,傳回的是Set集合。然後通過 周遊鍵的方法,通過get的方法擷取到鍵的值。
第二種方法:
Set entrySet(): 傳回一對鍵值對象,将map中的鍵值映射關系看成一個對象,通過getKey和getValue的方法擷取其鍵和值。
Map中的鍵值映射關系是Map.Entry。 Map.Entry:其實Entry也是一個接口 它是Map接口中的一個内部接口
例子:
第一種:
import java.util.*;
class MapDemo2
{
public static void main(String [] args){
Map<String,String> map= new HashMap<String ,String>();
map.put("02","sun2");
map.put("03","sun3");
map.put("01","sun1");
map.put("04","sun4");
//先擷取map集合的所有鍵的Set集合,keySet();
Set<String> keySet = map.keySet();
//Set集合使用其疊代器
Iterator<String> it = keySet.iterator();
while (it.hasNext())
{
String key = it.next();
//有了鍵可以通過map集合的get方法擷取其對應的值
String value = map.get(key);
System.out.println("key:"+key+",value"+value);
}
}
}
第二種:
//将map集合中的映射關系取出,存入到Set集合中
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
while (it.hasNext())
{
Map.Entry<String,String> me = it.next();
String key = me.getKey();
String value=me.getValue();
System.out.println(key+":"+value);
}
2 Map的子類
Map集合的子類:
HashTable 底層是哈希表資料結構,不可以存入null鍵和null值。該集合是線程同步。
HashMap 底層是哈希表資料結構,允許使用null鍵和null值。該集合不同步。
TreeMap 底層是二叉樹資料結構,線程不同步,可以用于給Map集合的鍵進行排序。
和Set集合很像,其實Set集合底層就是Map。
3 工具類
Collections類
sort() 對指定清單按升序進行排序。
sort( list, new Comparator()) 對指定的清單用我們指定的方式排序
reverseOrder() 将原先的集合的自然順序倒序排序。
reverseOrder(new Comparator()) 傳回一個比較器,它強行逆轉指定比較器的順序。
binarySearch() 對有序的集合二分查找,傳回值是集合中的索引,如果不存在該元素, 就傳回-(插入點)-1。
fill( list, obj)用obj将集合中的元素替代
reverse(List list)集合反轉
swap(List list, int i, int j);指定位置的交換
shuffle(List list);對集合中的元素随機置換(洗牌)
replaceAll(List list, T oldVal, T newVal)新元素替換老元素
同步集合 synchronizedList(List<T> list) synchronizedMap(Map<T> map) synchronizedSet(Set<T> sett)
Arrays類
asList() 将數組轉換成List集合。可以使用集合的方法和思想來操作數組。
注意:
(1)數組變成集合,但是不可以使用集合的增删方法。數組長度是固定的,增删會發生 不支援操作異常
(2)當數組中存儲的是基本資料類型,變成集合後,會将這個數組變成集合中的元素
(3)當數組中存儲的是引用資料類型,變成集合後,就将數組中的元素作為集合中的元素
集合變數組:Collection接口的toArray()方法。
ArrayList<String> al = new ArrayList<String>();
String[] arr = al.toArray(new String[0]);
長度該怎麼定義呢?
當指定的長度小于集合的長度,該方法内部會自動建立一個該類型的新數組長度和集合長度一緻 。用于存儲集合中的元素。
如果指定的數組長度大于集合的長度,那麼該方法就不會建立新數組。而是使用傳遞進來的數組,存儲完集合的元素後,其他的未存儲的位置為null。
是以在定義數組是,最好定義長度和集合長度相同的數組最優。
将集合變成數組其實是限定了對元素的增删操作。
4 進階for循環
格式:
for(資料類型 變量名:被周遊的集合Collection或者數組)
{
}
局限:隻能取出 不能修改
進階for循環變量 隻是指向了集合中的元素 當變量名=其他值時 ,實際是變量名指向發生變化 沒有指向集合中的元素 是以集合中的元素還是不變的
傳統for和進階for有什麼差別?
進階for有一個局限性 必須有被周遊的目标 例如 将helloword 列印100次 進階for不可以
建議在周遊數組的時候,使用傳統for,因為可以定義腳标,對腳标進行操作
5 JDk1.5 新特性
可變參數
其實就是上一種數組參數的簡寫形式,不用每一次都手動的建立數組對象,隻要将要操作的元素作為參數傳遞即可,隐式将這些參數封裝成了數組。
show(3,4);
show(3,4,5);
publicstaticvoidshow(int...arr)
{
Sop(arr);
}
注意:可變參數一定要定義在參數清單的最後面
show(int...arr,int a) 不可以
show(int...arr,String a)不可以
show(String a ,int...arr) 可以
靜态導入
當類名重名時,需要指定具體的包名
當方法名重名時,指定具體所屬的對象或者類
import static java.util.Arrays.*; 導入Arrays這個類中的所有靜态成員
import static java.lang.System.*; 導入System類中所有靜态成員
------- android教育訓練、java教育訓練、期待與您交流! ----------