【java】容器
2015-11-16 12:53
246 查看
提到集合我们自然会想到数组,在平时编程时数组的使用让我们的代码更简单容易理解。但是数组的一些特性有时也不能满足我们的需要。比如数组的长度是固定的,而集合的长度是可变的。
下面我们就一起来看看集合。
下图是一张集合的继承关系图.Collection接口是层次结构中的根接口.通常不能直接使用,但是该接口提供了添加和删除元素、管理数据的方法。由于list和set接口都实现了Collection接口,因此这些方法对List集合和Set集合都是通用的。
List接口中适合于自身的方法都与索引有关。List集合以线性方式存储对象,因此可以通过对象的索引来操作对象。
1. ArrayList
该类实现了可变的数组,允许所有的元素,包含null。可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢
List<String>list1=new ArryaList<String>();
2. LinkedList
该类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象。但是随机访问集合中的对象时效率较慢。
List<String> list2=new LinkedList<String>();
Set的实现类为TreeSet和HashSet。TreeSet和HashSet的不同就是前者存入的时候会按照一定的顺序存入,Treeset是一个有序的集合,默认的情况下按照自然顺序进行排序。HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。
1. HashMap
此实现提供了所有可选的映射操作,并允许使用null值和null键。但必须保证键的唯一性。HashMap通过哈希编码对齐内容的映射关系进行快速查找。此类不保证映射的顺序,
2. TreeMap
该类实现了Map接口和storedMap接口。因此集合中的映射关系具有一定的顺序。但是在添加。删除和定位上比Hashmap性能要差一些。由于TreeMap类实现的Map集合中的映射关系是按照一定的顺序排列的,因此不能为null值。
在使用过程中可以通过HashMap类创建Map集合,当需要顺序输出时,再创建一个完全相同的映射关系额TreeMap类实例。
(该实例表示了将HashMap表示成TreeMap)
所有实现了Collection接口的容器都有一个iterator方法用以返回一个实现了Iterator接口的对象。
下面我们就一起来看看集合。
下图是一张集合的继承关系图.Collection接口是层次结构中的根接口.通常不能直接使用,但是该接口提供了添加和删除元素、管理数据的方法。由于list和set接口都实现了Collection接口,因此这些方法对List集合和Set集合都是通用的。
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使用的是键值对。这些不同的容器各有千秋,掌握他们的一些特性能让我们写出更高效的程序。最后因为这些容器在操作上大致相同,所以写了一个统一的接口来提供一个统一的操作。相关文章推荐
- Spring MVC
- 15-11-16 Eclipse 操作菜单汉译之 Run [运行]
- Struts2系统学习(17)Struts2标签库详解
- 《深入理解Java虚拟机》学习笔记之类加载机制总结
- Java Web(6)论如何在 Listener获取Spring Bean
- Java多线程-线程的调度(守护线程)
- Struts学习(一)
- jsp+servlet+javabean实现数据分页方法完整实例
- myeclipse删除工程后出现Could not publish to the server
- ACM java
- 再谈如何将android studio项目转换成eclipse
- 15-11-16 Eclipse 操作菜单汉译之Edit [编辑]
- 解决eclipse的 验证位置时发生错误 方法
- java POI 将txt文件导入到excel中
- java使用域账号登陆,ldap协议
- 15-11-16 Eclipse 操作菜单汉译之File[文件]
- Eclipse如何快速修改工程名及包名
- Java访问WebRoot目录下文件
- Eclipse中的.project 和 .classpath文件的具体作用
- Spring常用注解,自动扫描装配Bean