天天看點

【Java總結-集合】Java集合的Collection接口,ArrayList,LinkedList,HashSet,TreeSetJava集合Java的Collection接口

Java集合

  1. Collection接口
  2. Map接口:具有映射關系的“key-Value對”,類似于函數,一個key對象一個Value

Java的Collection接口

Collection接口關系圖:

【Java總結-集合】Java集合的Collection接口,ArrayList,LinkedList,HashSet,TreeSetJava集合Java的Collection接口
  1. Set接口:元素沒有順序,不可以重複的結合類似高中的集合
  2. List接口:元素有順序,但是可以重複動态數組

結合元素的周遊

使用Itertor接口

适用于所有的Collection對象,包括其子接口實作類的對象

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

使用增強for循環

for(Person p : persons) {//persons為集合
    System.out.println(p.getName());
}
           

List接口

特點:元素有順序,可以重複

ArrayList

ArrayList類是List的一個實作類,線程不安全的,底層是使用的變長數組

LinkedList

LinkedList是List的一個實作類,對于頻繁的插入删除操作,建議使用LinkedLIst,底層使用的連結清單

Vector

線程安全的,太老了,不建議使用

Set接口

特點:元素沒順序,不可以重複

HashSet

HashSet是Set接口的一個典型實作,大多數使用Set的時候都是使用這個類的

特點:

  1. 不能保證元素的排列順序,周遊是列印出來的不一定是插入的順序
  2. HashSet不是線程安全的
  3. 集合元素可以是null

關于存儲順序

當想HashSet集合中存放一個元素的時候,HashSet會調用該對象的HashCode()方法來得到該對象那個的hashcode值決定這個對象存儲的位置。

判斷兩個元素相等:

兩個對象通過HashCode()方法比較相等,并且兩個對象的equals()方法傳回也要相等

是以Set集合要求重寫對象的equals()方法和HashCode()方法。

LinkedHashSet

  • LinkedHashSet是HashSet的子類
  • LinkedHashSet根據元素的HashCode值來決定元素的存放位置,但是他使用的是連結清單,是以周遊的時候,看起來元素還是按照原來插入順序儲存的
  • 插入性能低,通路性能高

TreeSet

TreeSet是SortedSet接口的實作類,插入的元素會按照一定的規則排列順序

  1. 往裡添加的元素必須是同一個類型的,要麼全是integer類型要麼我全是String類型的。
  2. 可以按照指定的順序周遊,像String是按照從小到大的順序周遊的
  3. 對于自定義的類周遊,必須實作排序方式,不然TreeSet不知道按照什麼方法周遊元素,是以插不進去,
  4. 自定義類有兩種方法,1,自然排序 2,定制排序 (定制排序)關于這兩個排序參考筆記(TreeSet中的自然排序和定制排序)
  5. 往TreeSet中添加元素的時候會首先比較compareTo()方法,一旦傳回0,雖然兩個對象僅僅此屬性相同,但是程式還是會認為這兩個元素是相同的,是以後面那個元素無法插入集合中!
  6. 添加到treeSet中的元素類必須保證compareTo()方法,HashCode()方法還有equals()方法一緻

TreeSet有兩種排序方式

要想插入TreeSet中,對象必須至少實作了下面兩種排的中一種,這樣集合才知道怎麼排列這些元素,并且插入的這個元素必須是同一種類型

1. 自然排序(預設情況)

2. 定制排序

自然排序

  1. 實作Comparable接口
  2. 重寫compareTo()方法
  3. 重寫hashCode(),equals()方法
  4. 保證compareTo(),hashCode(),equals()方法一緻
public class Employee implements Comparable{
    private String name;
    private int age;
    private MyDate birthday;
    //重寫compareTo方法
    @Override
    public int compareTo(Object o) {
        if(o instanceof Employee) {
            Employee e = (Employee)o;
            return this.getName().compareTo(e.getName());
        }
        return ;
    }
    //重寫hashCode()方法
    @Override
    public int hashCode() {
        final int prime = ;
        int result = ;
        result = prime * result + age;
        result = prime * result
                + ((birthday == null) ?  : birthday.hashCode());
        result = prime * result + ((name == null) ?  : name.hashCode());
        return result;
    }
    //重寫equals()方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (age != other.age)
            return false;
        if (birthday == null) {
            if (other.birthday != null)
                return false;
        } else if (!birthday.equals(other.birthday))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }   
}
           

定制排序

TreeSet的自然排序是根據元素大小進行升序排列的,如果想要按照降序排列的話就需要定制排序

  1. 構造TreeSet對象的時候,将COmparator接口的執行個體作為形參,傳遞給TreeSet的構造器
  2. 重寫compare方法
  3. compare(T t1, T t2);傳回0則t1 = t2; 傳回1 則t1 > t2
TreeSet set = new TreeSet(new Comparator() {
    //重寫compare方法
    @Override
    public int compare(Object o1, Object o2) {
        if(o1 instanceof Employee && o2 instanceof Employee) {
            Employee e1 = (Employee)o1;
            Employee e2 = (Employee)o2;
            return e1.getName().compareTo(e2.getName());
        }
        return ;
    }

});