标签:
Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。
图(1)
分析:
在整个java类集中最常使用的类集接口有Collection、Set、List、Map接口,注意以上都是接口,Collection是List和Set两个接口的基接口,都不能实例化。而我们可以将类集接口(集合类)分为两个大类,一类集合类继承Collection接口,另一类集合类继承Map接口。至于为什么这么区别,是有原因的,Collection和Map接口之间的主要区别:Collection中存储了一组对象,而Map存储关键字/值对。他们的关系如上图(1)所示,其中HashSet、LinkedList、ArrayList、HashMap是用于实现对应接口的类。
Collection接口定义了存取一组对象的方法,其中子接口Set和List分别定义了存储方式。
. Set中的数据对象没有顺序且不可以重复。
. List中的数据对象有顺序且可以重复。
Map接口定义存储“键(key)----值(value)映射对”的方法
下面将分节详细介绍,不过在详细介绍之前我们有必要再来了解一下三种集合类型,注意是集合类型,而我们下下面要搞清楚的是去实现这些集合类型所用的集合类。set(集)、list(列表)和map(映射)。
(1)set(集)集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。
(2)list(列表)列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,比如链表式。当然,它与根本没有顺序的集是不同的。列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。 关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介
(3)map(映射) 映射与集或列表有明显区别,映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
Java集合类主要由两个接口派生出来:
Collection
Set :不能存放重复对象
List :可存放重复对象,有序
Queue :队列
SortedSet:可对集合数据排序
SortedSet :可对集合数据排序MapMap
hashMap
SortedMap:可对集合数据排序
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的“子接口”如List和Set。也就是说JDK不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
( Collection是List和Set两个接口的基接口,List在Collection之上增加了"有序",Set在Collection之上增加了"唯一" 。)
Collection接口有如下基本通用方法:
boolean add(Object o):该方法用于向集合里面添加一个元素,若集合对象被添加操作改变了,返回true.
boolean addAll(Collection c):把集合c里面的所有元素添加到指定集合里面去,如果集合对象被添加操作改变了返回true.
void clear():清除集合里面的所有元素,将集合长度变为0。
boolean contains(Object o):返回集合里是否包含指定的元素。
boolean containsAll(Collection c):返回集合里是否包含集合c内所有的元素。
boolean isEmpty():返回集合是否为空(长度是否为0)。
Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
boolean remove(Object o):删除集合中指定元素o。
boolean removeAll(Collection c):从集合中删除集合c里面的元素。若删除一个或以上返回true。
boolean retainAll(Collection c):从集合中删除集合c里不包含的元素。
int size():得到集合元素的个数。
Object[] toArray():把集合转成一个数组,所有集合元素编程数组元素。
接下来将在程序实例中详细介绍这些方法的意义以及用法
演示程序1:程序中有详细方法的分析
import java.util.ArrayList; import java.util.Collection; import java.util.Date; /** * 在集合里的存储,永远存的是 一个引用地址 * @author will * */ public class Collectionadd { public static void main(String[] args) { //—————————————————————————————————add、addAll方法演示—————————————————————————————————————————————————————————— Collection c = new ArrayList();//这里要特别注意,ArrayList可以用Collection的其他实现类来取代 //这是一个向上转型 c.add("A"); boolean b = c.add("B"); System.out.println(b);//TRUE c.add(1);//java5之前不允许,Java5之前没有自动装箱 c.add(new Integer(2));//这是JAVA5之前采用的处理方法 c.add(3); System.out.println(c);//[A, B, 1, 2, 3] StringBuilder s = new StringBuilder("AAAAA"); c.add(s); System.out.println(c);//[A, B, 1, 2, 3, AAAAA] s.append("BBBBB"); System.out.println(s);//打印结果是AAAAABBBBB表明集合里的存储的是 一个引用地址 System.out.println(c);//[A, B, 1, 2, 3, AAAAABBBBB] Collection c2 = new ArrayList(); c2.add("hello"); c2.add("今天的日期:" + new Date());//Mon Jun 08 14:11:53 CST 2015 c.addAll(c2); System.out.println(c); c.clear(); System.out.println(c); //———————————————————————————————————add、addAll方法演示—————————————————————————————————————————————————————————— } }
演示程序2:程序中有详细的方法分析
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; //——————————————————————contains、isEmpty、remove、retainAll、size、Object[] toArray()—————————————————————————————— public class CollectionQitafangfa { public static void main(String[] args) { Collection c = new ArrayList(); c.add("AB"); c.add("C"); c.add(new Integer(1)); c.add("你好啊"); System.out.println(c);//[AB, C, 1, 2] Collection c2 = new ArrayList(); c2.add("C"); c2.add("你好啊"); /*JDK里方法的释意: * boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。 */ System.out.println(c.contains("你好啊"));//集合c中如果包含"你好啊"则返回true System.out.println(c.containsAll(c2)); //集合c中如果包含集合c2中的所有元素则返回true System.out.println(c2.containsAll(c)); //结果false /*JDK里方法的释意: * boolean isEmpty() 如果此 collection 不包含元素,则返回 true。 */ System.out.println("c集合是否为空: "+c.isEmpty());//C集合是否为空:false /*JDK里方法的释意: * boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 */ System.out.println(c.remove("你好啊"));//有,且移除,结果返回true System.out.println(c.remove("我不好"));//集合c中没有"我不好"这一元素,所以返回false System.out.println(c);//[AB, C, 1] c.removeAll(c2);//意思是移除集合c中的那些元素(即集合c与集合c2的交集元素) System.out.println(c);//[AB, 1] System.out.println(c2);//[C, 你好啊] /*JDK里方法的释意: * boolean retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 */ c2.add(1); System.out.println(c2);//[C, 你好啊, 1] c.retainAll(c2);//首先求集合c与集合c2的交集,然后把交集留下在c集合中。 System.out.println(c);//结果是1 /*JDK里方法的释意: * int size() 返回此 collection 中的元素数。 */ System.out.println(c.size());//1 c.add(2); c.add("A"); c.add("B"); System.out.println(c.size());//4 /*JDK里方法的释意: * Object[] toArray()//这里toArray()的类型是Object[].集合可以转成任意数据类型 返回包含此 collection 中所有元素的数组。 */ Object[] ot = c.toArray();//利用集合Collection 的方法来创建一个Object类对象 for (Object o : ot) { System.out.println(o);//1,2,A,B } /** * for-each使用的场合, 数组和 Iterable对象 */ System.out.println("------------------"); for (Object object : c) { System.out.println(object);//1,2,A,B } //——————————————————————contains、isEmpty、remove、retainAll、size、Object[] toArray()—————————————————————————————————————————— } }
不过在介绍Iterator iterator() 方法之前我们有必要先了解一下下面的知识
对于Iterator接口(看JDK文档)
首先实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象,其中Iterator对象称为迭代器,用以方便的实现对容器内元素的遍历操作。Iterator接口主要有以下几个方法:
Boolean hasNext();//判断游标右边是否有元素
Object next(); //返回游标右边的元素并将游标移动到下一个位置
Void remove(); //删除游标左面的元素,在执行完next之后该操作只能执行一次
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it=collection.iterator(); //获得一个迭代子
while(it.hasNext()){
Object obj=it.next(); //得到下一个元素
}
看下面程序实例:import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class CollectionIterator{ public static void main(String[] args) { Collection c = new ArrayList(); c.add("AB"); c.add("C"); c.add(new Integer(1)); c.add("你好啊"); System.out.println(c);//[AB, C, 1, 2] //————————————————————————————————————————————Iterator iterator()方法———————————————————————————————————————————————————————————— /**来自JDK * Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。 * * Iterator接口类中的方法: * boolean hasNext() 如果仍有元素可以迭代,则返回 true。 Object next() 返回迭代的下一个元素。 void remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 */ Iterator it = c.iterator();//条用集合的iterator方法来创建一个迭代器(Tterator)对象it //(一):输出集合c中元素 System.out.println("输出集合c中元素方式(一)-------------------------------------------------------------------"); //每调用next方法后,指针就会向后移动一个位置 System.out.println("----->"+it.next()); System.out.println("----->"+it.next()); System.out.println("----->"+it.next()); System.out.println("----->"+it.next()); //System.out.println(it.next()); //上面这条语句不能继续执行了,因为指针已到最后,没有下一个元素了,否则报错 System.out.println(it.hasNext());//这个地方调用hasNext()方法来查看还有没有下一个集合元素。false if(it.hasNext()){ System.out.println("----->"+it.next()); //这里是没有的,所以在上一句代码返回false之后,这里不执行 } //(二) :输出集合c中元素 System.out.println("输出集合c中元素方式(二)-------------------------------------------------------------------"); it = c.iterator(); while(it.hasNext()){ System.out.println("----->"+it.next()); } //(三) :输出集合c中元素 System.out.println("输出集合c中元素方式(三)-------------------------------------------------------------------"); /* * for(it = c.iterator();it.hasNext();){ System.out.println("for----->"+it.next()); } 性能高一低;此时it在for语句里创建,声明周期短一些 * */ for(it = c.iterator();it.hasNext();){//这里for循环的第三个条件未写,是因hasNext已经将指针移动到了下一个元素 System.out.println("----->"+it.next()); } //————————————————————————————————————————————Iterator iterator()方法——————————————————————————————————————————————————————— } }
未完待续......
标签:
原文地址:http://blog.csdn.net/wjtyy/article/details/46413487