Java集合set

1.Set

Java集合set
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合可以存储不同类型的对象。

共性方法
由于大部分集合类都继承了Collection接口,所以Collection接口的方法就是集合类的共性方法.

public static void demo1(){  
    Collection col1=new ArrayList();  
    col1.add("java01");  
    col1.remove("java01");  
    col1.clear();  
    System.out.println(col1.size());  
    System.out.println(col1.isEmpty());  
    System.out.println(col1.contains("java01"));  

}

Java集合set
迭代器

        //用迭代器取出元素方式2,将迭代器在for循环的第一个;前定义,可以提高性能  
        for (Iterator it=col1.iterator();it.hasNext();) {  
            System.out.println(it.next());  
        }

2.List 与Set

Java集合set

3.HashSet

HashSet:底层数据结构是哈希表。通过Object上的hashCode方法来判断元素是否重复,如果hashCode一样,则进一步通过equals方法判断,如果连equals都一样,则确认是重复元素.如果equals 为false那么HashSet 认为新加入的对象没有重复.新元素可以存入.
Java集合set
左图:hashCode值不相同的情况

右图:hashCode值相同,但equals不相同的情况。

public static void main(String[] args) {  
    HashSet set=new HashSet();  
    set.add(new Person("a1", 12));   
      
    System.out.println(set.contains(new Person("a2", 34)));  
    System.out.println(set.remove(new Person("a2", 34)));  
      
    Iterator it=set.iterator();  
    while (it.hasNext()) {  
        Person p=(Person)it.next();  
        System.out.println(p.getName()+"的年龄是"+p.getAge());        
    }  
}

LinkedHashSet:
类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据。主要区别是HashSet不保证集合中元素的顺序,即不能保证迭代的顺序与插入的顺序一致。

而LinkedHashSet按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致。
LinkedHashSet 通过继承 HashSet,底层使用 LinkedHashMap.

4.TreeSet

TresSet:可以对集合中的元素排序。底层数据结构是二叉树,通过元素的compareTo方法是否返回0保证元素唯一性。
TreeSet则是对Set中的元素进行排序存放【TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序】。

import java.util.Iterator;  
import java.util.TreeSet;  
  
class Student implements Comparable{  
    String name;  
    int age;  
    public Student(String name, int age) {  
        super();  
        this.name = name;  
        this.age = age;  
    }  
      
    public String getName() {  
        return name;  
    }  
    public int getAge() {  
        return age;  
    }  
  
    @Override  
    public int compareTo(Object o) {  
        if (!(o instanceof Student)) {  
            throw new RuntimeException();  
        }  
        Student s=(Student)o;  
        if (this.age>s.getAge()) {  
            return 1;  
        }else if (this.age==s.getAge()) {  
            return this.name.compareTo(s.name);  
        }  
        return -1;  
    }  
}  
  
public class TreeSetDemo {  
    public static void main(String[] args) {  
        demo2();  
    }  
    public static void demo2(){  
        TreeSet ts=new TreeSet();  
        ts.add(new Student("lisi01", 56));  
        ts.add(new Student("lisi02", 34));  
        ts.add(new Student("lisi03", 34));  
        ts.add(new Student("lisi04", 12));  
          
        Iterator it=ts.iterator();  
        while(it.hasNext()){  
            Student s=(Student)it.next();  
            System.out.println(s.getName()+"的年龄是:"+s.getAge());  
        }  
    }  
}

注意:存入TreeSet集合中的元素类必须实现Comparable接口,并覆盖compareTo方法。方法抛出异常。compareTo方法的作用是确定对象在集合中的顺序,如果compareTo方法返回1,则放在当前比较元素的后边,否则放前边。

Java集合set


参考:

  1. Java: set和list集合类的使用方法;
  2. Java Set cnblog;
  3. LinkedHashSet原理
上一篇:MySQL 覆盖索引详解


下一篇:PostgreSQL常用数据类型及实践