容器用来容纳和管理数据,容器,也叫集合(Collection)。以下是容器的接口层次结构图:
泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。
泛型的本质就是“数据类型的参数化”。 我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
容器相关类都定义了泛型,我们在开发和工作中,在使用容器类时都要使用泛型。这样,在容器的存储数据、读取数据时都避免了大量的类型判断,非常便捷。
在类的声明处增加泛型列表,如:<T,E,V>。此处,字符可以是任何标识符,一般采用这3个字母。
class MyCollection<E> {// E:表示泛型; Object[] objs = new Object[5]; public E get(int index) {// E:表示泛型; return (E) objs[index]; } public void set(E e, int index) {// E:表示泛型; objs[index] = e; } }
public class TestGenerics { public static void main(String[] args) { // 这里的”String”就是实际传入的数据类型; MyCollection<String> mc = new MyCollection<String>(); mc.set("aaa", 0); mc.set("bbb", 1); String str = mc.get(1); //加了泛型,直接返回String类型,不用强制转换; System.out.println(str); } }
Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。Collection接口中定义的方法:
List是有序、可重复的容器
除了Collection接口中的方法,List多了一些跟顺序(索引)有关的方法:
List接口常用的实现类有3个:
Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
Map接口中常用的方法:
Map 接口的实现类有有HashMap、TreeMap、HashTable、Properties等。
Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。 Set容器特点:
Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet:
public class Test { public static void main(String[] args) { Set<String> s = new HashSet<String>(); s.add("hello"); s.add("world"); System.out.println(s); s.add("hello"); //相同的元素不会被加入 System.out.println(s); s.add(null); System.out.println(s); s.add(null); System.out.println(s); } }
迭代器为我们提供了统一的遍历容器的方式,参见以下示例代码:
public class Test { public static void main(String[] args) { List<String> aList = new ArrayList<String>(); for (int i = 0; i < 5; i++) { aList.add("a" + i); } System.out.println(aList); for (Iterator<String> iter = aList.iterator(); iter.hasNext();) { String temp = iter.next(); System.out.print(temp + "\t"); if (temp.endsWith("3")) {// 删除3结尾的字符串 iter.remove(); } } System.out.println(); System.out.println(aList); } }
如果遇到遍历容器时,判断删除元素的情况,使用迭代器遍历。
遍历示例合辑:
//普通遍历 for(int i=0;i<list.size();i++){//list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp); } //增强for循环 for (String temp : list) { System.out.println(temp); } //使用迭代器 for(Iterator iter= list.iterator();iter.hasNext();){ String temp = (String)iter.next(); System.out.println(temp); } //使用迭代器 Iterator iter =list.iterator(); while(iter.hasNext()){ Object obj = iter.next(); iter.remove();//如果要遍历时,删除集合中的元素,建议使用这种方式! System.out.println(obj); } //增强for循环 for(String temp:set){ System.out.println(temp); } //使用迭代器 for(Iterator iter = set.iterator();iter.hasNext();){ String temp = (String)iter.next(); System.out.println(temp); } //根据key获取value Map<Integer, Man> maps = new HashMap<Integer, Man>(); Set<Integer> keySet = maps.keySet(); for(Integer id : keySet){ System.out.println(maps.get(id).name); } //使用enteySet Set<Entry<Integer, Man>> ss = maps.entrySet(); for (Iterator iterator = ss.iterator(); iterator.hasNext();) { Entry e = (Entry) iterator.next(); System.out.println(e.getKey()+"--"+e.getValue());
类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
常用方法:
public class Test { public static void main(String[] args) { List<String> aList = new ArrayList<String>(); for (int i = 0; i < 5; i++){ aList.add("a" + i); } System.out.println(aList); Collections.shuffle(aList); // 随机排列 System.out.println(aList); Collections.reverse(aList); // 逆续 System.out.println(aList); Collections.sort(aList); // 排序 System.out.println(aList); System.out.println(Collections.binarySearch(aList, "a2")); Collections.fill(aList, "hello"); System.out.println(aList); } }