Java——集合
一、集合接口和迭代器
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用来记住插入元素项的顺序。