您的位置:首页 > 编程语言 > Java开发

java集合框架详解(一)

2015-06-08 15:37 561 查看

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


未完待续......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: