黑马程序员五、集合框架Collection

来源:互联网 发布:linux 打开一个目录 编辑:程序博客网 时间:2024/04/30 12:25

---------------------- android培训java培训、期待与您交流! ----------------------

Collection

       |-- Set : 元素是无序,元素不可以重复。

              |-- HashSet: 底层数据结构是哈希表。线程是非同步的。

     | -- TreeSet : 可以对Set集合中的元素进行排序。

Set集合的功能和Collection是一致的。无序的(存入和取出的顺序不一定一致),不可重复。

一、HashSet

         public static void main(String[] args)

          {

                    HashSet hs = new HashSet();

                   hs.add("java01");
                   hs.add("java02");
                   hs.add("java03");
                   hs.add("java04");

                   Iterator it = hs.iterator();
                   while(it.hasNext()){
                       System.out.println(it.next());  
                     }   

           }

运行结果:java04          // 存储的地址不同,按地址存储,所以排列是无序的。                   
                    java02          // HashSet的底层是通过HashMap来实现存储的,
                    java03
                    java01

HashSet是如何保证元素的唯一性?

       是通过元素的两个方法,hashCode和equals来完成的。

       如果元素的HashCode值相同,才会判断equals是否为true。

       如果元素的HashCode不同,不会调用equals。

   注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的Hashcode和equals方法。

二、TreeSet

   底层数据结构是二叉树,保证元素唯一性的依据。

而TreeSet的底层又是通过TreeMap来实现存储的,而且HashSet和TreeSet中的元素都是以Key值存储的,这也是HashSet和TreeSet的元素不能重复的原因。

TreeSet排序的第一种方式:让元素具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也称为元素的自然顺序,或默认顺序。

import java.util.*;

/*

 需求:往TreeSet集合中存储自定义对象学生。

 按照学生的年龄进行排序。

 */

publicclass TreeSetDemo {

     publicstaticvoid main(String[] args){

          TreeSetts = newTreeSet();

            ts.add(new Student("lisi02",22));

           ts.add(new Student("lisi07",20));

            ts.add(new Student("lisi09",19));

           ts.add(new Student("lisi08",19));

       Iteratorit = ts.iterator();

       while(it.hasNext())

       {

           Studentstu = (Student)it.next();

           System.out.println(stu.getName()+"..."+stu.getAge());

       }

    }

}

class StudentimplementsComparable//该接口强制让学生具备比较性。

{

    private Stringname;

    privateintage;

    Student(Stringname,int age)

   {

        this.name = name;

       this.age = age;

    }

    publicint compareTo(Objectobj)

   {

        if(!(objinstanceof Student))

              thrownew RuntimeException("不是学生对象");

        Students = (Student)obj;

      

      System.out.println(this.name+"...compareto..."+s.name);

        if(this.age>s.age)

             return 1;

       if(this.age==s.age)

      {

             returnthis.name.compareTo(s.name);

        }

         return -1;

    }

    publicString getName()

    {

         returnname;

    }

     publicint getAge()

    {

          returnage;

    }

}

运行结果:lisi08...19
                    lisi09...19
                    lisi07...20
                    lisi02...22

TreeSet的第二种排序方式,当元素自身不具备比较性时,或者具备的比较性不是所需要的。

这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。

import java.util.*;

/*

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时,以比较器为主。

定义一个类,实现Comparator接口,覆盖compare。

*/

class StudentimplementsComparable

{

     private Stringname;

     privateintage;

     Student(Stringname,int age)

     {

        this.name = name;

        this.age = age;

     }

     publicint compareTo(Objectobj)

     {

        if(!(objinstanceof Student))

            thrownew RuntimeException("不是学生对象");

       Students = (Student)obj;

        if(this.age>s.age)

             return 1;

        if(this.age==s.age)

        {

            returnthis.name.compareTo(s.name);

        }

        return -1;

     }

     publicString getName()

     {

        returnname;

     }

     publicint getAge()

     {

        returnage;

     }

}

publicclass TreeSetDemo2 {

     publicstaticvoid main(String[] args){

        TreeSetts = newTreeSet(new MyCompare());

        ts.add(new Student("lisi02",22));

        ts.add(new Student("lisi07",20));

        ts.add(new Student("lisi09",19));

        ts.add(new Student("lisi06",18));   

        Iteratorit = ts.iterator();

        while(it.hasNext())

        {

            Studentstu = (Student)it.next();

            System.out.println(stu.getName()+"..."+stu.getAge());

        }

     }

}

class MyCompare implements Comparator

{

    public intcompare(object o1,object o2)

     {

        Students1 = (Student)o1;

        Students2 = (Student)o2;

        int num =s1.getName().compareTo(s2.getName());

        if(num==0)

        {

             return new Integer(s1.getAge()).comparTo(new Integer(s2.getAge())));

        }

    }

}

Collection

      |-- List :元素是有序的,元素可以重复。因为该集合体系有索引。

              |-- ArrayList :底层的数据结构使用的是数组结构。线程不同步。

                                       特点:查询速度很快。但增删稍慢。

              |-- LinkedList : 底层使用的链表数据结构。

                                       特点:增删速度很快,查询很慢。

              |-- Vector :底层是数组数据结构。线程同步。被ArrayList替代了。

特有方法,凡是可以操作角标的方法都是该体系特有的方法。                                                    

增      add(index,element);

          addAll(index,Collection);

删       remove(index);

改       set(index,element);

查    get(index);

       subList(from,to);

       listIterator();       

一、ArrayList 

ArrayList al= new ArrayList ();

//添加元素

al.add("java01");

al.add("java02");

al.add("java03");  //结果: [java01, java02, java03]

//在指定的位置添加元素

al.add(1,"java06");  //结果: [java01, java06, java02, java03]

//删除指定位置的元素

al.remove(2);  //  [java01, java06, java03]

//修改元素

al.set(2,"java05");  //  [java01, java06, java05]

//通过角标获取元素

System.out.println(al.get(1)); // java06


List集合特有的迭代器,ListIterator是Iterator的子接口。

   在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

   所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有限的。只能对元素进行判断,取出,删除的操作。

   如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的ListIterator方法获取。

如下:

ArrayList al= new ArrayList ();

al.add("java01");

al.add("java02");

al.add("java03");

Iterator it = al.iterator();

while(it.hasNext()){
           Object obj = it.next();
            if(obj.equals("java02"))
            it.remove();
System.out.print(" obj="+obj); // obj=java01 obj=java02 obj=java03

            }
System.out.println(al); // 结果:[java01, java03]

二、LinkedList

LinkedList:特有方法:

     addFirst();    //添加到列表第一个

     addLast();     //添加到列表最后一个

     getFirst();//get获取元素,但不删除元素。

     getLast();

    removeFirst();//remove获取元素,但元素被删除。

    removeLast();

如果集合中没有元素,会出现NoSuchElementException异常。

在JDK1.6出现替代方法。

   offerFirst();

   offerLast();

   peekFirst();获取元素,但不删除元素,如果集合中没有元素,会返回null。

   peekLast();

   pollFirst();获取元素,但是元素被删除,如果集合中没有元素,会返回null。

   pollLast();

如:队列:先进先出

import java.util.LinkedList;

public class HeiMa {
 
        public static void main(String[] args) {

        DuiLie dl = new DuiLie();

      dl.myAdd("java01");
      dl.myAdd("java03");
      dl.myAdd("java02");
      while(!dl.isNull())
   System.out.println(dl.myGet());
     }
}

class DuiLie{
         private LinkedList link;
         DuiLie(){
         link = new LinkedList();
         }
        public void myAdd(Object obj){
        link.addFirst(obj);
}
        public Object myGet(){
         return link.removeLast();
       }
       public boolean isNull(){
           return link.isEmpty();
       }
}

三、Vector

枚举就是Vector特有的取出方式。枚举和迭代器很类似。

其实枚举和迭代器是一样的。

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

原创粉丝点击