企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
提到集合我们自然会想到数组,在平时编程时数组的使用让我们的代码更简单容易理解。但是数组的一些特性有时也不能满足我们的需要。比如数组的长度是固定的,而集合的长度是可变的。 下面我们就一起来看看集合。 下图是一张集合的继承关系图.Collection接口是层次结构中的根接口.通常不能直接使用,但是该接口提供了添加和删除元素、管理数据的方法。由于list和set接口都实现了Collection接口,因此这些方法对List集合和Set集合都是通用的。 ![](https://box.kancloud.cn/2016-03-23_56f1fee54565e.jpg) ### List(列表) List部分分为list接口和两个实现类Arraylist和Linkedlist。 List接口中适合于自身的方法都与索引有关。List集合以线性方式存储对象,因此可以通过对象的索引来操作对象。 1.ArrayList 该类实现了可变的数组,允许所有的元素,包含null。可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢 List<String>list1=new ArryaList<String>(); 2.LinkedList 该类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象。但是随机访问集合中的对象时效率较慢。 List<String> list2=new LinkedList<String>(); ### Set(集合) Set集合中不允许存在重复值。而且集合中的对象是无序的,遍历set集合的结果与插入set集合的结果不一定是相同的。在实际的使用中,我们使用最多的特性是set能够去掉重复的元素并获取响应的数据。 Set的实现类为TreeSet和HashSet。TreeSet和HashSet的不同就是前者存入的时候会按照一定的顺序存入,Treeset是一个有序的集合,默认的情况下按照自然顺序进行排序。HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。 ### Map(映射) Map接口中提供了将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值。由于Map集合中的元素是通过Key,value进行存储的。要获得集合中指定的key值和value值,需要先通过相应的方法获取key集合或value集合。再遍历key集合或value集合获取指定值。 1.HashMap 此实现提供了所有可选的映射操作,并允许使用null值和null键。但必须保证键的唯一性。HashMap通过哈希编码对齐内容的映射关系进行快速查找。此类不保证映射的顺序, 2.TreeMap 该类实现了Map接口和storedMap接口。因此集合中的映射关系具有一定的顺序。但是在添加。删除和定位上比Hashmap性能要差一些。由于TreeMap类实现的Map集合中的映射关系是按照一定的顺序排列的,因此不能为null值。 在使用过程中可以通过HashMap类创建Map集合,当需要顺序输出时,再创建一个完全相同的映射关系额TreeMap类实例。 (该实例表示了将HashMap表示成TreeMap) ~~~ public static void main(String[] args) { Map map=new HashMap();//定义一个hashmap map.put("李","李");//向容器中添加数据 map.put("王","王"); map.put("赵","赵"); map.put("钱","钱"); Set set=map.keySet();//获取Map集合中的key对象集合 Iterator it=set.iterator(); while(it.hasNext()) {//遍历Map集合 String str=(String)it.next(); String name=(String)map.get(str);//通过key得到value值 System.out.println(str+""+name);//输出HashMap类实现的集合(无序) } TreeMap treemap=new TreeMap(); treemap.putAll(map);//向集合中添加对象,将HashMap转换为TreeMap; Iterator iter=treemap.keySet().iterator(); while(iter.hasNext()){ String str=(String ) iter.next(); String name=(String)map.get(str); System.out.println(str+""+name);//输出Treemap类实现的集合(有序) } } ~~~ ### 迭代器 从上面我们可以看到java中有这么多的接口。对数据容器的操作在很多的时候都有很多相同的地方,于是java采用迭代器这种公共的操作接口。使用java迭代器可以使得对容器的遍历操作完全与底层隔离,可以达到极好的解耦效果。 所有实现了Collection接口的容器都有一个iterator方法用以返回一个实现了Iterator接口的对象。 ~~~ public class IteratorDemo { public static void main(String[] args) { List<Integer> list=new ArrayList<Integer>(); for(int i=0;i<10;i++) { list.add(i); } System.out.println("以下是列表中的元素"); for ( Iterator<Integer> it=list.iterator();it.hasNext();)//使用迭代器 { System.out.println(it.next()); } } } ~~~ ### 总结: 在容器中我们可以看到分为了三类:列表(List),集合(Set)和映射(Map)不同的容器让我们在不同的情况下去使用。比如List,方便通过索引查找对象。使用Set可以保证数据不重复,Map使用的是键值对。这些不同的容器各有千秋,掌握他们的一些特性能让我们写出更高效的程序。最后因为这些容器在操作上大致相同,所以写了一个统一的接口来提供一个统一的操作。