集合基礎

来源:https://www.cnblogs.com/fjfsu/archive/2018/12/28/10182902.html
-Advertisement-
Play Games

集合類的由來: JAVA是面向對象的,對象用來封裝特有數據,對象多了就需要儲存起來,當對象的個數不確定的時候,那麼就用集合容器進行存儲。 集合的特點: 1.集合的長度是可變的 2.用於存儲對象的容器 3.不可以存儲基本數據類型 體系: 集合容器因為內部的數據結構不同,有多種具體容器,不斷的向上提取, ...


集合類的由來:

     JAVA是面向對象的,對象用來封裝特有數據,對象多了就需要儲存起來,當對象的個數不確定的時候,那麼就用集合容器進行存儲。

集合的特點:

  1.集合的長度是可變的

  2.用於存儲對象的容器

  3.不可以存儲基本數據類型

體系:

  集合容器因為內部的數據結構不同,有多種具體容器,不斷的向上提取,形成了集合框架。

 Collection介面:

  常見的方法

  1.增加 

boolean add(Object obj)//添加一個對象
boolean addAll(Collection coll)//添加一個集合

  2.刪除

boolean remove(Object Obj)//刪除一個對象
boolean removeAll(Collection coll)刪除集合中所有與coll相同的對象
void clear()清空

  3.判斷

boolean contains(Object Obj)//判斷一個對象是否存在
boolean containsAll(Collection coll)//判斷集合中是否擁有coll總的所有對象
boolean isEmpty()//奇怪的很,沒有元素返回true

  4.獲取

int size()//獲取對象的個數
Iterator iterator()//獲取對象,下麵的代碼是這個方法的實現

Iterator介面

  對集合進行迭代迭代器

  這個介面是對所有的Collection容器進行元素獲取的公共介面

  hasNext()如果next仍然有元素可以迭代,就返回true

  next()返回迭代的下一個元素

方法一:

            Iterator it = coll.iterator();
	    while(it.hasNext()){
		System.out.println(it.next());
	    }        

方法二:節約空間,常用

for(Iterator it = coll.iterator();it.hasNext();){
			System.out.println(it.next());
}

這種迭代的獲取與直接列印( print(coll) )的區別在於,列印的是一串字元串,而迭代取得是單獨的對象,可以對他們單獨處理

  5.其他

boolean retainAll(Collection coll)//取交集,刪除與coll集合中不同的元素
Object  toArray()//將集合轉成數組

List:

  1.有序(存入和取出順序一致)

  2.元素都有索引(腳標)

  3.元素可以重覆

常用子類:

  1.Vector:內部是數組數據結構,同步的,增刪查詢都很慢。(基本淘汰)

  2.ArrayList:內部是數組數據結構,不同步的,代替了Vector。查詢很快

  3.LinkedList:內部是鏈表數據結構的,不同步的。增刪很快

常見的方法:

  1.添加

void add(index,element)//在指定的位置插入對象
void add(index,collection)//在指定的位置插入集合

  2.刪除

Object remove(index)//刪除指定位置的對象,返回值為被刪除的對象

  3.修改(只有List才具有增刪改查,collection都不具備)

Object set(index,element)//返回值為被修改的對象,即修改前的對象

  4.獲取

Object get(index)//返回值為獲取的對象
List subList(from,to)//返回指定範圍的對象
int indexOf(Object)//返回對象的位置,從頭開始找
int lastIndexOf(Object)//返回對象的位置,從尾開始找

  

list特有的取出元素的方法(只有list有set不具備):

		for(int x=0;x<list.size();x++){
			System.out.println(list.get(x));
		}

  

ListIterator:

  1.Iterator的子介面

  2.可以實現在迭代過程中完成對元素的操作(增刪改查)註意:只有List集合具備該迭代功能

如果有下麵的代碼(在迭代的過程中,增加元素)

		 Iterator it =list.iterator();
		 while(it.hasNext()){
			 Object obj=it.next();
			 if(obj=="b"){
				 list.add("e");
			 }else{
				 System.out.println(obj);
			 }
		 }

  這裡會發生異常,原因是在迭代的過程中,操作集合,產生了併發。

解決問題:

  1.在迭代的時候不能操作集合,容易產生異常

  2.使用ListIterator介面來完成在迭代過程中對元素的更多的操作

		 ListIterator it = list.listIterator();//獲取列表迭代器對象
		 while(it.hasNext()){
			 Object obj=it.next();
			 if(obj=="b"){
				 it.add("e");
				 System.out.println(obj);
			 }else{
				 System.out.println(obj);
			 }
		 }
		 while(it.hasPrevious()){//如果前一個任然有元素可以迭代,那麼就返回true
			 System.out.println(it.previous());//返回前一個元素
		 }

  

Vector:

​   Enumeration:

    ​ 1.這個介面淘汰了,基本不用

​     2.這個介面的功能與Iterator介面的功能是重覆來的

​     3.Iterator介面添加了一個可選的移除操作,並且使用了較短的方法名。

  ​   4.新的實現應該考慮優先使用Iterator介面而不是Eumeration介面

​     elements:這個方法與List中的iterator方法有異曲同工之妙

        Vector ve=new Vector();
        ve.addElement("a");
        ve.addElement("b");
        ve.addElement("c");
        Enumeration em=ve.elements();
        while(em.hasMoreElements()){
            System.out.println(em.nextElement());
        }
        Iterator it=ve.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
//這兩個方法的作用基本一樣,但是前一種基本上是淘汰了

LinkedList:

​   1.內部是鏈表數據結構,是不同步的,增刪很快

​   2.堆棧:先進後出

​     隊列:先進先出

​   3.常用方法

​     增加:

      ​ boolean add( Collection<? extends E> c)//在結尾添加一個元素

​       boolean addAll(int index, Collection<? extends E> c)//在指定位置插入一個集合

​       void addFirst(E o)//在開頭加入一個元素

      ​ void addLast(E o)//在結尾加入一個元素

​     刪除:

      ​ void clear()

​       E remove()

​     獲取:

      ​ E getFirst()

​       E peek();

​     修改:

​       Object set(index,Objcet)

ArrayList:

下麵的代碼中的強轉問題,可能會涉及到自動裝箱問題,在這裡也是可以使用的

        ArrayList ar=new ArrayList();
        Person a=new Person(19,"lao1");
        Person b=new Person(16,"lao2");
        Person c=new Person(11,"lao3");
        ar.add(a);
        ar.add(b);
        ar.add(c);
        for(Iterator it=ar.iterator();it.hasNext();){
            //System.out.println(((Person)it.next()).getAge()+((Person)it.next()).getName());
            //輸出肯定是有問題的一直在next
            //所以解決方法如下
            Person d=(Person) it.next();//強轉的原因是,在Aar.add()添加的時候,是使用Object接收的,所以person已經變成了上帝
            System.out.println(d.getAge()+d.getName());
        }

Set:

​   1.Set介面中的方法和Collection一致

  ​ 2.Set獲取元素的方法只有迭代器

​   3.常用實現子類HashSet,TreeSet

​   4.元素不可重覆,無序(但是可以做到有限的有序)

HashSet:

  ​ 1.內部數據結構是哈希表,不同步

  ​ 2.如何保證該集合的元素唯一性呢?

​     a.通過對象的hashCode和equals方法來完成對象的唯一性

​     b.如果對象的hashCode值不同,那麼不用判斷equals方法,直接存儲到嘻哈表中(int hashCode();boolean equals(Object obj))

​     c.如果對象的hashCode值相同,那麼要再次判斷對象的equals方法是否為true,true則視為相同元素,不存。

​     d.重點:如果元素要存儲到HashSet集合中,必須覆蓋hashCode方法和equals方法;一般情況下如果定義的類會產生很多對象,比如人,學生,書,通常都需要覆蓋這兩個方法,建立對象判斷是否相同的依據。

​     e.擴展:Arraylist(如果要確保元素唯一的話)判斷的依據是equals,而HashSet判斷hashcode和equals

LinkedHashSet:

  1.HashSet的直接已知實現子類

​     2.可以在唯一的情況下排序,怎麼進就怎麼出

        HashSet/LinkedHashSet ha=new LinkedHashSet();
        ha.add("a");
        ha.add("d");
        ha.add("s");
        for(Iterator it=ha.iterator();it.hasNext();){
            System.out.println(it.next());
        }
//所以需要有序唯一的話可以直接使用LinkedHashSet類

TreeSet:

​   1.可以對set集合中的元素排序。是不同步的

​   2.判斷元素唯一性的方式:就是根據比較方法返回結果是否為0,如果為0,就是相同元素,則不存儲(所以要實現Comparable介面,覆蓋compareTo方法元素和集合實現都可以;一般在做這一步的時候,也一起把排序給做了)

​   3.排序的兩種方法

​     a.讓元素自身具備比較功能

​     b.讓集合自身具備比較功能(1.如果不按照對象具備的自然順序排序2.對象不具備自然順序;這兩種情況時使用該功能)

​   4.比較器(即b)

​     定義一個類實現Comparator介面,覆蓋compare方法,將該類對象最為參數傳遞給TreeSet集合的構造函數

 //比較器,按照名字
class ComparatorByName implements Comparator {
        public int compare(Object o1, Object o2) {
            Person p1 = (Person)o1;
            Person p2 = (Person)o2; 
            int temp = p1.getName().compareTo(p2.getName());    
         return temp==0?p1.getAge()-p2.getAge(): temp;
        }
}
​
//比較器,按照年齡
class ComparatorByLength implements Comparator {
    public int compare(Object o1, Object o2) {
        Person s1 = (Person)o1;
        Person s2 = (Person)o2;
        int temp = s1.getAge()-s2.getAge();
        return temp==0? s1.compareTo(s2): temp;
    }
​
}
        TreeSet tr=new TreeSet(new ComparatorByLength());//比較器的使用方法
        Person a=new Person("lao3",11);

  

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在工廠模式中,我們沒有創建邏輯暴露給客戶端創建對象,並使用一個通用的介面引用新創建的對象。 1.創建Shape介面 2.創建多個Shape實現類(這裡創建了3個) 3.創建工廠 4.使用工廠通過傳遞類型等信息來獲取具體類的對象 5.輸出結果如下: ...
  • 本文可能是你看過的最易懂的訪問者設計模式的文章之一,以示例為基礎,不斷演化,深入訪問者模式的內核,給出了訪問者模式的意圖,結構,示例代碼。 ...
  • 組合模式的定義 定義: 將對象組合成樹形結構以表示 "部分-整體" 的層次結構,使得用戶對單個對象和組合對象的使用具有一致性. 通俗的說, 就是實現了樹形結構 通用類圖如下: 其中的三個角色如下: 抽象構件角色代碼: 樹枝構件代碼: 葉子構件代碼: 場景類代碼: 組合模式的應用 組合模式的優點: 組 ...
  • 適配器模式的定義 定義: 將一個類的介面變換成客戶端所期待的另一種介面, 從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作. 通俗的說, 就是有 A、B兩個介面, 現在要求把A和B安裝在一起使用, 兩者的介面不一致, 怎麼辦? 引入一個物體C, 如下圖: 引入C物體後, C適應了A的介面 ...
  • 很多人在編程時,總是喜歡用一下方法將數組轉為字元串:(a為byte數組) String s=a.toString(); 可是每次返回的時候,新手看來返回的結果是亂碼,比如說我,寫RSA演算法時,沒有註意,就以為是解密出來的亂碼(哈哈哈),但其實[B@1b6d3586 為棧地址值,這個時候要知道對於返回 ...
  • 九大內置對象: out 最常用的Println()方法,輸出 config 基本沒啥用 page 當前jsp頁面實例跟this一樣 pageContext 只有當前頁面才可以獲取 exception 錯誤頁可以使用它 request 與Servlet中request一樣沒有區別 response 與 ...
  • 寫在前面 對一個爬蟲愛好者來說,或多或少都有這麼一點點的 ~ 發現好的圖片,發現好的書籍,發現各種能存放在電腦上的東西,都喜歡把它批量的爬取下來。 然後放著,是的,就這麼放著.......然後慢慢的遺忘掉..... 爬蟲分析 打開網址 發現特別清晰的小頁面,一看就好爬 在點擊一本圖書進入,發現下載的 ...
  • 為什麼要統一返回值 在我們做後端應用的時候,前後端分離的情況下,我們經常會定義一個數據格式,通常會包含 ,`message data`這三個必不可少的信息來方便我們的交流,下麵我們直接來看代碼 ReturnVO 在這裡,我提供了幾個構造方法以供不同情況下使用。代碼的註釋已經寫得很清楚了,大家也可以應 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...