1. 程式人生 > >java學習日記 集合框架

java學習日記 集合框架

調用構造 mar bsp 順序 ole 鍵值對 oar 一樣在 es2017

集合框架

有兩大接口 一個是 Collection (類集 )與Map (映射);

collection 下有兩大接口 一個是List (列表) 另一個是Set(集合)

List (列表):ArrayList 基於數組實現的動態列表 動態數組 ;

       LinkedList 基於鏈表實現的列表 雙向循環鏈表

      Vector 向量 ------》stack棧 與線程相關;

Set (集合) :TreeSet 通過樹實現的集合 有序集合

      HashSet 通過hash桶實現的集合 無序集合 ----->LinkedHashSet 基於鏈式存儲結構的無序集合;

Map (映射) Hashtable hash表

      HashMap 通過hash桶實現的映射 無序映射

      TreeMap 通過樹實現的映射 有序映射

Map (映射 ) 就是將任意個對象起一個別名

HashMap數據的特征 有名無序:每一個數據存儲在hash桶中有他們的名字但是順序不確定,即放入map數據和輸出時的順序可能不一樣;

通過右邊的圖片不難看出,內部存儲是無序的。              技術分享

關於<string,string >的含義:就是泛型;給數據一個約定大家都往裏邊存string

類型的數據,後邊的<>是可以省略不用寫的,默認和前邊的一樣。

在代碼中,大家也看到了我們用put方法放入數據。方法裏兩個參數:第一個為key 用來給數據起個名字,特有的因為重名就會被覆蓋他代表的數據。第二個為value,代表對象(數據)。他倆在一起叫做 鍵值對

我們可以通過key值獲取對應的value值;get(key)方法 ;

        獲取map中數據的多少用 size()方法 

        清空map內數據,但是map保留的用的方法是 clear();  

map是可以合並的

技術分享

根據上圖我們可以看出相應的用法;

private static void maptest1()
	{
		Map<String,String> map=new HashMap<>();
		map.put("name", "王徽");
		map.put("id", "110");
		map.put("class", "no.1");
		map.put("number", "250");
		Map<String,String> map2=new HashMap<>();
		map2.put("1", "123");
		map2.put("2", "250");
		System.out.println("map"+map);
		System.out.println("map2"+map2);
		int size=map.size();
		System.out.println("size :"+size);
		String id=map.get("id").toString();
		System.out.println("id :"+id);
		map.putAll(map2);
		System.out.println("map合並map2後 "+map);
		
	}

  刪除用的方法 remove(key);在java1.7之前key不存在會報錯,現在不會了

  替換的方法 put;

影響hashMap性能的因素:

一個是:初始內存 (初始16)

另一個數:加載因子(初始0.75) 這個是從時間和空間上決定的,不做修改

hashmap的機制是 內部存儲說起。他是有hash桶進行存儲,初始化16個當到達12(16*0.75)個時 ,在加就要hash內部重構進行擴容。容量翻倍增長。

所以機智的我們這樣調用構造子的時候進行初始化他的初始內存數 我們需要的/0.75+1 這樣就減少了內存虛耗;

List列表 ;

列表的創建和元素的添加與獲取 基礎方法演示;、

技術分享

我們可以看到數據 無名有序;

元素插入 add()方法 有兩個,一個是順序插入add(value) 一個參數 代表數據 ,另一個時 指定插入 兩個參數add(index,value),index便是要插入的下標,註意當插到末尾的時候 適合add(value)一樣的效果;

元素替換的方法 set(index,value);index要替換的下標,value替換後的內容;

列表空判斷 方法 isEmpty( ) 返回的是Boolean值;

獲取長度的方法是 size() ;

元素的刪除 remove()方法 這個有兩個 ,一個是內容,一個是索引,按照這兩個刪除,但是當列表是int類型時 ,內容和索引都是int java就以索引優先進行刪除。

List轉換成數組:

技術分享

	private static void listtest1()
	{
		List<Integer> date=new ArrayList<>();
		System.out.println(date);
		date.add(1);
		date.add(2);
		date.add(3);
		date.add(4);
		System.out.println(date);
		int a=date.get(2);
		System.out.println(a);
		date.set(2, 100);
		System.out.println(date);
		date.remove(2);
		System.out.println(date);
		Integer arr[]=new Integer[date.size()];
		date.toArray(arr);
		for(Integer b:arr)
		{
			System.out.println(b);
		}
	}

  

叠代器(叠代接口)

技術分享
private static void iteratorTest()
    {
        List<Integer> date=new ArrayList<>();
        System.out.println(date);
        date.add(1);
        date.add(2);
        date.add(3);
        date.add(4);
        date.add(5);
        date.add(6);
        date.add(7);
        int size=date.size();
        /**
         * 獲取叠代器
         * hasNext();判斷是否含有數據;返回的是boolean值,
         * Next() 獲取當前值,
         */
        Iterator<Integer> iter=date.iterator();
        while(iter.hasNext())
        {
            System.out.println(iter.next());
        }
        
    }
叠代器

存在List專用叠代器 ;

技術分享
private static void listIteratorTest()
    {
        List<Integer> date=new ArrayList<>();
        System.out.println(date);
        date.add(1);
        date.add(2);
        date.add(3);
        date.add(4);
        date.add(5);
        date.add(4);
        date.add(4);
        int size=date.size();
        ListIterator<Integer> iter=date.listIterator();
        System.out.println("----正序叠代------");
        while(iter.hasNext())
        {
            System.out.println(iter.nextIndex()+":"+iter.next());
        }
        /**
         * 元素修改set
         * 和刪除remove;
         * 註意remove刪除後 叠代就斷了 ,我們去最後驗證刪除
         */
        date.set(3, 100);
        System.out.println("----倒序叠代------");
        while(iter.hasPrevious())
        {
            System.out.println(iter.previousIndex()+":"+iter.previous());
        }
        /**
         * 從指定位置index截斷開始叠代,註意階段後只能正序叠代一次 ,然後就恢復啦
         * 據我了解應該是相當於一個指針在走,你走到頭就走不動啦,連續叠代兩次統一方向,第二次沒結果
         * 然後從截斷開始叠代到頭,然後再往反方向走,就又可以全部走一遍並走到頭。
         */
        ListIterator<Integer> iter2=date.listIterator(3);
        System.out.println("----正序叠代------");
        while(iter2.hasNext())
        {
            System.out.println(iter2.nextIndex()+":"+iter2.next());
        }
        System.out.println("----倒序叠代------");
        while(iter2.hasPrevious())
        {
            System.out.println(iter2.previousIndex()+":"+iter2.previous());
        }
        while(iter.hasNext())
        {
            if(iter.next()==4)
                iter.remove();
        }
        /**
         * 刪除後 我們只能打印date,因為listiterator被破壞了、
         * 打印出來後我們發現是4的都被刪除啦;
         */
        System.out.println(date);
    }
ListIterator

影響ArrayList性能的因素:初始容量 ,默認值為10

和我們解決hashmap的方法一樣在實例化的時候 ,調用構造子的時候 初始上我們需要的大小

他的擴容倍數是1.5.滿了就擴容。

Vector初始容量為10,他的擴容倍數為2倍;

java學習日記 集合框架