码迷,mamicode.com
首页 > 编程语言 > 详细

java集合框架详解(一)

时间:2015-06-08 17:30:46      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

1、为什么有java集合框架

        线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的接口、类来实现基本的数据结构。这些类均在java.util包中。在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection Framework

       Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。

简而言之为什么出现集合类?

     面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式。数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储任意数据类型,集合只能存储对象。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。


2,总体体系结构

 技术分享

                                                                                                                                                 图(1

        分析:

       在整个java类集中最常使用的类集接口有CollectionSetListMap接口,注意以上都是接口,CollectionListSet两个接口的基接口,都不能实例化。而我们可以将类集接口(集合类)分为两个大类,一类集合类继承Collection接口,另一类集合类继承Map接口。至于为什么这么区别,是有原因的,CollectionMap接口之间的主要区别:Collection中存储了一组对象,而Map存储关键字/值对。他们的关系如上图(1)所示,其中HashSetLinkedListArrayListHashMap是用于实现对应接口的类。

 

       Collection接口定义了存取一组对象的方法,其中子接口SetList分别定义了存储方式。

            . Set中的数据对象没有顺序且不可以重复。

            . List中的数据对象有顺序且可以重复。

       Map接口定义存储“键(key)----(value)映射对”的方法

 

下面将分节详细介绍,不过在详细介绍之前我们有必要再来了解一下三种集合类型,注意是集合类型,而我们下下面要搞清楚的是去实现这些集合类型所用的集合类。set(集)、list(列表)和map(映射)

        (1)set(集)集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。 

        (2)list(列表)列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,比如链表式。当然,它与根本没有顺序的集是不同的。列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。 关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介

        (3)map(映射映射与集或列表有明显区别,映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

3、ClollectionMap

Java集合类主要由两个接口派生出来:

     Collection

Set :不能存放重复对象

                    List :可存放重复对象,有序

                    Queue :队列

                    SortedSet:可对集合数据排序

                    SortedSet :可对集合数据排序Map

     Map

          hashMap

          SortedMap:可对集合数据排序

3.1 Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的“子接口”如ListSet。也就是说JDK不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。 

( CollectionListSet两个接口的基接口,ListCollection之上增加了"有序"SetCollection之上增加了"唯一" 。)

 

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()方法———————————————————————————————————————————————————————		
	}
}

未完待续......


java集合框架详解(一)

标签:

原文地址:http://blog.csdn.net/wjtyy/article/details/46413487

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!