1. 程式人生 > >JAVA類集(1)簡單操作

JAVA類集(1)簡單操作

本博文將簡單簡單講解JAVA類集的使用.
在整個JAVA類集中,最常用的類集介面是:
Collection,List,Set,Map,Iterator,ListIterator,Enmueration,SortedSet,SortedMap,Queue,Map.Entry
這裡寫圖片描述

這些介面的繼承關係如下:

這裡寫圖片描述

提示:SortedXX介面都是可排序的介面.

一. Collection介面

collection是單值儲存的最大父介面

這裡寫圖片描述
這裡寫圖片描述

在開發中,往往很少直接使用Collection介面,而是使用其子介面,其子介面有:List,Set,Queue,SortedSet
List:可以存放重複內容
Set:不能存放重複內容,重複物件需使用hashCode()和equals()方法
Queue:佇列介面
SortedSet:可以對集合中的資料進行排序

二. List介面

List是Collection的子介面,儲存了許多重複的內容,但List也擴充套件了Collection介面,定義了更多的方法.

這裡寫圖片描述

List也是一個介面,要想使用List,必須使用其子類進行例項化.

2.1 子介面—ArrayList

ArrayList是List的介面,可以直接使用ArrayList為List介面例項化.

向集合中增加元素:

            //Collection的方法
            public boolean add(E o);
            public boolean addAll(Collection<? Extends E> c);
            //也可以直接使用List特有的方法
public void add(int index,E element);

刪除元素:

            //Collection的方法
            public boolean remove(Object o);
            public boolean removeAll(Collection<?> c);
            //也可以直接使用List特有的方法
            public E add(int index);

注意:
如果自定義的類使用上述方法進行刪除元素,則必須覆寫Object類的equals()和hashCode()方法.

輸出List中的內容:

            //使用兩個方法在配合for迴圈可以遍歷List的輸出
            //collection中的size()
            //List中的get(int index)

將集合變為物件陣列

             //Collection的toArray()方法

2.2 Vector

從JAVA的整個發展歷程來看,Vector是一個元老級的類,在JDK1.0就 已經存在.到了JAVA2之後,重點強調了集合框架的概念,所以定義了很多新的介面,但是考慮到一部分人已經習慣了使用vector,所以就讓其實現了List介面,將其保留了下來.

如果直接使用Vector例項化List,那麼其使用與ArrayList沒沒有太大差別,但是Vector由於出現比較早,其自身也有一些List沒有的方法.

ArrayList與Vector的區別:

這裡寫圖片描述

2.3 LinkedList介面與Queue介面

LinkedList表示連結串列類,Queue表示的是佇列操作,採用先進先出(FIFO)的方式操作.
定義如下:

這裡寫圖片描述

可以看出,不但實現了List介面,還實現了Queue介面

這裡寫圖片描述

LinkedList除了具有上述佇列的方法之外,還具有以下連結串列的操作方法:

這裡寫圖片描述

三. Set介面

Set也是Collection的子介面,但是Set並未對Collection進行擴充套件,只是比Collection介面的要求更加嚴格了,不能增加重複元素.
此外,Set不能像List那樣進行雙向輸出,因為此介面沒有像List介面的get(int index)方法.

3.1 HashSet

HashSet特點:元素不重複,雜湊儲存沒有順序,集合的輸出順序並不是集合的儲存順序

3.2 TreeSet

TreeSet特點:元素不重複,有序儲存,向集合中插入時無序,但輸出時有序

3.3 關於TreeSet的排序說明

如果自定義的類要對TreeSet中的元素進行排序,因為TreeSet中的元素是有序排放的,所以對於一個物件必須指定其排序規則,且TreeSet每個物件所在的類都必須實現Comparable接口才能正常使用.

自定義Person1類:

class Person1 implements Comparable<Person1>{
    private String name;
    private int age;
    public Person1(){}
    public Person1(String name , int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "姓名:" + this.name + "  年齡:" + this.age;
    }
    @Override
    public int compareTo(Person1 p) {
        if(this.age > p.age)
            return 1;
        else if(this.age < p.age)
            return -1;
        else
            return this.name.compareTo(p.name);
    }       
}
package cn.mysql;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class CollectionDemo {

    public static void main(String[] args) {
        Set<Person1> tree = new TreeSet<Person1>();
        tree.add(new Person2("張三",26));
        tree.add(new Person2("李四",25));
        tree.add(new Person2("王五",20));
        tree.add(new Person2("馬六",26));
        tree.add(new Person2("張三",26));
        tree.add(new Person2("王五",27));
        tree.add(new Person2("趙七",26));
        System.out.println(tree);
    }
}

以上程式碼可以去掉重複元素,但是靠Comparable實現的,如果換成hashSet則還會出現重複的內容,如果要想真正去掉重複元素,必須深入研究Object類.

要想去掉重複元素,必須首先進行物件是否重複的判斷,而要想進行這樣的判斷,就必須覆寫Object類的equals()方法,才能完成物件是否相等的判斷,而且只覆寫equals()是不夠的,還要覆寫hashCode()方法,以求出不會重複的雜湊碼值.

自定義Person2類:

class Person2{
    private String name;
    private int age;
    public Person2(){}
    public Person2(String name , int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "姓名:" + this.name + "  年齡:" + this.age;
    }
    @Override
    public boolean equals(Object p) {
        if(this == p)
            return true;
        if(!(p instanceof Person2))
            return false;
        Person2 pp = (Person2)p;
        if(this.name.equals(pp.name) && this.age == pp.age)
            return true;
        else
            return false;
    }
    @Override
    public int hashCode() {
        return this.name.hashCode() * this.age;
    }

}

package cn.mysql;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class CollectionDemo {

    public static void main(String[] args) {
        Set<Person2> tree = new HashSet<Person2>();
        tree.add(new Person2("張三",26));
        tree.add(new Person2("李四",25));
        tree.add(new Person2("王五",20));
        tree.add(new Person2("馬六",26));
        tree.add(new Person2("張三",26));
        tree.add(new Person2("王五",27));
        tree.add(new Person2("趙七",26));
        System.out.println(tree);
    }
}

$$ : 一個完整的類,最好覆寫Object類的toString(),hashCode()和equals()方法