在学Java以前,一说到存放东西,第一个想到的就是使用数组,使用数组,在数据的存取方面的却也挺方便,其存储效率高访问快,但是它也受到了一些限制,比如说数组的长度以及数组的类型,当我需要一组string类型数据的同时还需要Integer类型的话,就需要定义两次,同时,数组长度也受到限制,即使是动态定义数组长度,但是长度依然需要固定在某一个范围内,不方便也不灵活。
如果说我想要消除上面的这个限制和不方便应该怎么办呢?Java是否提供了相应的解决方法。答案是肯定的,这就是Java容器,java容器是javaAPI所提供的一系列类的实例,用于在程序中存放对象,主要位于Java.util包中,其长度不受限制,类型不受限制,你在存放String类的时候依然能够存放Integer类,两者不会冲突。
容器API类图结果如下所示:
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
举例:
- import java.util.*;
- public class TestA{
- public static void main(String[] args)
- {
- Collection<String> lstcoll=new ArrayList<String>();
- lstcoll.add("China");
- lstcoll.add(new String("ZD"));
- System.out.println("size="+lstcoll.size());
- System.out.println(lstcoll);
- }
- }
结果:
List接口
- import java.util.*;
- public class TestB{
- public static void main(String[] args)
- {
- List<String> l1=new LinkedList<String>();
- for(int i=0;i<=5;i++){
- l1.add("a"+i);
- }
- System.out.println(l1);
- l1.add(3,"a100");
- System.out.println(l1);
- l1.set(6,"a200");
- System.out.println(l1);
- System.out.println((String)l1.get(2)+" ");
- l1.remove(1);
- System.out.println(l1);
- }
- }
ArrayList
ArrayList其实就相当于顺式存储,它包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象时,数组的大小也相应的改变。这样就带来以下有特点:
快速随即访问,你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。
向其中添加对象速度慢,当你创建数组时并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。
操作其中对象的速度慢,当你要向数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。
LinkedList
LinkedList相当于链式存储,它是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有特点:
操作其中对象的速度快,只需要改变连接,新的节点可以在内存中的任何地方。
不能随即访问,虽然存在get()方法,但是这个方法是通过遍历接点来定位的,所以速度慢。
Set接口
Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
HashSet
- import java.util.*;
- public class TestC{
- public static void main(String[] args)
- {
- Set <String> s=new HashSet<String>();
- s.add("Hello");
- //相同元素
- s.add("Hello");
- System.out.println(s);
- }
- }
HaspMap
- import java.util.*;
- public class TestD{
- public static void main(String[] args)
- {
- Map <String,String> M=new HashMap <String,String>();
- M.put("one",new String("1"));
- M.put("two",new String("2"));
- System.out.println(M);
- }
- }
总结
List的选择:
比如:ArrayList和LinkedList都实现了List接口.因此无论选择哪一个,基本操作都一样.但ArrayList是由数组提供底层支持.而LinkedList是由双向链表实现的.所以,如果要经常向List里插入或删除数据,LinkedList会比较好.否则应该用速度更快的ArrayList。
Set的选择
HashSet总是比TreeSet 性能要好.而后者存在的理由就是它可以维持元素的排序状态.所以,如果需要一个排好序的Set时,才应该用TreeSet。
Map选择:
同上,尽量选择HashMap。