banner
Onei

Onei

github
nintendo switch
discord server
steam
pixiv
bento
follow

集合

🗃️ 集合#

一些方法#

  • add()
  • addAll()
  • remove()
  • removeAll()
  • clear()
  • isEmpty()
  • contains()

contains 和 remove 都會調用 equals 方法

如果集合中存放基本數據類型 一定要將其裝箱為基本類型包裝類

沒有提供修改和查詢的方法

class-and-interface-hierarchy

🔍 迭代器#

迭代器

主要做遍歷操作 使用迭代器可以屏蔽數據結構之間的差異性異性

  • hasNext()
  • next()
  • remove()

迭代器一旦生成 集合將不能被修改 否則需要重新生成迭代器

增強 for 循環#

迭代器的簡寫方式 同樣不能刪除

🐾 列表#

有序 可重複

ArrayList#

底層為 Object 數組 查詢修改效率高

  • add(index,items)
  • set(index,items)
  • size()

LinkedList#

底層為雙向鏈表 隨機添加和刪除效率高

  • add(index,items)
  • set(index,items)
  • size()

🍊 集合#

無序(不保證數據的添加和取出順序一致)
不可重複(重複後不會再添加)

TreeSet#

底層為TreeMap

TreeMap底層為紅黑樹 添加的元素會按照一定格式自動排序

TreeMap中添加的數據都有比較器

因此我們如果要添加沒有比較器的對象或者自定義的對象時會出錯。另外因為排序需要比較,所以只能添加同類型數據

  • 數字 大小升序
  • 字符串 每一位 ASCII 碼
  • Date 自然日期

HashSet#

底層為HashMapK部分

HashMap底層為散列表

🤼‍♀️ Comparable#

比較器 被添加的TreeSet元素需要實現 Comparable 接口並重寫接口中的compareTo()方法
compareTo()方法返回值代表排序規則
添加元素時會調用元素對象的compareTo()方法把集合中的元素傳入進行比較
如果==0 说明重複,不添加
如果<0 说明要添加的元素小,向前放
如果>0 说明要添加的元素大,向後放

import java.util.TreeSet;

public class Tree {
  public static void main(String[] args) {
    TreeSet<Object> tree = new TreeSet<>();
    tree.add(new User("張三",18));
    tree.add(new User("李四",13));
    tree.add(new User("王五",32));
    tree.add(new User("趙六",11));
    System.out.println(tree);
  }
}

class User implements Comparable {
  private String name;
  private int age;

  public User() {
  }

  public User(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "User [name=" + name + ", age=" + age + "]";
  }

  @Override
  public int compareTo(Object o) {
    if (o instanceof User) {
      User u = (User) o;
      // this.getAge() - u.getAge() 大於 1 升序排序
      return this.getAge() - u.getAge();
    }
    return 0;
  }
}

🍭 Comparator#

比較器類 要添加的元素不需要實現這個接口

Integer 類中有默認升序的比較方法,假如想要降序的時候可以通過實現Comparator接口來重新定義排序規則;或者把不能排序的Object對象 (沒有實現Comparable接口) 保存在TreeSet中時,還是需要 Comparator 來進行比較
當保存的元素不能排序(沒有實現Comparable接口)或者排序規則不符合我們的需求時均可實現Comparator接口並重寫compare()方法進行排序

Comparator 比較器和 Comparable 比較器同時存在時,Comparator優先級高於Comparable

此處體現了對修改關閉 對擴展開放

與匿名類同時使用#

import java.util.Comparator;
import java.util.TreeSet;

@SuppressWarnings("all")
public class UnNamed {
  public static void main(String[] args) {
    // TreeSet<Object> tree = new TreeSet<>(new MyComparator());
    // 匿名類 常用在比較器中
    TreeSet<Object> tree = new TreeSet<>(new Comparator() {
      @Override
      public int compare(Object o1, Object o2) {
        if (o1 instanceof Integer && o2 instanceof Integer) {
          // o1 是要添加的元素
          // System.out.println(o1);
          // o2 是集合中的元素
          // System.out.println(o2);

          Integer i1 = (Integer) o1;
          Integer i2 = (Integer) o2;
          // 10-9 降序排列
          return i2 - i1;
        }
        return 0;
      }
    });
    tree.add(11);
    tree.add(7611);
    tree.add(1);
    tree.add(100);
    tree.add(660);
    tree.add(98);
    System.out.println(tree);
  }
}

class MyComparator implements Comparator {
  @Override
  public int compare(Object o1, Object o2) {
    if (o1 instanceof Integer && o2 instanceof Integer) {
      // o1 是要添加的元素
      // System.out.println(o1);
      // o2 是集合中的元素
      // System.out.println(o2);

      Integer i1 = (Integer) o1;
      Integer i2 = (Integer) o2;
      // 10-9 降序排列
      return i2 - i1;
    }
    return 0;
  }
}

〽️ 列表排序#

Collections.sort(list) 排序方法
void sort(Comparator<? super E> c)也可傳入Comparator對象使用List的排序方法

🔗 散列表 / 哈希表#

用於存儲鍵值對映射關係 存儲方式為數組中保存鏈表 用於解決哈希衝突問題
鏈表節點中保存四個屬性:

  • hash 值
  • key
  • value
  • next 指針

哈希表

✔️ 泛型#

類型檢查

不使用泛型時集合中可以存儲任意類型的數據,且數據均會轉型為 Object 類型
缺點:獲取時會得到為 Object 類型的數據,使用對象特有屬性時需要強制類型轉換(向下轉型)

使用泛型之後集合中只能保存單一類型的數據
優點:由於保存數據的類型一致,所以使用的時候不需要向下轉型
缺點:只能保存單一數據類型
而且傳入的泛型類型只能為引用類型不能寫基本類型

public class Generic {
	public static void main(String[] args) {
		MyClass myClass = new MyClass();
		myClass.method(1);
		myClass.method("xx");
		MyClass<String> mm = new MyClass<String>();
		mm.m1("xxx");
		// mm.m1(123);
	}
}

// 如果設置泛型後不傳入數據類型默認為 Object 類型
class MyClass<T> {
	public void method(T obj) {
		System.out.println(obj);
	}
}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。