Java中的容器就跟我们生活中的容器差不多,常常我们根据我们要装的东西来选择容器,在Java中我们也是根据我们需要存储的数据类型来选择容器,那么究竟容器有那些呢?
下面我来简单的画个图:
首先谈Collection,它里面有很多抽象方法,可以看到,它是在最顶层的一个接口,它的所有子类都必须去实现它里面的方法,它里面的抽象方法有:
接下来我们再看Set接口,Set接口有一个特点,里面的元素是无序的而且不可重复。
public class SetDemo {
public static void main(String[] args) {
Set s1 = new HashSet();
Set s2 = new HashSet();
s1.add("a");
s1.add("b");
s1.add("c");
s1.add("d");
s2.add("d");
s2.add("b");
s2.add("e");
s2.add("f");
Set sn = new HashSet(s1);
System.out.println(sn);
sn.retainAll(s2); //求交集
System.out.println(sn);
}
}
输出结果是:
[d, b, c, a]
[d, b]
List接口下面我们可以看到它的下面还有两个子接口,LinkedList和ArrayList,他们的底层实现方式不同,LinkedList底层是用链表实现的,而ArrayList底层是用数组实现的,用户可以根据需要来选择使用那种,对数据的删除和插入操作比较频繁的话,那么用链表比较好,而对数据的只是普通的读取输出那么用数组比较好。
Map接口,
用于存放键值对的集合,可以通过键找到对应的值。
我们在学数据结构的时候,都知道数据和链表的优缺点,对数据操作比较频繁的话用链表,对数据的读取频繁的话用数组,他们各有优缺点,Map就位于他们两个中间。
Map的抽象方法:
它的用法:
public class MapDEMO {
public static void main(String[] args) {
Map m1 = new HashMap();
Map m2 = new HashMap();
m1.put(1, "one");
m1.put(2, "two");
m1.put(3, "three");
m2.put("a", 1);
m2.put("b", 2);
m2.put("c", 3);
System.out.println(m1.size());
System.out.println(m1.containsKey(1));
System.out.println(m2.containsValue(1));
}
}
我们可以根据键,去找到值。
其实对于容器中有一个很重要的操作,那就是遍历,那么多种集合我们有没有一个统一的遍历方式,肯定有的,那就是Ierrator迭代器。在我的博客中有一篇专门讲迭代器的,建议大家去看一下,很有帮助的。
其实还有一个泛型,我前面没讲过,那么泛型究竟是干嘛用的?
在以前,并没有泛型的概念,那么用户在用集合向存储某一种自定义对象的时候,都是用Object,我们知道Object是所有类的父类,那么存进去之后,他就会丢失自己本身的属性,所以后来就有了泛型,泛型就是规定了你只能存储你特定的某一种数据类型。
public class FanXing {
public static void main(String[] args) {
Collection<String> c1 = new ArrayList<String>();
c1.add("adsas");
c1.add("ad");
c1.add("adsa");
Iterator<String> i = c1.iterator();
while(i.hasNext()){
String s = i.next();
System.out.println(s);
}
Map m1 = new HashMap<String, Integer>();
m1.put("a", 1);
m1.put("b", 2);
m1.put("c", 3);
System.out.println(m1.size());
}
像我在Collection<String> c1 = new ArrayList<String>(); 这一条语句中使用了泛型,那么c1就只能存储String类型的元素。