1.集合类型主要有3种:set(集)、list(列表)和map(映射)。
2.关系图
3.set
——set接口是Collection接口的一个子接口,是无序的,set中不包含重复的元素。
也就是说set中不存在两个这样的元素a1.equals(a2)结果为true。又因为Set接口提供的数据结构是数学意义上的集合概念的抽象,因此他支持对象的添加和删除。
Set的接口继承Collection接口,而且不允许集合中存在重复项。
TreeSet:在集中以升序对对象排序的集的实现,这意味着从一个TreeSet对象获得第一个迭代器将按照升序来提供对象,TreeSet类使用了一个TreeMap。
当需要从一个Set集合中以有序的方式抽取元素时,TreeSet实现会有用处,为了能顺利进行,添加到TreeSet的元素必须是可排序的。
public class test{
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("xet");
set.add("jpo");
set.add("wo");
set.add("jpo");
System.out.println(set);
Set<String> softset = new TreeSet<String>(set);
System.out.println(softset);
}
}
上面的结果是无序的,且没有重复,输出是按首字母的顺序来排序的。
4.List
List接口继承了Collection接口以定义一个允许重复项的有序集合。
List最重要的特点就是:它保证维护元素特定的顺序,List为Collection添加了很多方法,使得能够向List中间插入语移除元素。
LinkedList:对顺序访问进行了优化,向List中间插入与删除的开销并不大,随机访问则行对较慢,(使用ArrayList代替)还有下列方
List的一些API的使用:
public class Collection_test {
public static void main(String[] args) {
List l1 = new LinkedList();
for(int i = 0;i<=5;i++){
l1.add("a"+i);
}
System.out.println(l1);
//向指定位置加一个字符串
l1.add(0,"a100");
System.out.println(l1);
//替换index=6的位置的字符串
l1.set(6, "a200");
System.out.println(l1);
//取index=2的位置的字符串
System.out.println(l1.get(2)+"");
//获得a3的index索引编号
System.out.println(l1.indexOf("a3"));
//移除index=1的值
l1.remove(1);
System.out.println(l1);
}
}
List的常用算法举例
/**
* List常用算法举例
*/
List p1 = new LinkedList();
List p2 = new LinkedList();
for(int i = 0; i<=9;i++){
p1.add("a"+i);
}
//打印p1[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9]
System.out.println(p1);
//随机排列
Collections.shuffle(p1);
System.out.println(p1);
//逆序
Collections.reverse(p1);
System.out.println(p1);
//排序
Collections.sort(p1);
System.out.println(p1);
//折半查找
System.out.println(Collections.binarySearch(p1, "a5"));
}
5.set 和List的对比
Set 和List的对比:
Set:检查元素效率低下,删除和插入的效率高,插入和删除不会引起元素的位置变化。
List:和数组类似,List可以动态增长,查找元素的效率较高,插入元素和删除元素效率低,因为会引起其他元素位置发生变化。
Set 和 List的具体子类:
Set
----HashSet:以哈希表的形式存放元素,插入删除速度很快
List:
----ArrayList :动态数组
----LinkedList:链表,队列,堆栈
6.Map
Map接口不是Collection接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。
我们可以把这个接口方法分成三组操作:改变、查询和提供可选视图。
改变操作允许您从映射中添加和除去键-值对。键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。
Object put(Object key, Object value)返回值是被替换的值。
Object remove(Object key)
void putAll(Map mapping)
void clear()
查询操作允许您检查映射内容:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
提供可选视图方法允许您把键或值的组作为集合来处理。
public Set keySet()
public Collection values()
public Set entrySet()
因为映射中键的集合必须是唯一的,您用Set支持。因为映射中值的集合可能不唯一,您用Collection支持。最后一个方法返回一个实现Map.Entry接口的元素Set。
Map.Entry 接口
Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键-值对。
通过这个集合迭代,您可以获得每一条目的键或值并对值进行更改。但是,如果底层Map在Map.Entry接口的setValue()方法外部被修改,此条目集就会变得无效,并导致迭代器行为未定义。
HashMap 类和 TreeMap 类
“集合框架”提供两种常规的Map实现:HashMap和TreeMap。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在Map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按顺序遍历键,那么TreeMap会更好。根据集合大小,先把元素添加到HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap可能更快。使用HashMap要求添加的键类明确定义了hashCode()实现。有了TreeMap实现,添加到映射的元素一定是可排序的。
为了优化HashMap空间的使用,您可以调优初始容量和负载因子。这个TreeMap没有调优选项,因为该树总处于平衡状态。
HashMap和TreeMap都实现Cloneable接口。
Hashtable类和Properties类是Map接口的历史实现。
HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。
HashMap:实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。
WeakHashMap: 实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。
TreeMap: 实现这样一个映象,对象是按键升序排列的。