您的位置:首页 > 其它

我的JAVA学习笔记(2)不按时间顺序

2007-09-18 22:55 337 查看

对象的集合

1 概述

容器类类库的用途是持有对象,所有的容器都只能保存对Object的引用。包括:
1.Collection: 一组独立的元素
List: 必须保持元素特定的顺序
Set: 不能有重复元素
2.Map: 一组成对的键值对(key-value pair,key and value are all objects)对象。因此Map 可以返回所有键(key)组成的 Set,所有值(value)组成的Collection。
JDK(1.4)容器类框架全景图:

更多的时候我们只关心顶层的接口(interface)和具体的实现类(concrete class),而且不再推荐使用遗留的类(如Vector、Hashtable等)。可以将上图简化为:
  

2 容器中的对象都是Object

在将对象加入容器的时候就丢失了类型信息
1. 容器中只能容纳对象,不能容纳基本类型
2. 在使用容器中的元素前必须要做类型转换操作

3迭代器(Iterator)

遍历并选择序列中的对象。客户端程序员不关心序列底层的结构。
1. 集合对象的iterator()方法要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
2. 使用next()获得序列中的下一个元素。而且只能向下移动
3. 使用hasNext()检查序列中是否还有元素。
4. 使用remove()将上一次返回的元素从迭代器中移除

4 List

List: interface,次序是 List 最重要的特点;它保证维护元素特定的顺序。
1. ArrayList,由数组实现的List。允许对元素进行快速随机访问,但是向List 中间插入与移除元素的速度很慢。
2.LinkedList,对顺序访问进行了优化,向 List 中间插入与删除的开销并不大。随机访问则相对较慢。

5 Set

Set (interface):存入 Set 的每个元素都必须是唯一的。因为Set 不保存重复元素,加入 Set 的元素必须定义equals()方法以确保对象的唯一性。Set 接口不保证维护元素的次序。
1.  HashSet:为快速查找设计的Set。存入HashSet 的对象必须定义hashCode()。
注:重载equals()方法时永远要重载hashCode()方法。否则的话会导致类与所有基于散列的集合一起使用时不能正常工作,这些集合包括HashSet、HashMap和Hashtable。
java.lang.Object规范的约定:
a)         如果在应用程序执行期间,用于对象的equals()方法中的信息不被修改,那么对同一对象的多次调用,hashCode()方法总是返回相同的整数。这个整数不要求在同一应用程序的不同执行间保持一致
b)        如果两个对象按照equals()方法是相同的,那么对这两个对象的任一个调用hashCode()方法,必须要产生同样的整数结果
c)        如果两个对象根据equals()方法不相同,那么对这两个对象中的任一个对象调用hashCode()方法,不要求产生两个不同的整数结果。但是,为不相等的对象产生不同的整数结果可以提高hash表的性能

6 Map

ArrayList 使用数字从对象序列中选择元素,因此它在数字与对象之间建立了关联。Map维护“键值对”的关联性,使你可以通过“键”查找“值”。
1.HashMap:Map基于散列表的实现(无序)。

7 HashMap & Hashtable 和 ArrayList & Vector

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口,主要区别在于:
Ø         HashMap允许空(null)键值(key),而Hashtable不允许。HashMap由于非线程安全,效率上要高于Hashtable。
Ø         HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。
Ø         Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map 接口的一个实现。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供同步。
Ø         Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
 

ArrayList与Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法是synchronized的,而ArrayList不是,通常性能上较ArrayList差。
 

 以下是我摘抄的一段不错的总结:
1.Collection: 一组各自独立的元素,通常拥有相同的套用规则,List必须以特定的次序来持有各个元素;Set无法拥有重复元素;ArrayList是一种List,HashSet则是一种Set;add()方法可将元素加入任何一种Collection。

2.Map: 一群成对的key-value对象,不接受重复元素;欲将元素加至Map,可使用put()方法。

Collection在控制台打印结果时以方括号括住,每个元素间以逗号分隔;Map的打印结果则以大括号括住,key和value以等号相连,key在左侧,value在右侧。

Java容器的一个重要特性:容器中存放的是java对象的引用。

Java容器的缺点是,一旦将对象置于容器内,你便损失了他们的型别信息。由于型别信息已失,所以容器惟一知道的事情就是,它所持有的乃是指向对象的一些references,使用之前你必须将元素转卫正确型别,如果将元素从容器中取出并将其转换为不正确的型别,将会得到执行期错误。

List会以元素安插次序来放置元素,不会重新排列;Set,Map则都有自己的内部排列机制。

hash code是一种“将对象内的某些信息转换为几乎独一无二”的int,用以代表这个对象;所有java对象都可以产生hash code,而且hashcCode()是根源于Object所具备的函数。HashMap会运用对象的hashCode(),并利用它来快速查找到key。

Object的hashCode()会被用来产生每个对象的hash code,而且缺省的情况下它直接使用其对象的内存地址;同样的,缺省的Object.equals()只会比较对象的内存地址。因此,当在HashMap中使用自己编写的classes作为key,一定要同时覆写hashCode()和equals()

<script type="text/javascript"><!--google_ad_client = "pub-0068659036624865";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";google_ad_channel ="";//--></script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息