Java集合(二)

Java集合(二)

一、set接口

  1. set接口是Collection的子接口,set接口沒有提供額外的方法,但實現set接口的容器類中的元素是沒有順序的,而且不可以重複。
  2. set容器可以與數學中的“集合”的概念相對應
  3. Java api中所提供的set容器類有hashSet,treeSet等等。

示例如下:

public class SetTest {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add("hello");
        set.add("hi");
        set.add(new Integer(103));
        set.add("hi");//相同的元素不會被添加
        System.out.println(set);
    }
}

輸出結果:
輸出結果
set集合是沒有順序的,而且兩個對象不能equals,也就是說兩個相等的元素只會添加一次。

二、List接口

  1. List接口是Collection的子接口,實現List接口的容器類中的元素是有順序的,而且可以重複(如果元素之間equals的話,也可以正常添加)
  2. List容器中的元素都對應一個整數型的序號記載其在容器中的位置,可以根據序號存取容器中的元素。
  3. J2SDK所提供的List容器類有ArrayList,LinkedList等。
  4. List常用的方法如下:
Object get(intt index);//把index位置上的元素返回,返回值爲object
Object set(int index,Object element);//把index位置上的元素設置爲element元素,返回舊的元素
void add(int index,Object element);//在index位置上添加一個element對象
Object remove(int index);//去除index位置上的元素
int indexOf(Object object);//object在容器裏出現在第幾個位置
int lastIndexOf(Object object);//object對象最後一次出現在容器的第幾個位置

示例如下:

public class ListTest {
    public static void main(String[] args) {
        List<String> l1 = new LinkedList();
        for(int i = 0;i <= 5;i++){
            l1.add("a" + i);
        }
        System.out.println(l1);
        l1.add(3,"a100");//在第三個位置上添加a100
        System.out.println(l1);
        l1.set(6,"a200");//把第六個位置上設置成a200
        System.out.println(l1);
        System.out.println(l1.get(2));
        System.out.println(l1.indexOf("a3"));//a3出現在第幾個位置
        l1.remove(1);//移除第一個位置上的元素
        System.out.println(l1);
    }

輸出結果:
運行結果

三、List常用算法

java.util.Collections(這是Collections類,不要和collection接口混淆)提供上了一些靜態方法,實現了基於List容器的一些常用算法。

void sort(list)//對list容器內的元素排序
void shuffle(list)//隨機排序
void reverse(list)//逆序
void fill(list,object)//用一個特定的對象重寫整個list容器
void copy(List dest,List src)//將src中的元素全部拷貝到dest中
int binarySearch(List,Object)//對於已經排好序(從大到小或者從小到大)的list容器,採用折半查找的方法查找特定對象

示例如下:

public class CollectionsTest {
    public static void main(String[] args) {
        List<String> l1 = new LinkedList();
        List l2 = new LinkedList();
        for(int i = 0;i <= 9;i++){
            l1.add("a"+i);
        }
        System.out.println(l1);
        Collections.shuffle(l1);//隨機排列
        System.out.println(l1);
        Collections.reverse(l1);//逆序排列
        System.out.println(l1);
        Collections.sort(l1);//排序
        System.out.println(l1);
        System.out.println(Collections.binarySearch(l1,"a5"));//折半查找
    }

}

輸出結果:
運行結果

四、Comparable接口(同類比較才具有意義)

所有可以“排序”的類都實現了java.lang.comparable接口,Comparable接口中只有一個方法public int compareTo(Object obj);該方法:
返回0表示this(當前對象) == obj
返回正數表示this > obj
返回負數表示this < obj
實現了comparable接口的類通過實現compareTo方法來確定該類對象的排序方式。
示例如下:

public class Name implements Comparable{

    private String firstName;
    private String lastName;

    public Name(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "Name{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    /**
     * 重寫equals方法
     *
     * @param obj 對象
     * @return 兩個對象的比較結果,只有“我的名字”等於你傳遞給我的name對象的名字才返回true
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Name) {
            Name name = (Name) obj;
            return firstName.equals(name.firstName)
                    && lastName.equals(name.lastName);
        }
        return super.equals(obj);
    }

    /**
     * 重寫hashcode方法
     *
     * @return 暫時使用字符串的hashcode方法(也可以自己實現,但是稍微複雜,可以自己研究下)
     */
    @Override
    public int hashCode() {
        return firstName.hashCode();
    }

    /**
     * 按照姓名排列,首先比較姓,然後比較名字
     * @param o
     * @return
     */
    @Override
    public int compareTo(Object o) {
        Name Name = (Name) o;
        //使用String類的compareTo方法,也就是按照字母進行排序
        int lastCmp = lastName.compareTo(Name.lastName);
        return (lastCmp != 0 ? lastCmp :
                firstName.compareTo(Name.firstName));
    }

    public static void main(String[] args) {
        List l1 = new LinkedList();
        l1.add(new Name("Karl","M"));
        l1.add(new Name("Steven","Lee"));
        l1.add(new Name("John","o"));
        l1.add(new Name("Tom","M"));
        System.out.println(l1);
        Collections.sort(l1);//排序然後輸出,排序規則上面的compareTo方法確定的
        System.out.println(l1);
    }

輸出結果:

[Name{firstName='Karl', lastName='M'}, Name{firstName='Steven', lastName='Lee'}, Name{firstName='John', lastName='o'}, Name{firstName='Tom', lastName='M'}]//第一次依次輸出
[Name{firstName='Steven', lastName='Lee'}, Name{firstName='Karl', lastName='M'}, Name{firstName='Tom', lastName='M'}, Name{firstName='John', lastName='o'}]//按照姓氏首字母排列

五、如何選擇數據結構

衡量標準:讀的效率和改的效率
Array開頭的集合讀的快改的慢
Linked開頭的集合改的快讀的慢
Hash開頭的集合讀和寫的速度在Array開頭的集合和Linked開頭集合的中間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章