2.集合

2.集合

標籤(空格分隔): 6.2Java高級


一 Java集合框架

image_1d56q046eik7ce01t8016gtqet9.png-236kB

image_1d56q1a1a1vaa16lc2g51lljv0om.png-158.6kB

二 List接口的實現類

image_1d56q7aqh9pdknj89h1fuv1er113.png-170.2kB

1. ArryList集合類

(1) 簡介

image_1d56q9nkecm6id21vcj10eopo01g.png-71.6kB

(2)常用方法

image_1d56qbfsrjt51el91hnl1bl01vrr1t.png-139.2kB

  • 增-add()
    al.add(“hello”); //在末尾增加元素
    al.add(1, “hello”); //增加在指定位置
    al.add(12); //集合不支持基本數據類型!!!!!!!
    al.add(15.5);
    // al.add(new Student(“jack”,20));
    al.add(stu);//同上
    al.add(new Student(“rose”,21));
  • //集合不支持基本數據類型!!!!!!!
  • 刪-remove()
    al.remove(“12”);//刪除指定內容
    System.out.println(al.contains(12));
    System.out.println(al.get(1));
    al.remove(1);//刪除指定位置元素
    System.out.println(al.get(1));

  • 查-get()
    System.out.println(al.get(1));

  • 判斷列表中是否存在指定元素-contains();返回布爾值
    System.out.println(al.contains(12));//true
    System.out.println(al.contains(new Integer(12)));//true 比較的是值

     System.out.println(al.contains(stu));//true
     System.out.println(al.contains(new Student("jack",20)));//false                                                                             比較的是地址
    
    • /*
      contains裏面默認調用的是equals方法
      Object (基類)的equals方法默認比較的就是地址
      Integer類重寫了這個方法 所以比較的是值
      String
      */

(3) ArryList的三種遍歷方法

image_1d56rgk233e51ue9jh710rp1rvb34.png-138.1kB

    //1.傳統for循環遍歷
	for(int i=0;i<al.size();i++){
		System.out.println(al.get(i));
	}
	
	//2.使用增強型for循環遍歷  往裏面扔的都是Object 所以拿出來的還是Object
	for(Object obj: al){
		System.out.println(obj);
	}
	
	
	//3.迭代器返回值
	//iterator() 返回的是迭代器
	Iterator it = al.iterator();  
	while(it.hasNext()) {  //hasNext()如果有下一個元素返回真 否則返回假
		//當代碼執行到這裏的時候表示有下一個
		Object obj = it.next();//獲取裏邊對象
		System.out.println(obj);
	}

image_1d56qtehll0f1ca2jbsp0bmjp2a.png-84kB

image_1d56rde8l1uub1dio1bokapf1nma2n.png-8.2kB


2. LinkedList集合類

(1)簡介

image_1d56rjrdr1io51go61rmr1fbv93h.png-37.6kB

(2)常用方法

image_1d56rkh5m135kb4eph81obi9om3u.png-78.3kB

(3)和ArryList的區別

image_1d56ro5rmp9tom8111nepthkm4b.png-87.4kB
image_1d56s283u1q2st2f1kuu8uh1h0n4o.png-87.5kB

  • LinkedList 增/刪速度較快
    ArryList 遍歷速度較快

3. Stack類

(1)簡介

  • Stack 棧----先進後出(後進先出)–LIFO(last in first out)
  • //創建Stack類對象 Stack stack=new Stack();

image_1d56s5gg71e6cum71966ma9105i55.png-153.1kB

(2)方法

image_1d56s9ieo1ec31rhhe451q5d17ig62.png-66.7kB

image_1d56sb2n719ed1kvl11ag1a8ush6f.png-77kB

重點在查
//1.查看棧頂對象
System.out.println(stack.peek());
//2.遍歷Stack集合中的元素(利用pop返回刪除值的特性)
int size=stack.size();//要放在外邊,如果i<stack.size(),i值越來越大,size值會逐漸變小
for(int i=0;i<size;i++){
System.out.println(stack.pop());//移除並返回刪除值
}


三 set集合

(1)簡介

    • set 無序且唯一
      * 無序是指 添加順序和輸出順序是不一致的,我們無法控制
      image_1d56sebiu680jqsqc16e31iff7c.png-175.3kB
      image_1d56sinrr1p5o51c1sekb8i132486.png-79.2kB
  • 藉助HashSet創建集合對象
    Set set=new HashSet();

(2)常用方法

image_1d56sghk51m7p1djjmc988g1bc17p.png-67.3kB

//添加集合元素
	set.add(10);
	set.add(20);
	set.add(30);
	set.add(40);
	set.add(50);
	set.add(new Student("jack",20));
	set.add(new Student("jack",20));
	
	/*
	 * 去重(留第一個值爲去重,留最後一個值爲覆蓋)
	 * 
	 * 在上午的ArrayList中 對比兩個對象 是不是同一個的時候
	 * 我們知道底層對比的是調用equals方法(重寫了Object的equals方法)
	 * 在Set去重的時候,不光要對比是否是同一個對象(比的是“值”)
	 * 還要比較在內存中是否是同一個,這個時候需要重寫Object的public int hashCode()
	 * 以此來判斷是不是同一個。
	 */ 

image_1d56sp3s01is31hlv7jtvj31bqq93.png-98.4kB

//遍歷集合元素
	//方法1:使用增強for循環進行遍歷
	for(Object obj: set){
		System.out.println(obj);
	}//兩個student對象的內存地址不一致,若只想顯示一個 重寫equals的底層代碼,去除地址判斷部分
	
	//方法2:迭代器Iterator
	Iterator it=set.iterator() ;
	while(it.hasNext()){
		System.out.println(it.next());//讀取值的方法next()
	}
	
	//方法3:將集合轉換爲數組後遍歷
	Object[] arr=set.toArray();//聲明數組 開闢空間 賦值set.toArray()
	for(int i=0;i<set.size();i++){
		System.out.println(arr[i]);
	}

四 Map接口

(1)簡介

  • Map 裏面存放的是key value的映射對
    * key要求是唯一的
    * value可以不唯一
    * 可以根據key來獲取value
    * 實例對象藉助HashMap創建
    image_1d56t76fbifigqlg6u19f9m349t.png-6.5kB

(2)方法

image_1d56td5qf51o20c1gln1va5bd5b6.png-92.9kB

//增加值--關鍵字put()
	hm.put(1,"a");
	hm.put("a", "A");
	hm.put("jack", new Student("jack",18));
	hm.put("jack", new Student("jack",21));
	System.out.println(hm.get("jack"));//這裏key是唯一的 ,出現重複時,會對前邊的進行覆蓋

image_1d56tabap1bm422e5cp8071cniap.png-92.5kB

//遍歷(重點!!!)
	//方法1:返回key的集合來遍歷HashMap
	Set keys=hm.keySet();
	for(Object key: keys){
		System.out.println("key->"+key+"  |value->" +hm.get(key));
	}
	
	//方法2:返回所有的value遍歷輸出(無法獲取key)
	Collection values = hm.values();   //返回所有value的集合
	Iterator it = values.iterator();
	while(it.hasNext()) {
		System.out.println("values->"+it.next());
	} 
	
	//方法3: 使用EntrySet完成HashMap的遍歷
	Set entrySet = hm.entrySet();  //返回的是Entry對象的集合,Entry對象中包括了一對kv
	Iterator it2 = entrySet.iterator();
	while(it2.hasNext()) {
		Object obj = it2.next();  //返回的是Object需要向下轉型(父類不能調用子類)
		Entry entry = (Entry)obj;
		System.out.println("key->"+entry.getKey()+" | value->"+entry.getValue());
	}

(3)習題
利用HashMap來完成如下需求:
* 這個字符串中每個字母出現的次數
* key -> value
* a->3 z->2 …

	// 創建對象
	char[] charArray=str.toCharArray();//將str轉爲數組
	HashMap hm = new HashMap();
	
	String str="dhadnhafscfsfdfvdfvdvdsfscs";
	
	for(int i=0;i<charArray.length;i++){
		if(hm.containsKey(charArray[i])){
			//集合中已有這個字符(value值增加1)
			hm.put(charArray[i], (Integer) hm.get(charArray[i])+1);
			//hm的兩個屬性都是對象,所以值需要手動裝箱(集合不支持基本類型)
		}else{
			//第一次遇到這個字符(設置key,value值初始爲1)
			hm.put(charArray[i], 1);
		}			
	}
	//遍歷
	Set aa=hm.keySet();
	for(Object a: aa){
		System.out.println("key->"+a+"  |value->" +hm.get(a));
	}

	![image_1d56svm27p8pvgg1r8teci1qfn9g.png-15.9kB][23]

五 泛型

(1)簡介

//
	 * 在以前的ArrayList中存在一個問題,我在向集合中添加元素的時候
	 * 是所有類型的元素都可以直接添加進去,因爲接受參數的類型是Object
	 * 我在取出元素的時候 的數據類型也是Object
	 * 既然是Object
	 * 那麼當我需要調用子類獨有的屬性和方法的時候 只能向下轉型

image_1d56tr7sfdcqqat1glkh611j7ccq.png-51.5kB

image_1d56tjas41d30b2ojrg1jiirs4bj.png-116.6kB

image_1d56tjq9b149n1ub31a7a6sm37dc0.png-123.8kB

image_1d56tkauaqgugjndikoj11mkvcd.png-62.6kB

(2)代碼操作
image_1d56tte4b1umam85acj9t81d0d7.png-89.8kB

//HashMap在泛型中的使用  申明一個指定key是String類型 value是Student類型的HashMap		
	HashMap<String, Student> hm=new HashMap<String, Student>();
//增--注意提示的數據類型
	hm.put("jack", new Student("jack",20));//未按照指定類型輸入會報錯
	hm.put("rose", new Student("rose",21));
	hm.put("tom", new Student("tom",22));
	hm.put("kathy", new Student("kathy",23));
	hm.put("kate", new Student("kate",24));

image_1d56u3c011p7nesgdmulu7c4qf4.png-105.8kB

	//HashMap遍歷
	//1.利用返回的key集合讀取所有值
	Set<String> keys=hm.keySet();
	//注意 標註強數據類型(否則下一行會出錯,因爲keys的類型不標註還是Object對象)
	for(String key: keys){
		System.out.println("key->"+key+" |value->"+hm.get(key));
	}
	
	
	//2.返回所有的value遍歷輸出(無法獲取key)
	Collection<Student> values=hm.values();
	for(Student value: values){//這裏的value就是stu對象實例化
		System.out.println("name->"+value.getName()+" |age->"+value.getAge());
	}
	
	
	//3.用EntrySet + Iterator完成對HashMap的讀值遍歷
	Set<Entry<String, Student>> entrySet=hm.entrySet();//利用entrySet()方法返回一組kv對應值
	Iterator<Entry<String, Student>> it=entrySet.iterator();//創建entrySet的迭代器
	//需要添加類型
	while(it.hasNext()){
		Entry<String, Student> entry=it.next();
		System.out.println("key->"+entry.getKey()+" |value->"+entry.getValue());
	}		
}

六 Collections集合的工具類的使用

(1)簡介

image_1d56u69581ip0rvsfhak6q1c9jfh.png-176.2kB

(2)常用方法
image_1d56u75vl1jajgc41fd280gmocfu.png-53.9kB
image_1d56ua8n8vv91mo81dod1e26113fgo.png-51.3kB

image_1d56ub4bh13p91ktb8qa18081v94h5.png-40kB

image_1d56u7ppgh4r4d11b0e1hms42bgb.png-38.9kB
image_1d56ueprt9qj1abtknl1kf6sgkii.png-76kB

  • (2-1)對象之間比較大小
  • 步驟:
    1.查看Integer和String的Comparable接口底層代碼後發現,能對比是因爲他們都實現了Comparable接口未實現的方法—繼承Comparable接口,實現其抽象方法
    image_1d56uhj48hcndiq2ehr611igeiv.png-22.4kB
  • 2.發現他的抽象方法不符合實際應用—重寫(借鑑Integer和String的對比代碼)
    image_1d56uicge1nve1h10gqr28f47qjc.png-56.6kB

(2-2)重寫comparator方法

  • 步驟:
  1. 新創建一個類文件
    image_1d56v876d1fn81f9isje1eduaccjp.png-34.2kB
    2.重寫/自定義我們需要的比較方法
    image_1d56v9hmi1hj1fsm1krlchitt8k6.png-16.1kB
    3.根據需要調用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章