主题: Java集合类全接触(原创)
精华帖 (0)   良好帖 (0)   新手帖(0)   垃圾帖 (0)      收藏
  • jixiaoxing 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:jixiaoxing
  • 专家等级:中级程序员
  • 专家分:2927
  • 可用分等级:富农
  • 精华:0
  • 帖子数:815
  • 结帖率: 100%
  • 注册时间:2009-12-02 09:06:18
发表于 2009-12-09 17:32:14
楼主

 Java集合类全接触(原创)

      [关键字: 集合]

 

在我们未接触集合之前,当我们存储一组相似的数据时,首先想到的是数组,但是数组有太多弊端限制了我们开发的扩展。比如:在创建Java数组时,数组的长度必要要指定。数组一旦创建好之后,长度不能改变。在同一个数组中只能存放同一种类型的数据(基本类型和引用类型)。为了使程序能方便的存储和操作数目不固定的一组数据,JDK类库种提供了Java集合。所有的Java集合都在java.util包中.在集合中,只能存放对象的引用,而不能存放基本数据类型。
 
下面让我们来了解一下java的集合类,以下是java集合的3种类型:

 

 

Set(集)集合中的对象无排列顺序,并且没有重复的对象.它的有些实现类能对集合中的对象按照特定的方式进行排序。
List(队列)集合中的对象按照索引的顺序排列,可以有重复的对象; 可以按照对象在集合中的索引位置检索对象.List与数组有些相似。
Map(映射):集合中的每一个元素都是一对一对的,包括一个key对象,一个Value对象(一个Key指向一个Value).集合中没有重复的key对象,但是vaulue对象可以重复.它的有些实现类能对集合怀中的键对象进行排序。
 
Ok,了解了集合就是这3种类型后,我们再从宏观的角度了解一下集合类,以下是集合类的类框图:
 
 

 

从上图可以看出,集合中最为重要的接口是Collection,在Collection接口中声明了适合的Java集合(List和Set)适合的方法,如下:

方法
描述
boolean add(Object obj)
向集合中添加一个对象
void clear()
删除集合中所有的对象
boolean contains(Object o)
判断在集合中是否包含特定的对象的引用
boolean isEmpty()
判断集合是否为空
Iterator iterator()
返回一个Iterator类型的对象,用它来遍历集合
boolean remove(Object o)
从集合中删除一个对象
int size()
返回集合中元素的数量
Object[] toArray()
返回一个对象的数组,该数组中包含集合中所有的元素

而,Iterator接口封装了底层的数据结构,向用户提供了统一遍历集合的方法,在Iterator接口中声明了如下的方法

方法
描述
boolean hasNext()
判断集合中是否还有下一个元素
Object next()
返回下一个元素
void remove()
从集合中删除一个由next()方法返回的元素

 
让我们写一段代码,体味一下Collection与Iterator接口:

Java代码

import java.util.*;

public class CollectionTest {

	public static void main(String[] args) {

		CollectionTest test = new CollectionTest();
		Set set = new HashSet();
		set.add("One");
		set.add("Two");
		set.add("Three");
		test.print(set);
		
		List list = new ArrayList();
		list.add("AAA");
		list.add("BBB");
		list.add("CCC");
		test.print(list);

	}

	public void print(Collection coll) {
		Iterator iter = coll.iterator();
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
	}

}


 

以上代码运行结果为:
Three
One
Two
AAA
BBB
CCC
说明了:如果集合中的元素没有排序,Iterator遍历集合取出来的元素的顺序也是无序的.并不一定与加入元素的顺序一致。
      
 介绍完了Collection接口,我们再看看继承于它的两个接口Set接口和List接口,及Map接口。

 

Set最为主要的特征是集合中的对象不按照特定的方式排序,并且没有重复的对象。
它的主要实现类包括:
  1. HashSet类按照哈希算法来存取集合中的对象,速度较快。
  2. LinkedHashSet类不仅实现了哈希算法,而且实现了链表的数据结构,提高了插入和删除的功能。
  3. TreeSet类实现了SortedSet接口,具有排序的功能。
 
List主要特征是其元素以线型方式存储,集合中可以存放重复的对象
List的主要实现类包括:
  1.  ArrayList:代表长度可变的数组。可以对元素快速的随机访问。但是向ArratList插入或删除元素的速度较慢。
  2. LinkedList:在实现中才用了链表的数据接口,对顺序访问进行了优化。向List中插入和删除数据的速度快,随即访问的速度较慢。

 

 

 

Map是一种把键对象和值对象进行映射的集合,他的每一个元素都包含一个键对象,一个值对象,键对象相当于值对象的索引,而且值对象仍然可以是Map类型的。
它的主要实现类为:
1. HashMap安装Hash算法来存取键对象,有很好的存取性能;为了保证HashMap能正常工作,和HashSet一样,要求键对象要覆盖的equals()方法和hashCode()方法。
2. TreeMap类实现了SortedMap接口,能对键对象进行排序。
 

以上是对于整体框架的全面概述,关于实现类的详细细节以后再补充……

 

 


  • FrogKing 我现在不在线,你找我吗?
  • 显示用户头像
  • 昵称:FrogKing
  • 专家等级:中级程序员
  • 专家分:3852
  • 可用分等级:富农
  • 精华:0
  • 帖子数:916
  • 结帖率: 31%
  • 注册时间:2009-11-20 13:57:47
发表于 2009-12-11 17:53:37
第 1 楼

 回复:Java集合类全接触(原创)

楼主讲得够详细啊,看了后绝对有收获,尤其是呢个图画的到位


  • Michael_chen 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:Michael_chen
  • 专家等级:新手上路
  • 专家分:0
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:64
  • 结帖率: 50%
  • 注册时间:2009-11-12 18:54:20
发表于 2009-12-12 22:07:12
第 2 楼

 回复:Java集合类全接触(原创)

楼主讲的东西从大局出发,讲的非常好,不过我一直对那个哈希值,哈希表不理解,它怎么就查找速度快,大致上是怎么实现的。能把这个东西详细讲讲吗?热烈期待,呵呵!


  • haha0515 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:牛牛
  • 专家等级:新手上路
  • 专家分:0
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:3
  • 结帖率: 100%
  • 注册时间:2009-12-14 10:06:48
发表于 2009-12-14 21:36:58
第 3 楼

 回复:Java集合类全接触(原创)

恩,学习了!


  • wssshe163 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:wssshe163
  • 专家等级:新手上路
  • 专家分:0
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:2
  • 结帖率: 100%
  • 注册时间:2009-12-15 16:03:51
发表于 2009-12-15 16:46:28
第 4 楼

 回复:Java集合类全接触(原创)

谢谢!!!!!!!!


  • qiuyanluocheng 我现在不在线,你找我吗?
  • 显示用户头像
  • 昵称:qiuyanluocheng
  • 专家等级:中级程序员
  • 专家分:2323
  • 可用分等级:猎人
  • 精华:0
  • 帖子数:496
  • 结帖率: 92%
  • 注册时间:2009-12-07 14:18:41
发表于 2009-12-16 10:15:03
第 5 楼

 回复:Java集合类全接触(原创)

以下是引用Michael_chen在2009-12-12 22:07:12的发言:

楼主讲的东西从大局出发,讲的非常好,不过我一直对那个哈希值,哈希表不理解,它怎么就查找速度快,大致上是怎么实现的。能把这个东西详细讲讲吗?热烈期待,呵呵!

我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,也就是哈希值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方。
但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。如此以来,就要用到哈希解决冲突的方法了。
总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。

下次要查找某个元素,只要给出关键字,通过哈希函数获得哈希值(也就是数组下标),就可以直接去数组中查出,不需再将数组中的元素一一取出对比了,如此大大节省了查找时间。


  • david4034647 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:david4034647
  • 专家等级:新手上路
  • 专家分:60
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:6
  • 结帖率: 100%
  • 注册时间:2009-12-28 12:51:02
发表于 2009-12-28 13:20:27
第 6 楼

 回复:Java集合类全接触(原创)

更新一下:

1、在集合中,只能存放对象的引用,而不能存放基本数据类型。

-----》这个应该是可以的

HashMap map = new HashMap();
  float f = 34.888f;
  map.put("test", f);

2、说明了:如果集合中的元素没有排序,Iterator遍历集合取出来的元素的顺序也是无序的.并不一定与加入元素的顺序一致。

-----》set是这样,但list还是有顺序的,就想你例子里打印出来的结果可以看出。


  • Belial2010 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:Belial2010
  • 专家等级:新手上路
  • 专家分:0
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:5
  • 结帖率: 100%
  • 注册时间:2010-01-04 13:03:55
发表于 2010-01-04 13:43:18
第 7 楼

 回复:Java集合类全接触(原创)

学习了,以后看来要多看看


  • cg546472983 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:cg546472983
  • 专家等级:新手上路
  • 专家分:0
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:12
  • 结帖率: 100%
  • 注册时间:2010-05-06 22:33:43
发表于 2010-05-06 22:51:09
第 8 楼

 回复:Java集合类全接触(原创)

新手学习,希望进步


  • mwzz2005 我现在不在线,你找我吗?
  • 显示默认头像
  • 昵称:mwzz2005
  • 专家等级:新手上路
  • 专家分:0
  • 可用分等级:佃户
  • 精华:0
  • 帖子数:1
  • 结帖率: 100%
  • 注册时间:2010-06-13 18:32:23
发表于 2010-06-13 18:51:43
第 9 楼

 回复:Java集合类全接触(原创)

学习了,谢谢


快速回复主题
您还未登录,不能回复帖子
phome.asia   程序员之家论坛
程序员之家 版权所有 Copyright 2004-2009 All Rights Reserved©2009 京 ICP 备 05027197 号 网站地图 关于我们 联系我们