集合类小结
容器——保存对象
1.Collection接口
一个独立元素序列,这些元素都服从一条或多条规则.List必须按照插入顺序保存元素,而Set不能有重复元素.Queue按照排队规则来确定对象产生的顺序(通常与它们插入的顺序相同).
2.Map接口
一组成对的"键值对"对象,允许你使用键来查找值.映射表允许我们使用另一个对象来查找某个对象,它也被称为关联数组,因为它将某些对象与另外一些对象关联在了一起;或者被称为"字典",因为你可以使用键对象来查找值对象,就像你在字典中使用单词来定义一样。Map是强大的编程工具.
一般情况下,我们应该创建一个具体的对象,将其转型为对应的接口,然后在其余的代码都使用这个接口.
如:List<Apple> apples=new ArrayList<Apple>();
但是当我们需要某些具有特殊功能的类时,就不能将它们向上转型为更通用的接口.
一.迭代器:
1.Iterator
public interface Iterator<E>
{
E next();
boolean hasNext();
void remove();
}
Java的Iterator只能单向移动,这个Interator只能用来:
1).使用方法iterator()要求容器返回一个Iterator。Iterator将准备好的返回序列的第一个元素.
2).使用next()获得序列中的下一个元素.
3).使用hasNext()检查序列中是否还有元素.
4).使用remove()将迭代器新返回的元素删除.
注意:查找一个元素的唯一方法是调用next,而在执行查找操作的同时,迭代器的位置随之向前移动,Java迭代器是位于两个元素之间,调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用.因此在删除元素的时候,也就是使用remove()方法时,要首先调用next越过这个元素。
2.ListIterator
它是一个更加强大的Iterator的子类型,它只能用于各种List类的访问.尽管Iterator只能向前移动,但是ListIterator可以双向移动.它还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。
二.详细介绍
List(列表):集合中的对象按照索引位置排序,可以有重复的对象,允许按照对象在集合中的索引位置检索对象。List与数组有些相似。 ------有序,可重复
--ArrayList
--LinkedList 非线程安全的
--Vector 线程安全,所有方法都是同步的.在同步操作上耗费大量时间.
注意:链表不支持快速地随机访问,如果要查看链表中的第n个元素,就必须从头开始,越过n-1个元素,没有捷径可走,鉴于这个原因,在程序中需要采用整数索引访问元素时,程序员通常不选用链表.在指定位置处插入元素时,链表却能发挥它的优势.使用链表的唯一理由是尽可能减少在列表中插入或删除元素所付出的代价.
Set(集合):集合中的对象不按照特定的方式排序,并且没有重复对象。 ------无序,不可重复
--HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
--TreeSet类实现了SortedSet接口,具有排序功能
Map(映射):集合中的每一个元素包含一对 键对象、值对象,集合中没有重复的键对象,值对象可以重复。-------键不可,值可重复
--HashMap按照哈希算法来存取键对象,有很好的存取能力。
--TreeMap实现了SortedMap接口,能对键对象进行排序,和TreeSet一样,TreeMap也支持自然排序和客户化排序两种方式.默认情况下,树集假设它插入的元素实现了Comparable接口。
Map的输出方式
Set<Map.Entry<String,String>> set = map.entrySet();
Iterator<Map.Entry<String,String>> it = set.iterator();
while(it.hasNext()){
Map.Entry<String, String> entry = it.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}
当在一个集合中要按两种方法排序,或者要对一个类的对象进行排序,而这个类的创建者又没有费心实现Conparable接口,那么我们可以将Comparator对象传递到TreeSet构造器来告诉树集使用不同的比较方法.
创建一个Student类,有姓名,性别,分数等属性,按分数值排序
import java.util.Comparator;
public class Compare implements Comparator<Student>{
@Override
public int compare(Student student1,Student student2) {
if(student1.getScore()>student2.getScore())
return 1;
else if(student1.getScore()<student2.getScore())
return -1;
else
return 0;
}
}
public class TreeSetTest {
private static Compare com=new Compare();
public static void main(String[] args) {
SortedSet<Student> ss=new TreeSet<Student>(com);
Student[] s1=new Student[5];
for(int i=0;i<5;i++){
s1[i]=new Student("student"+i, "软工"+i,(int)(Math.random()*100));
ss.add(s1[i]);
}
System.out.println(ss);
}
}