2016-11-13 类集

前言:类集就是一组java实现的数据结构,所谓的类集指的就是对象数组的应用。

       在整个类集之中最重要的就是以下的几个核心接口:

       |-Collection,List,Set;

       |-Map;

       |-Iteractor、Enumeration;

一、Collection接口

       Collection是整个类集之中保存最大的父接口。

       API文档定义:public interface Collection<E>extends Iterable<E>;

       在collection中定义如下的几个常用的方法:

NO.

方法名称

类型

描述

1

public boolean add(E e)

普通

向集合里面保存数据

2

public boolean addAll(Collection<? extends E> c)

普通

追加一个集合

3

public void clear()

普通

清空集合,根元素为null

4

public boolean contains(Object o)

普通

判断是否包含指定的内容,需要Equals()支持

5

public boolean isEmpty()

普通

判断是否是空集合

6

public boolean remove(Object o)

普通

删除对象,需要Equals()支持

7

public int size()

普通

取得集合中保存的元素个数

8

public Object[] toArray()

普通

将集合变为对象数组

9

public Iterator<E> iterator()

普通

为Iteractor接口实例化

       特别提醒:contains()与remove()方法,必须依靠equals()方法进行支持。

       一般情况下,对于Collection接口不会直接使用,一般会选择使用Collection接口的两个子接口:List与Set接口。

二、List子接口

       List子接口是Collection接口最为常用的一个子接口(使用率80%),这个接口不仅继承了Collection接口中常用的方法,还进行了一定的扩充。

N0.                                  方法名称 类型                  描述
1                       public E get(int index) 普通          取得索引编号的内容
2                  public E set(int index,E element) 普通       修改指定索引编号的内容
3            public ListIterator<E> listIterator(int index) 普通       为ListIterator接口实例化

       List本身也是属于接口,所以如果要使用此接口进行操作,那么就必须存在子类,使用ArrayList子类操作,(另外一个Vector子类,90%的情况选择来验证所学习到的操作方法。)

范例代码:

package cn.mldn.demo24;
import java.util.ArrayList;
import java.util.List;
public class TestDemo {
    public static void main(String[] args) {
        List<String> all = new ArrayList<String>();
        System.out.println("长度:"+all.size()+",是否为空:" + all.isEmpty());
        all.add("Hello");
        all.add("Hello");
        all.add("World");
        System.out.println("长度:"+all.size()+",是否为空:" + all.isEmpty());
        //Collection接口定义size()方法,可以取得集合长度
        //List子接口扩充了get()方法,可以根据索引取得数据
        for(int x = 0;x<all.size();x++){
            String str = all.get(x);//取得索引数据
            System.out.println(str);
        }
    }
}

运行结果:

image

       通过代码的运行结果发现,List集合中所保存的数据是按照保存的顺序进行存放的,而且容许存在有重复的数据。

范例代码:

package cn.mldn.demo24;
import java.util.ArrayList;
import java.util.List;
public class TestDemo01 {
    public static void main(String[] args) {
        List<String> all = new ArrayList<String>();
        System.out.println("长度:"+all.size()+",是否为空:" + all.isEmpty());
        all.add("Hello");
        all.add("Hello");
        all.add("World");
        System.out.println("长度:"+all.size()+",是否为空:" + all.isEmpty());
        //Collection接口定义size()方法,可以取得集合长度
         //List子接口扩充了get()方法,可以根据索引取得数据
         Object obj[] = all.toArray();//变成对象数组
         for(int i =0 ;i<obj.length;i++){
            System.out.println(obj[i]);
        }
    }
}

运行结果:

image

范例代码:在集合里面保存对象;

package cn.mldn.demo24;
import java.util.ArrayList;
import java.util.List;
class Book{
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    @Override
    public boolean equals(Object obj) {
        if(this==obj){
            return true;
        }
        if(obj==null){
            return false;
        }
        if(!(obj instanceof Book)){
            return false;
        }
        Book book = (Book) obj;//向下转型
         if(this.title.equals(book.title)&&this.price==book.price){
            return true;
        }
        return false;
    }
    @Override
    public String toString() {
        return "书名:"+this.title+",价格:"+this.price+"\n";
    }
}
public class TestDemo02 {
    public static void main(String[] args) {
        List<Book> all = new ArrayList<Book>();
        all.add(new Book("Java开发",79.8));
        all.add(new Book("Jsp开发",69.8));
        all.add(new Book("Oracle开发",89.8));
        //任何情况下如果要使用集合数据的删除与内容查询都必须使用Equals()方法
         all.remove(new Book("Oracle",89.8));
        System.out.println(all);
    }
}

运行结果:

image

三、Set子接口

       Collection接口下除了上面使用的List接口,还有一个比较常用的子接口Set接口(20%),Set接口并不像List接口那样对于Collection接口进行大量的扩充,而是简单的继承了Collection接口。

       注意:这就表明了Set接口下没有之前List接口提供的get()方法。

       通常情况下,Set接口下有两个重要的子类:HashSet,TreeSet子类。

范例代码:观察HashSet子类的特点

package cn.mldn.demo25;
import java.util.HashSet;
import java.util.Set;
public class TestDemo {
    public static void main(String[] args) {
        Set<String> all = new HashSet<String>();//实例化对象
         all.add("NIHAO");
        all.add("Hello");
        all.add("Hello");//重复数据
         all.add("World");
        System.out.println(all);
    }
}

运行结果:

image

       通过结果可知,Set集合下面没有重复元素,同时在里面保存的数据是无序的

范例代码:观察TreeSet类

package cn.mldn.demo25;
import java.util.Set;
import java.util.TreeSet;
public class TestDemo01 {
    public static void main(String[] args) {
        Set<String> all = new TreeSet<String>();//实例化对象
         all.add("X");
        all.add("B");
        all.add("A");
        all.add("B");//重复数据
        System.out.println(all);
    }
}

运行结果:

image

3.1 数组排序

       由上面的代码可以知道TreeSet子类保存的内容可以进行排序,那么下面不如就编写一个自定义的类完成数据的保存。

       集合就是一个动态的对象数组,那么如果想为一组对象进行排序,在Java里面必须要使用比较器,应该使用Comparable完成比较。在比较的时候需要将这个类定义的所有属性都要参与比较。

范例代码:

package cn.mldn.demo25;
import java.util.Set;
import java.util.TreeSet;
class Book implements Comparable<Book>{
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    @Override
    public String toString() {
        return "书名:"+this.title+",价格:"+this.price+"\n";
    }
    @Override
    public int compareTo(Book o) {
        if(this.price>o.price){
            return 1;
        }else if(this.price<o.price){
            return 1;
        }else{
            return this.title.compareTo(o.title);
        }
    }
}
public class TestDemo02 {
    public static void main(String[] args) {
        Set<Book> all = new TreeSet<Book>();
        all.add(new Book("Java开发",79.8));
        all.add(new Book("Java开发",79.8));//全部重复信息
         all.add(new Book("JSP开发",79.8));//价格信息重复
         all.add(new Book("Android开发",89.8));//都不重复
         System.out.println(all);
    }
}

运行结果:

image

3.2 关于重复元素的说明

       通过上面的代码运行情况,我们可以得出这样的结论,使用TreeSet子类,并不是真正的用于能够进行重复元素的验证操作。如果想判断重复元素只能依靠Object类中所提供的方法。

       |-取得哈希码:public int hashCode();

          |-先判断对象的哈希码是否相同,依靠哈希码取得一个对象的内容;

       |-对象比较:Public boolean equals(Object obj);

          |-再将对象的属性进行依次的比较。

范例代码:

package cn.mldn.demo25;
import java.util.HashSet;
import java.util.Set;
class Book1{
    private String title;
    private double price;
    public Book1(String title, double price) {
        this.title = title;
        this.price = price;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        long temp;
        temp = Double.doubleToLongBits(price);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        result = prime * result + ((title == null) ? 0 : title.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Book1 other = (Book1) obj;
        if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
            return false;
        if (title == null) {
            if (other.title != null)
                return false;
        } else if (!title.equals(other.title))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "书名:"+this.title+",价格:"+this.price+"\n";
    }
}
public class TestDemo03 {
    public static void main(String[] args) {
        Set<Book1> all = new HashSet<Book1>();
        all.add(new Book1("Java开发",79.8));
        all.add(new Book1("Java开发",79.8));//全部信息重复
         all.add(new Book1("JSP开发",79.8));//价格信息重复
         all.add(new Book1("Android开发",89.8));//都不重复
         System.out.println(all);
        
    }
}

运行结果:

image

posted on 2016-11-13 20:11  G-X  阅读(193)  评论(0)    收藏  举报