Collection集合学习(一)———Set接口与具体实现

时间:2022-09-18 17:55:49

接口Collection:

     Collection是Java的一个集合框架, 也是一个根接口。JDK中没有提供此接口的任何实现,但是提供了更具体的子接口Set和List接口的实现,所有的Collection实现类都是通过这些子接口间接实现了Collection。

     Collection接口有两种构造方法,一种用于构造空的Collection,另一种是带有Collection类型单参数的构造方法。该接口常用的方法包括add(E e),addAll(Collection<?> e),clear(),contains(Object o),equals(Object o),isEmpty(),remove(Object o),size(),toArray(),iterator()等等。

     常用子接口包括List,Set,Queue等。

Collection集合学习(一)———Set接口与具体实现

一.Set接口:

    一个不包含重复元素的Collection,并且最多包含一个null元素,Set中的元素是自动排序的,与添加顺序无关。

    具体实现类包括TreeSet,HashSet,EnumSet,均不是线程安全的。

    1.常用实现类HashSet和TreeSet

        区别如下:

        1)HashSet底层是通过哈希表实现的,而TreeSet是通过二叉树实现的。

        2)TreeSet类是使用元素的自然顺序对元素进行排序,且同一个TreeSet内的元素类型必须一致 ; 如果TreeSet内的元素是类对象,则该类必需实现Comparable接口为该类定制排序方式并且具有toString方法,如下面代码所示。

              HashSet根据哈希值来对元素进行排序。

        3)HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的 ;具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复,但是同一个类的对象可以放入不同的实例 。

        4)HashSet的性能比Treeset好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的Set时,才会用TreeSet。

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

public class Collection_try {
    
    public static void main(String[] args){
        
        Set set=new HashSet();
        set.add("2");
        set.add("1");
        set.add("3");
        set.add("4");
        Iterator i=set.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
        
        System.out.println("-------------------------");
        
        A a1=new A(11);
        A a2=new A(12);
        A a3=new A(13);
        A a4=new A(10);
        TreeSet set1=new TreeSet();
        set1.add(a1);
        set1.add(a2);
        set1.add(a3);
        set1.add(a4);
        
        Iterator i1=set1.iterator();
        while(i1.hasNext()){
            System.out.println(i1.next());
        }
        System.out.println(set1.size());
    }

}


class A implements Comparable{
    
    private int i;
    
    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    public A(int i){
        this.i=i;
    }
    
     public int compareTo(Object o)                 //写具体的比较方法
     {
             A s=(A)o;
             if(s.getI()<this.i){
                 return 1;
             }else{
                 return -1;
             }
     }
     
     public String toString(){
         return i+":ok";
     }
}

        2.EnumSet

        EnumSet 是一个与枚举类型一起使用的专用 Set 实现,Enumset中所有元素都必须来自单个Enum枚举类型(即必须是同类型,且该类型是Enum的子类),EnumSet的特点是速度方面要优与HashSet和TreeSet 。

        如下代码为一个Enum和EnumSet的例子

package mars;

import java.util.EnumSet;

/**
 * Created by zhangys on 17-7-21.
 */
public class Collection_EnumSet {

    public static void main(String [] args){
        testTraversalEnum (); //枚举类型的遍历
        testEnumSet();  //EnumSet的是一个哦你
    }

    public static void testTraversalEnum (){
        Color[] allColor = Color.values ();
        for (Color color : allColor) {
            System. out .println( " 当前颜色 name : " + color.name());
            System. out .println( " 当前颜色 ordinal : " + color.ordinal());
            System. out .println( " 当前颜色 value: " + color);
        }
    }

    private static void testEnumSet() {
        EnumSet<Color> currEnumSet = EnumSet.allOf(Color.class);
        for (Color aLightSetElement : currEnumSet) {
            System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
        }
        System.out.println("--------------华丽丽的分割线---------------");
        EnumSet<Color> arEnumSet = EnumSet.of(Color.RED,Color.BLACK,Color.BLUE);
        for (Color aLightSetElement : arEnumSet) {
            System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
        }
    }

    public enum Color{

        RED(1),BLUE(2),BLACK(3),YELLOW(4),GREEN(5);

        int node;

        private Color(int node){  //构造方法,只能为私有
            this.node = node;
        }

        public String toString() {
            return String.valueOf (node);
        }
    }
}