09.集合

cookiesDing發表於2024-11-29

集合

image-20241122163640181 image-20241122165916368

Collection(單列集合)

Collection是單列集合祖宗介面,其全部單列集合都可以使用。

建立其實現類的物件。arraylist

boolean add(E e)//增 可重複時,返回值為true  不可重複,若重複返回值為false
boolean remove(E e)//刪   不能透過索引刪除,只能透過物件刪除;成功刪除返回true,失敗返回false
boolean contains(OBJect obj)//查 根據equals進行判斷是否存在 如果集合中儲存對是自定義物件,則需要重寫equals方法  另外字串比較也是equals。
void clear() 
boolean isEmpty()
int size()    

迭代器遍歷時候,不可以使用集合的方法進行增加刪除。可以使用迭代器提供的remove方法刪除。

Iterator<String> it=coll.iterator();
while(it.hasNext()){
    String str=it.next();//next方法獲取元素,並移動指標。
    if("bbb".equals(str)){
        //coll.remove("bbb");
        it.remove();
    }
}

List

定義:有序,可重複,有索引(存取有序)

boolean add(int index,E e)//增
boolean remove(E e)//刪,可以透過索引刪除,將被刪除的元素返回
boolean set(int index,E e)//改
E get(int index)  //返回指定的元素
    

額外新增的方法:迭代器可新增元素

ListIterator<String> it=list.listIterator();
while(it.hasNext()){
    String str=it.next();//next方法獲取元素,並移動指標。
    if("bbb".equals(str)){
        
        list.add("qqq");
    }
}

另外。增強for迴圈中s為臨時變數

for(String s:list){
	s="q";
}
image-20241125205428043

LinkedList

底層資料是雙連結串列,查詢慢,增刪快,操作首尾也很快。

image-20241125211420546

Vector

Set

定義:無序,不重複,無索引

boolean add(E e)//增,不可重複,若新增重複返回值為false
boolean remove(E e)//刪
boolean contains(OBJect obj)//查
void clear() 
boolean isEmpty()
int size()    
Set<String> s=new HashSet<>();
s.add("wang");
s.add("quqi");
s.add("wang");

Iterator<String> it=s.iterator();
while(it.hasNext()){
    String str=it.next();
    System.out.println(str);
}
for(String str:s)
{
   System.out.println(str);
}

HashSet

底層採用hash表儲存。

一般情況下會重寫hashCode方法,不同物件只要屬性值相同,雜湊值就一樣。如果沒有重寫則不同。

如果集合中儲存的是自定義物件,必須重寫hashCode和equals方法

HashSet<Student> hs=new HashSet<>();

TreeSet

不重複,無索引,可排序(從小到大:數值型別,字元,字串ASCII碼錶)

基於紅黑樹實現。

如何比較自定義?

  1. 預設的排序規則 Student實現Comparable介面,重寫裡面的抽象方法。
public class Student implements Comparable<Student>{
    
public int compareTo(Student o) {
    //指定排序規則
    return this.getAge()-o.getAge();//年齡升序
//this表示要新增的元素,o表示紅黑樹存在的元素。 返回值為負,說明新增元素是小的,在左邊,為正,元素是大的,存右邊。
}
    
}
  1. 比較器排序:建立TreeSet物件時候,傳遞比較器Comparator指定規則。
 TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i = o1.getName().length() - o2.getName().length();//按照長度排序
                i = i == 0 ? o1.compareTo(o2) : i;				      //如果一樣長按照首字母排序。(如果長度為0,按照預設比較規則排序)
                return i;											  //如果長度不為0,按照上面相減為準。
            }
        });
image-20241126205256395

Map(雙列集合)

鍵和值一一對應,鍵不可重複,值可以重複。

鍵值對叫做Entry物件。

V put(K key,V value)//增   如果鍵不存在,直接把鍵值對物件加入map集合。如果鍵存在,把原有的鍵值對物件覆蓋,被覆蓋的值返回。
V remove(Object key)//刪    成功刪除返回被刪除的值。
boolean containsKey(Object key)//查
boolean containsValue(Obkect value)//查
void clear()
boolean isEmpty()
int size()

Map遍歷方法

鍵找值 :

map.keySet(); set集合包含key物件

map.get(key)

Map<String,String> map=new HashMap<>();

map.put("曲奇","安子");
map.put("安子","曲奇");

Set<String> keys=map.keySet();//獲取所有的物件,把鍵放到一個集合中。
       for (String key : keys) {
           System.out.println(key);
           String value=map.get(key);//get查詢鍵對應的值
           System.out.println(key+"=" +value);
       }

Iterator<String> it=keys.iterator();
       while(it.hasNext())
       {
           String str=it.next();
           String value=map.get(str);
           System.out.println(str+"="+value);
       }

鍵值對

map.entrySet();set集合包含Entry物件 ctrl alt v自動補全程式碼

entry.getKey();

entry.getValue();

Set<Map.Entry<String, String>> entries = map.entrySet();//透過方法獲得所有鍵值物件,返回set集合

 for(Map.Entry<String, String> entry:entries){//遍歷集合,獲得所有鍵值對物件
            String key=entry.getKey();
            String value=entry.getValue();//利用entry呼叫get
            System.out.println(key+"="+value);
        }

 Iterator<Map.Entry<String, String>> iterator = entries.iterator();
        while(iterator.hasNext())
        {
            Map.Entry<String, String> entry = iterator.next();
            String key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+"="+value);

        }

HashMap

不重複,無索引,無序。

底層和hashSet完全一樣,雜湊表結構(長度為16,預設載入因子為0.75的陣列)

利用鍵計算雜湊值。

如果鍵儲存為自定義物件,需要重寫hashCode和equals方法。值不需要。

底層原理

TreeMap

不重複,無索引,可排序(預設/自定義)

和TreeSet底層原理一樣,都是紅黑樹結構。

TreeMap<Integer, String> tm = new TreeMap<>();//打出new TreeMap使用ctrl alt v
TreeMap<Integer, String> tm = new TreeMap<>(new Comparator<Integer>() {//ctrl+p 檢視形參,new comparator補齊
           @Override
           public int compare(Integer o1, Integer o2) {
               return 0;
           }
       });

如何比較自定義?

  1. 預設的排序規則 Student實現Comparable介面,重寫裡面的抽象方法。
  2. 比較器排序:建立TreeSet物件時候,傳遞比較器Comparator指定規則。

例子:統計字串中每個字元出現個數。

String s="aacdbbdc";

TreeMap<Character,Integer> tm=new TreeMap<>();
for(int i=0;i<s.length();i++)
{
    char c=s.charAt(i);

    if(tm.containsKey(c)){
       int count=tm.get(c);
       count++;
       tm.put(c,count);
    }else{
        tm.put(c,1);
    }
}
System.out.println(tm);

可變引數

方法形參的個數可以發生變化,格式:屬性型別 ...名字//int...args

在方法中,其他形參放在前面,可變引數寫在最後

public static int getSum(int...args){

}

泛型

泛型不能寫基本資料型別,要寫必須寫其包裝類。如數字:Integer。

指定泛型型別後,傳遞資料時可以傳入子類型別。

如果不寫型別則預設為Object類。

public static void main(String[] args) {
    ObjectBox objectBox=new ObjectBox();//box物件
    Apple apple=new Apple();//蘋果物件
    objectBox.setContent(apple);//新增蘋果

    Apple content= (Apple) objectBox.getContent();//取出物件為object類,需要強制轉換為apple類
}
public class ObjectBox {
    private Object content;//Object類

    public Object getContent() {
        return content;
    }

    public void setContent(Object content) {
        this.content = content;
    }
}

取出物件為object類,需要強制轉換為apple類.

泛型類

透過泛型類可以直接獲得

public class GenericBox<T> {//泛型T
    private T content;

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }
}
GenericBox<Apple> genericBox=new GenericBox<>();//泛型apple
Apple apple=new Apple();
genericBox.setContent(apple);

Apple content= genericBox.getContent();//直接獲得apple類

泛型方法

要定義泛型方法,請將泛型型別引數放在返回值之前

public static <T> void printArray(T[] x)
{
    for(T ele:x)
    {
        System.out.println(ele);
    }
}
Apple[] apples=new Apple[2];
printArray(apples);

泛型萬用字元

泛型不可以繼承,但是泛型的資料可以繼承。

ArrayList<Ye> list1=new ArrayList<>();
ArrayList<Fu> list2=new ArrayList<>();
ArrayList<Zi> list3=new ArrayList<>();
list.add(new Ye());//dui

method(list1);//泛型裡面寫什麼型別,只能傳遞什麼型別資料(public static void method(ArrayList<Ye> list))
method(list2);
method(list3);

萬用字元:? 進行型別限定

<?extends E> 表示可以傳遞E和所有子類

<? super E> 表示傳遞E和所有父類

工具類

定義

工具類是為了提供一些通用的、某一非業務領域內的公共方法,僅僅是作為工具方法被使用。所以將它做成靜態方法最合適,不需要例項化。

如果要例項化一個工具類,就需要一定的記憶體空間,工具類提供的是靜態方法,透過類就能呼叫,所以不必浪費記憶體去例項化工具類物件。

public final class Math {  
    /**  
     * Don't let anyone instantiate this class.  
     */  
    private Math() {}  
} 

設定建構函式為private訪問許可權,表示除了類本身外,誰都不能產生一個例項,因此,其他類只能透過類名來訪問,不能透過例項物件訪問。而由於工具類中都提供靜態方法,所以可以透過類進行訪問。

Collections

是集合的工具類。

addAll(Collection<T> c,T...elements)  //批次參加元素
shuffle(List<?>list)//打亂順序    
sort(List<T> list)
sort(List<T> list,Comparator<T> c)
copy(List<T>dest,List<T>src)//複製

紅黑樹

相關文章