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。

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