java集合框架详解(一)

1、为什么有java集合框架

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

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

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

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

2,总体体系结构

图(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)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

3、Clollection与Map

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的“子接口”如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()方法———————————————————————————————————————————————————————
	}
}

未完待续......

时间: 2024-08-15 06:20:43

java集合框架详解(一)的相关文章

另外几种Java集合框架详解续

另外几种Java集合框架详解续 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs fastutil库优于Trove库的地方:Trove库已经三年未更新了,属于非活跃的开源项目:而fastutil一直在更新.fastutil有更丰富的特性,支持超大的集合(大于2^32,即4GB的集合),文档也更丰富. fastutil是一个开源的Java集合框架的扩展,它继承了Java Collection Framework,提供了数

java集合框架详解

前言: 数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法. 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework). Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应

Java集合框架详解(全)

一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下: 1)数组长度不可变化而且无法保存具有映射关系的数据:集合类用于保存数量不确定的数据,以及保存具有映射关系的数据. 2)数组元素既可以是基本类型的值,也可以是对象:集合只能保存对象. Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:Li

java集合框架详解(二)、set接口

3.1.2 Set接口 首先我们应该知道Set是Collection接口的子接口 Set和Collection基本是一样的,但一点除外:Set无法记住添加的顺序,不允许包含重复的元素.一个不包含重复元素的 collection.更确切地讲,set 不包含满足e 1.equals(e 2)的元素对e 1和e 2,并且最多包含一个 null 元素. 有几点说明: 1.当试图添加两个相同元素进Set集合,添加操作会失败,add()方法返回false. 2.Set判断两个对象是否相等用equals,而不

Java基础之集合框架详解(一)

集合框架的相关定义 集合:即存储对象的容器. 框架:即类库的集合. 集合框架:即用来表示和操作集合的统一框架,由相关的接口.实现类和一些帮助程序员完成编程的算法. 集合的作用: 在类的内部,对数据进行组织 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 集合与数组的区别: 集合长度是可变的,数组长度是固定不变的 集合中

Java集合类型详解

这篇文章总结了所有的Java集合(Collection).主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式. Arrays Array是Java特有的数组.在你知道所要处理数据元素个数的情况下非常好用.java.util.Arrays 包含了许多处理数据的实用方法: Arrays.asList:可以从 Array 转换成 List.可以作为其他集合类型构造器的参数. Arrays.binarySearch:在一个已排序的或者其中一段中快速查找. Arrays.copyOf:如果你

Java基础之集合框架详解(三)Set篇

相关定义 作为Collection接口的重要子接口,Set接口是一个不包含重复元素,且元素排列无序的集合,也被称为集. 注意:不包含重复元素的含义,更确切的讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素. Set接口的方法和Collection接口的方法大体相同,也就是说Set接口不像List接口那样可以通过索引或去元素,只能通过Iterator()方法获取迭代器进行迭代. Set中的add方法不同于Collection接口,有一个

java SSH框架详解(面试和学习都是最好的收藏资料)

Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC中的模型.视图.控制器它们分别担负着不同的任务.视图: 视图是用户看到并与之交互的界面.视图向用户显示相关的数据,并接受用户的输入.视图不进行任何业务逻辑处理.模型: 模型表示业务数据和业务处理.相当于JavaBean.一个模型能为多个视图提供数据.这提高了应用程序的重用性控制器: 当用户单击Web

Java Collection框架详解

引用自:http://blog.sina.com.cn/s/blog_6d6f5d7d0100s9nu.html 经常会看到程序中使用了记录集,常用的有Collection.HashMap.HashSet.ArrayList,因为分不清楚它们之间的关系,所以在使用时经常会混淆,以至于不知道从何下手.在这儿作了一个小例子,希望有助于帮大家理顺思路. 首先看一下它们的关系: Collection --List:-----------------------以特定次序存储元素.所以取出来的顺序可能和放