一、集合接口和迭代器

在Java类库中,Collection接口是所有集合类的基本接口。这个接口有两个基本方法:add和iterator。

add方法用于向集合中添加元素。如果结果改变返回true,否则返回false。

iterator方法用于返回一个实现了Iterator接口的对象。

public interface Iterator{

     Boolean hasNext(); 
     Object next(); 
     void remove();     
}

通过反复调用next方法,可以遍历集合中每个元素。为了防止在到达集合末尾时抛出异常,我们需要在调用next之前调用hasNext方法,如果迭代器对象还有多个可访问的元素,则返回true,否则返回false。

public class Ergodic {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(2);
        list.add(3);

        java.util.Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            int i = (Integer) it.next();
            System.out.println(i);
        }
}

当然,这里循环有更加简便的方法。

public class Ergodic {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(2);
        list.add(3);

        System.out.println("用iterator+while");
        java.util.Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            int i = (Integer) it.next();
            System.out.println(i);
        }
        
        System.out.println("用for循环遍历");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        System.out.println("用增强for循环");
        for (Integer i : list) {
            System.out.println(i);
        }
      
        System.out.println("用iterator+for");
        for (java.util.Iterator<Integer> iter = list.iterator(); iter.hasNext();) {
            int i = (Integer) iter.next();
            System.out.println(i);
        }
    
    }
}

由此可见,用增强for循环可以更加简练的表示同样的操作,并且对于任意标准类库中的集合都可以使用“for each”循环。

 

二、具体集合

集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。

 

集set (没有重复项目的集合)  

HashSet-构造一个散列集,用hashCode()方法返回这个对象的散列码。

TreeSet-构造一个有序树集  

public class TreeSetT {

    public static void main(String[] args) {
        SortedSet<String> set = new TreeSet<>();
        set.add("B");
        set.add("C");
        set.add("A");
        for(String s:set){
            System.out.println(s);
        }
    }
}

运行结果:ABC

对象的比较,这里使用compareTo,如果this位于other之前返回负值,如果两个对象在排列中处于相同的位置,返回0 ,否则返回正值。

LinkedHashSet-对集迭代时,按增加顺序返回元素 

 

列表List (描述一个有序的集合)

ArrayList(封装了一个动态再分配的对象数组)-类似于Vector。区别:

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
二.数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半。

因此,在使用时代码要在同步上耗费大量时间,所以在不需要同步时,使用ArrayList。

LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。 

用add()加入元素,将对象添加至链表的尾部。 remove()删除元素。 运行结果:[B, C]

public class LinkedListT {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        java.util.Iterator<String> iter = list.iterator();
        iter.next();//返回第一个元素。
        iter.remove();   
        System.out.println(list);
    }
}

由于要将元素添加至链表的中间,子接口ListIterator用来反向遍历链表,与next方法一样,previous返回越过的对象。

下面是越过链表中第一个元素A并在第二个元素B之前添加元素a的一个例子。运行结果:[A, a, B, C]

public class LinkedListT {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        java.util.ListIterator<String> iter = list.listIterator();
        iter.next();
        iter.add("a");   
        System.out.println(list);
    }
    
}

set()方法取代调用next或者previous返回的上一个元素。运行结果:[a, B, C][a, C]

public class LinkedListT {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        java.util.ListIterator<String> iter = list.listIterator();
        iter.next();//返回第一个元素
        iter.set("a");
        System.out.println(list);
        iter.next();//返回下一个元素
        iter.remove();   
        System.out.println(list);
    }
}

 

映射表Map  (用于存放键/值对)

实现Map接口的两个类:

HashMap-散列表的通用映射表 

Map<String, Integer> map = new HashMap<>();  
 map.put("key", 1);

TreeMap-构造树映射表   

 

三个视图:

键集KeySet()  

值集合(不是集)values() 

键/值对集enrySet()

注意:KeySet既不是HashSet,也不是TreeSet,而是实现了Set接口的某个其他类的对象,Set扩展了Collection接口,因此可以与使用人任何集合一样使用KeySet。  

Set<Integer> keys = map.keySet();   
for (Integer key : keys) {
      System.out.println(key);             
}

如果需要查看键与值,可用下面两种方法

public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<Integer, String>();  
        map.put(1, "a");  
        map.put(2, "b");  
        map.put(3, "c");        
        /* 
         * 第一种 
         */  
        Set<Entry<Integer, String>> set = map.entrySet();  
        java.util.Iterator<Entry<Integer, String>> itor = set.iterator();  
        while (itor.hasNext())  
        {  
            Entry<Integer, String> entry = itor.next();  
            System.out.println(entry.getKey() + "     " + entry.getValue());  
        }         
        /* 
         * 第二种 
         */  
        for (Entry<Integer, String> entry : map.entrySet())  
            System.out.println(entry.getKey() + "     " + entry.getValue());
    }

 

专用集与映射表类

WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

LinkedHashMap用来记住插入元素项的顺序。