总结一下在Java中有着重要地位的一类工具----集合
集合在Java.util包中,能容纳不定数量的元素的容器。
先说他与数组的区别
1, 容器可以容纳数量不确定的元素,我们不用编程实现对窗口容量的控制是最基本的,它所提供的一系列对容器中元素操作的方法更是数组不能完成的。
2, 容器只能容纳对象,但是这点已经不重要了,Java可以对基本类型的元素进行自动打包和解包,我们不用管存在容器中的数到底是包装类型的还是基本类型的。
3, 还有一点就是数组没有对多线程进行处理,而集合容器中既有线程不安全而高效的方法也有线程高效的方法。
4, 对如果对一系列元素都是简单的操作使用数组效率可以会高一点。
集合主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
下面是在网上找来的Java集合框架的结构图(太懒了就不去画了)
这是Collection的各接口与实现类的继承图
其中的Set和List是Collection的子接口,也是我们平常最最常用的两个接口,Queue是队列数据结构,与Liste很相似,我们可以完全用List实现它的功能。
Map实现类用于保存具有映射关系的数据(key-value)。
看名字就知道这个HashMap与HashSet,TreeMap与TreeSet分别有着什么关系,想想也对把Map里的Value都去掉,只剩下Key就是一个Set了!!据说Java内部就是这么实现的,先实现Map,然后将Map里的Value设为null就可以当Set用了。看看Set内部的结构:
嘻嘻,在另一篇里拉过来的图。
拿过来Collection里的方法声明:
关于Collection下实现类的构造方法和add,remove方法见另一篇(set小结)
遍历Collection的方法
1,使用Iterator接口
Iterator也是集合框架下的重要接口,专门用来进行遍历,中文名称是迭代器。
Iterator中有三个方法:
这种方法在遍历的过程中只能删除集合中的元素,而不能对集合进行任意的修改。
2, 使用加强的for循环,这种方法只可以对集合读取,不要对正在遍历的集合进行修改。
3, 针对List还可以使用普通的for循环来做,因为List是可以通过索引得到元素的,而且这种方式可以对集合进行任何操作。
下面的代码:
package cn.com.aa.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestCollection {
public static void main(String[] args) {
List<Dog> list = new ArrayList<Dog>();
list.add(new Dog(1));
list.add(new Dog(2));
list.add(new Dog(3));
list.add(new Dog(4));
// 使用增加的for循环
for (Dog dog : list) {
System.out.println(dog);
// list.remove(1); //出错,不能增不能删
}
// 使用Iterator接口
Iterator<Dog> it = list.iterator();
while (it.hasNext()) {
Dog dog = it.next();
System.out.println(dog);
if (dog.getWeight() == 2) {
it.remove();// 这里只能删除,不能增加
}
}
// 使用普通的for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
// 这里可以对list进行增减都可以
}
}
}
class Dog {
private int weight;
public Dog(int weight) {
super();
this.weight = weight;
}
@Override
public String toString() {
return "" + this.weight;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
Map里的方法声明:
1, put方法:将一个键值对放到Map中,要使用泛型。使用put方法会有一个value.class类型的返回值。如果加入的键值对中的键已经存在,则会返回原来的键值对的value,并且将map中的value更新为新的值。
2, remove方法,将Map中对应Key的键值对删除,同时将键值对的value作为返回值返回。
3, keySet方法,返回一个包含所有Key的Set,可以用来遍历Map。
4, entrySet方法,返回一个Set,而Set所能容纳的类型是Map.Entry<K, V>,就是将键和值包装为一个对象了,也用于Map的遍历
上面已经说了几个Map遍历时使用的方法,所以直接看代码;
package cn.com.aa.test;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class TestMap {
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<String, String>();
System.out.println(map1.put("1", "a"));
System.out.println(map1);
System.out.println(map1.put("1", "b"));
System.out.println(map1);
map1.put("2", "b");
map1.put("3", "c");
map1.put("4", "d");
//使用KeySet方法遍历
Set<String> set1 = map1.keySet();
for (String str : set1) {
System.out.println(str + ":" + map1.get(str));
}
//使用Map.Entry的方法进行遍历
Set<Map.Entry<String, String>> set2 = map1.entrySet();
//这里也可以使用Iterator接口来进行遍历
for (Map.Entry<String, String> entry : set2) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}