Java集合(八) 迭代器Iterator、泛型、Map映射
生活随笔
收集整理的這篇文章主要介紹了
Java集合(八) 迭代器Iterator、泛型、Map映射
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、 迭代器
- 迭代器的增刪作用于原集合
- 用迭代器遍歷集合 , 用指針的挪動來獲取對應的元素,通過標記這個元素是否可以用來操作 去操作原集合。
- 在迭代過程中不允許直接操作原集合。
- forEach --- 本質上也是做迭代遍歷 ,如果一個對象能使用增強for循環,那么這個類必須實現 Iterable。
- JDK1.5的新特性之一。
- /** 迭代器練習*/
public class IteratorTest_01 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("張三");list.add("李四");//獲取迭代器對象Iterator<String> iterator = list.iterator();//通過迭代器遍歷集合//判斷是否有下一個元素while(iterator.hasNext()){//挪動指針,獲取元素String s = iterator.next();System.out.println(s);//移除當前元素 ---- 作用于原集合
// iterator.remove();//在迭代過程中 ,不允許直接操作原集合 爆java.util.ConcurrentModificationException異常list.remove(s);list.add("王五");}System.out.println(list);}
}
二、 泛型
- 學名: 參數化類型 ?--- 頂級泛型接口?ParameterizedType ?--- JDK1.5新特性之一。
- 起強制限定的作用。 提高運行和編譯的效率。
- 用具體類型來替換泛型的操作 --- 泛型的擦除
- 使用泛型之后效率略低 ,多了泛型的推導和擦除過程。
- /** 泛型的定義* 泛型在定義時只要符合標識符的命名規則即可 ,但習慣上是使用一個大寫字母表示泛型* T type* E Elements* K key* V value* R result* 當定多個泛型的時候,泛型之間用","隔開* */ public class GenericTest_01 {public static void main(String[] args) {} } class Demo<T> {private T t;public Demo() { // t = new T(); //錯誤 , 因為不知道具體的類型 ,所以JVM無法分配具體的內存空間。}//泛型可以用作返回值類型public T getT() {return t;}//泛型可以用作參數public void setT(T t) {this.t = t;}//參數類型不確定 ,希望傳入任意類型的參數之后 ,轉換為T類型//不能定義正在一個類上 ,為當前方法定義一個屬于當前方法的泛型private <E> T change(E e) {return (T)e;}//參數類型確定 ,但返回值類型不確定private <R>R change2 (T t){return (R)t;}//參返都不確定private <A,B>B change3(A a){return (B)a;} }
- 泛型的繼承 -- ? ?:表示泛型的通配符 , 表示此時需要泛型 ,但是不能確定類型/** 泛型類的繼承* */
public class GenericTest_02 {public static void main(String[] args) {List<Integer> list1 = Arrays.asList(1,3,5,7,4,3,2);List<Double> list2 = Arrays.asList(1.0,34.0,55.0,7.0,5.0,4.0,3.0);it(list1);it(list2);}//泛型不向下兼容 泛型Number不能接受數值類型的值// ? extends Number 表示傳入的這個類或接口 是Number 的子類// 無論是類還是接口 ,這里一律用extends // Number規定了 泛型的上限public static void it(List<? extends Number> list) {//由于不確定子類的類型 ,所以不能向集合中添加元素 ,只能添加null
// list.add(4);
// list.add(null);for(Number n : list ){System.out.println(n);}}//可以傳入String及其父類// ? super 類\接口 表示 可以傳入 這個類的子類\接口 元素// 規定了泛型的下限//規定了下限之久能夠添加元素//同一個泛型不能既規定上限 , 有規定下限public static void it1(List<? super String> list){}
}
- 是JDK1.5的新特性之一
三、 Map<K , V>映射
- 映射 。 ?一個鍵對應一個值 --- map中的元素是以鍵值對的形式存在的。
- 鍵唯一 ?, 值唯一 。
- Map本身不是集合 , 但是集合框架中的一員。
- 集合框架中包含了集合 、映射以及操作集合和映射的工具 。
- Entry ?--- 代表鍵值對的接口 --- Map中的內部接口
- 一個Map對象實際上是由多個Entry對象組成的。
- HashMap ** 重點 **
- 允許值為null , 允許鍵為null。
- 默認初始容量為16 , 加載因子為0.75f , 每次擴容一倍 。 本身是一個異步式線程不安全的映射。
- HashTable ** ?記住 **
- 任何非null值都可以作為鍵和值 ? --- ?鍵值都不允許為null。
- 默認初始容量為11 , 加載因子為0.75f ?, 容量超過75% 時 開始擴容 , 本身是一個同步式線程安全的映射。
- 效率低
- 是 java中最早的映射。
- ComcurrenHashMap?
- 異步式線程安全的映射
- Dictionary是所有映射的父類。
- /** Map * */ public class MapTest_01 {public static void main(String[] args) {//表示 鍵為String類型 , 值為 Integer類型Map<String ,Integer> map = new HashMap<String , Integer>();//添加元素map.put("a", 1);map.put("b", 2);map.put("c", 3);map.put("d", 4);//覆蓋元素map.put("a", 5);//將所有的值放入一個Collection集合System.out.println("map中所有值:"+map.values());//獲取鍵值對的個數System.out.println("map中鍵值對的個數:"+map.size());//判斷映射是否為空System.out.println("map是否為空:"+map.isEmpty());//根據鍵獲取對應的值System.out.println("c對應的值是:"+map.get("c"));//判斷映射中是否包含指定的鍵System.out.println("map中是否有d:"+map.containsKey("d"));//刪除元素map.remove("b");//清空映射map.clear();//映射中的toString方法做過重寫System.out.println(map.toString());} }
- package com.tj.tedu;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;/** map遍歷的三種方式* */
public class MapTest_02 {public static void main(String[] args) {//表示 鍵為String類型 , 值為 Integer類型Map<String ,Integer> map = new HashMap<String , Integer>();//添加元素map.put("a", 1);map.put("b", 2);map.put("c", 3);map.put("d", 4);//方式一Set<String> keySet = map.keySet();for( String key : keySet){System.out.println(key+"="+map.get(key));}System.out.println("-----------------------------------");//方式二Set<Entry<String, Integer>> entrySet = map.entrySet();for(Entry e : entrySet){System.out.println(e.getKey()+"="+e.getValue());}System.out.println("-----------------------------------");//方式三Set<Entry<String, Integer>> entrySet2 = map.entrySet();Iterator<Entry<String, Integer>> iterator = entrySet2.iterator();while(iterator.hasNext()){Entry<String, Integer> next = iterator.next();System.out.println(next.getKey()+"="+next.getValue());}}
}
練習:輸入一個數以及對應個數的Integer鍵值對 ,輸出要求:鍵從小到大排序 , 如果出現了重復的鍵 , 則要求對應的值求和 。?// 輸入一個數以及對應個數的Integer鍵值對 ,輸出要求:鍵從小到大排序 , 如果出現了重復的鍵 , 則要求對應的值求和 。 public class Test_03 {public static void main(String[] args) {//在Scanner類中 , 除了nextLine()方法以外 , 其余的方法是以空格作為 結束符Scanner in = new Scanner(System.in);System.out.println("請輸入數據的個數 :");int count = in.nextInt();System.out.println("請依次輸入數據,中間以,隔開:");in.nextLine();List<String> l = new ArrayList<String>();for(int i = 0 ; i<count ;i++){l.add(in.nextLine());}//排序l.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return new Integer(o1.split(",")[0])-new Integer(o2.split(",")[0]);}});//放入Map如果鍵相同 , 則值求和Map<Integer , Integer> map = new HashMap<Integer, Integer>();for(int i = 0 ; i<count ; i++){Integer key = new Integer(l.get(i).split(",")[0]);Integer value = new Integer(l.get(i).split(",")[1]);if(map.containsKey(key)){map.put(key, map.get(key)+value);}else{map.put(key, value);}}System.out.println(map);}}
總結
以上是生活随笔為你收集整理的Java集合(八) 迭代器Iterator、泛型、Map映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中集合 练习 计算疯狂值
- 下一篇: Java 文件操作 File 及 Ran