Set 接口也是Collection 接口的子接口,但是与Collection 或List 接口不同的是,Set接口中不能加入重复的元素。
Set 接口的常用子类:
1.散列的存放:HashSet
HashSet 是Set 接口的子类,主要特点是:里面不能存放重复的元素,而且采用散列的存储方式,所遇没有顺序。
2.有序的存放:TreeSet
集合的输出:
在类集中提供了一下4种常见的输出方式:
Iterator:迭代输出,是使用最多的输出方式。
ListIterator:是Iterator 的子接口,专门用于输出List 中的内容。
Enumeration:是一个旧的的接口,功能与Iterator类似。
foreach:JDK 1.5 之后提供的新功能,可以输出数组或集合。
迭代输出:Iterator
所谓的迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出。
双向迭代输出:ListIterator
Iterator 接口的主要功能是由前向后单向输出,而此时如果想实现由后向前或是由前向后的双向输出,则必须使用Iterator的子接口---ListIterator。
Java新支持:foreach
foreach 除了可以完成数组的输出,对于集合也同样支持。
Map接口:
Collection, Set, List 接口都属于单值的操作,即每次只能操作一个对象,而Map 与他们不同的是,每次操作的是一对对象,即二元偶对象,Map 中每个元素都使用 Key--value 的形式存储在集合中。Map接口的定义如下:
public iterface Map<K,V>
在Map 上也应用了泛型,必须同时设置好key 或 value 的类型,在Map中每一对 key--value 都表示一个值。
与Collection 类似,如果想使用Map 接口也必须依靠其子类实例化,Map 接口中常用的子类介绍如下:
HashMap: 无序存放的,是新的操作类,key不允许重复。
Hashtable:无序存放的,是旧的操作类,key 不允许重复。
TreeMap:可以排序的Map 集合,按集合中的key 排序,key 不允许重复。
WeekHashMap:弱引用的Map 集合,当集合中的某些内容不再使用时清除掉无用的数据,使用gc 进行回收。
IdentityHashMap:key 可以重复的Map 集合。
HashMap 操作实例:
System.out.println(val);
if(map.containsKey("Hello")){
System.out.println("找到 Hello");
}else{
System.out.println("没有找到 Hello");
}
Set<String> keys = map.keySet(); //取得全部的key
Iterator<String> iter = keys.iterator(); //实例化 iterator
System.out.println("全部的key 为:");
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+" ");
}
System.out.println("/n全部的 value 为:");
Collection<String> values = map.values(); //得到全部的value
Iterator<String> iterd = values.iterator(); //实例化Iterator
while(iterd.hasNext()){
String str = iterd.next();
System.out.print(str+" ");
}
}
}
Hashtable 操作实例:
Collection<String> values = map.values(); //得到全部的value
Iterator<String> iter = values.iterator(); //实例化Iterator
System.out.println("/n得到全部的value:");
while(iter.hasNext()){
String str = iter.next(); //取出内容
System.out.print(str+" ");
}
}
}
TreeMap 操作实例:
Set<String> keys = map.keySet(); //得到全部的key
Iterator<String> iter = keys.iterator(); //实例化Iterator
while(iter.hasNext()){
String str = iter.next(); //得到key
System.out.println(str+"-->"+map.get(str)); //取出key对应的内容
}
}
}
Map接口的使用注意事项:
【注意1】:不能直接使用迭代输出Map 中的全部内容
对于map 接口来说,其本身是不能直接使用迭代(如 Iterator, foreach) 进行输出的,因为 Map 中的每个位置存放的是一对值(key--value),而Iterator 中每次只能找到一个值。所以使用非迭代进行输出,则必须按照以下的步骤完成:
(1)将Map 的实例通过 entrySet() 方法变为Set 接口对象。
(2)通过Set 接口实例化为Iterator 实例化。
(3)通过Iterator 迭代输出,每个内容都是 Map.Entry 的对象。
(4)通过 Map.Entry 进行 key--value 的分离。
【注意2】:直接使用非系统类作为key
集合工具类:Collections
在集合的应用开发中,集合的若干接口和若干个子类是最常用的,但是JDK 中提供了一种集合操作类的工具类---Collections,可以直接通过此类方便地操作集合。
Collections 类的定义:
public class Collections extends Object