Java學習經驗與總結(08)——集合框架

一 Set類集合

Set集合中的對象不按特定的方式排序,只是簡單的將對象加入到集合中,但是Set集合不能包括重複對象
Set接口繼承了Collection接口,因此也包含Collection接口的所有方法

1 Hashset集合

HashSet擴展自AbstractSet並且實現Set接口。
boolean
add(E e)
如果此set中尚未包含指定元素,則添加指定元素。
void
clear( )
從此set中移除所有元素。
object
clone( )
返回此Hashset實例的淺表副本:並沒有複製這些元素本身。
boolean
contains (object 0)
如果此set包含指定元素,則返回true。
isEmpty( )
如果此set不包含任何元素,則返回true。
iterator( )
返回對此set中元素進行迭代的迭代器。
remove (bject 0)
如果指定元素存在於此set中,則將其移除。
int
size( )
返回此set中的元素的數量(set 的容量)。

2 HashSet集合特點


public class myjavademo {

        public static void main(String []args) {
            HashSet<Integer> hs = new HashSet<>();

            hs.add(1);
            hs.add(2);
            hs.add(3);
            System.out.println(hs.add(6));
            System.out.println(hs.add(6));  //檢驗HashSet是否允許重複元素加入
            System.out.println(hs);    //檢驗HashSet是否有序

        }


        }

3 放入自定義類型數據出現的問題

class Student{

        private String name;
        private int id;

        public Student(){}

        public Student(String name, int id)
        {
            super();
            this.name = name;
            this.id = id;
        }

        public String getName()
        {
            return name;
        }
        public void setName(String name)
        {
            this.name = name;
        }
        public int getId()
        {
            return id;
        }
        public void setId(int id)
        {
            this.id = id;
        }

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

    }



    class Test{
        public static void main(String []args) {
            HashSet<Student> hs = new HashSet<>();

            hs.add(new Student("zhangsan",1));
            hs.add(new Student("lisi",2));
            hs.add(new Student("wangwu",3));

            System.out.println(hs.add(new Student("haha",4)));
            System.out.println(hs.add(new Student("haha",4)));
            System.out.println(hs);

        }

}

結果
true
true
[Student [name=yiyi, id=1], Student [name=wawa, id=4], Student [name=wawa, id=4], Student [name=lili, id=3], Student [name=feifei, id=2]]

4 LinkedHashSet集合

LinkedHashSet繼承自HashSet
數據結構 有兩個 鏈表和哈希表
鏈表保證有序 哈希表保證元素唯一

5 Treeset集合

Itreable 接口 實現該接口可以使用增強for循環
Collection 描述所有集合共性的接口 |
Set接口 無序,不可以重複的集合
HashSet 線程不安全,存取速度快。底層是以hash表實現的。
TreeSet 紅-黑樹的數據結構,默認對元素進行自然排序(String)。
如果在比較的時候兩個對象返回值爲0,那麼元素重複。

案例:使用TreeSet集合存儲字符串元素,並遍歷

public class myjavademo {
    public static void main(String[] args)
    { TreeSet ts = new TreeSet();
    ts.add("ccc");
    ts.add("aaa");
    ts.add("ddd");
    ts.add("bbb");
    System.out.println(ts); // [aaa, bbb, ccc, ddd]
    }
}

6 Treeset的排序方式

方式一:元素自身具備比較性
元素自身具備比較性,需要元素實現Comparable接口,重寫compareTo方法,也就是讓元素自身具備比較性,這種方式叫做元素的自然排序也叫做默認排序。
方式二:容器具備比較性
當元素自身不具備比較性,或者自身具備的比較性不是所需要的。那麼此時可以讓容器自身具備。需要定義一個類實現接口Comparator,重寫compare方法,並將該接口的子類實例對象作爲參數傳遞給TreeMap集合的構造方法。
注意:當Comparable比較方式和Comparator比較方式同時存在時,以Comparator的比較方式爲主;
注意:在重寫compareTo或者compare方法時,必須要明確比較的主要條件相等時要比較次要條件。
我們來看一下方式一的案例

public class myjavademo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new Person("aa", 20, "男"));
        ts.add(new Person("bb", 18, "女"));
        ts.add(new Person("cc", 17, "男"));
        ts.add(new Person("dd", 17, "女"));
        ts.add(new Person("dd", 15, "女"));
        ts.add(new Person("dd", 15, "女"));
        System.out.println(ts);
        System.out.println(ts.size()); // 5

    }
}

class Person implements Comparable {
    private String name;
    private int age;
    private String gender;
    public Person() {

    }

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

    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;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age * 37;
    }

    public boolean equals(Object obj) {
        System.err.println(this + "equals :" + obj);
        if (!(obj instanceof Person)) {
            return false;
        }

        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.age;

    }

    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + gender
                + "]";      }

    @Override
    public int compareTo(Object obj) {
        Person p = (Person) obj;
        System.out.println(this+" compareTo:"+p);
        if (this.age > p.age) {
            return 1;
        }
        if (this.age < p.age) {
            return -1;
        }
        return this.name.compareTo(p.name);
    }
}
public class myjavademo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new Person("aa", 20, "男"));
        ts.add(new Person("bb", 18, "女"));
        ts.add(new Person("cc", 17, "男"));
        ts.add(new Person("dd", 17, "女"));
        ts.add(new Person("dd", 15, "女"));
        ts.add(new Person("dd", 15, "女"));
        System.out.println(ts);
        System.out.println(ts.size()); // 5

    }
}

class Person implements Comparable {
    private String name;
    private int age;
    private String gender;
    public Person() {

    }

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

    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;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age * 37;
    }

    public boolean equals(Object obj) {
        System.err.println(this + "equals :" + obj);
        if (!(obj instanceof Person)) {
            return false;
        }

        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.age;

    }

    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + gender
                + "]";      }

    @Override
    public int compareTo(Object obj) {
        Person p = (Person) obj;
        System.out.println(this+" compareTo:"+p);
        if (this.age > p.age) {
            return 1;
        }
        if (this.age < p.age) {
            return -1;
        }
        return this.name.compareTo(p.name);
    }
}

我們再來看一下方式二的案例

public class myjavademo {

         public static void main(String[] args) {
            TreeSet ts = new TreeSet((Collection) new MyComparator());
            ts.add(new Book("語文", 100));
            ts.add(new Book("數學", 75));
            ts.add(new Book("英語", 50));
            ts.add(new Book("歷史", 35));
            ts.add(new Book("語文", 100));
            ts.add(new Book("地理", 100));

            System.out.println(ts);
        }
    }
    class MyComparator implements Comparator {

        public int compare(Object o1, Object o2) {
            Book b1 = (Book) o1;
            Book b2 = (Book) o2;
            System.out.println(b1+" comparator "+b2);
            if (b1.getPrice() > b2.getPrice()) {
                return 1;
            }
            if (b1.getPrice() < b2.getPrice()) {
                return -1;
            }
            return b1.getName().compareTo(b2.getName());
        }
    }

    class Book {
        private String name;
        private double price;

        public Book() {

        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        public Book(String name, double price) {
            this.name = name;          this.price = price;
        }
        @Override
        public String toString() {
            return "Book [name=" + name + ", price=" + price + "]";
        }
    }

7 LinkedHashSet

會保存插入的順序。
看到array,就要想到角標。
看到link,就要想到first,last。
看到hash,就要想到hashCode,equals.
看到tree,就要想到兩個接口。Comparable,Comparator。

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