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); } } }
运行结果:
通过代码的运行结果发现,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]); } } }
运行结果:
范例代码:在集合里面保存对象;
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); } }
运行结果:
三、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); } }
运行结果:
通过结果可知,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); } }
运行结果:
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); } }
运行结果:
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); } }
运行结果:






浙公网安备 33010602011771号