关于java容器的基础知识
2009-03-06 13:35
399 查看
对象的集合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()
文章出处:http://www.diybl.com/course/3_program/java/javajs/2007923/73075.html
容器类类库的用途是持有对象,所有的容器都只能保存对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()
文章出处:http://www.diybl.com/course/3_program/java/javajs/2007923/73075.html
相关文章推荐
- java 基础知识学习 关于abstract interface final
- 纠错 : 关于书籍<java核心技术 卷I 基础知识 第八版> 第五章 Employee/Manager 两个例子
- java 关于网络通讯/Tcp 基础知识
- Java基础知识之容器(一:容器整体框架探索)
- 关于java基础知识的一些小感悟
- java基础知识要点总结之几个重要关键字(关于static、this、final、)
- 关于Java的基础小知识
- Java基础——关于抽象类,接口和内部类(inner class)的相关知识
- 黑马程序员---------java 基础知识复习(foreach、Arrays、String、StringBuffer、容器类)
- 再学java基础(6)关于 java IO 知识汇总。
- 使用java语言基础部分知识,做一个简易的2个数之间的关于算术运算符的计算。
- 关于Java你应该掌握的基础知识—银行笔试必考(作者亲生经历的java试题)
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- Java的基础知识4——容器
- 关于进行java学习和Android开发,本人认为的一些基础的入门必需知识,全程手敲
- 关于java的一些基础知识和经验
- Java基础知识之容器(一)
- java基础知识(容器)-01
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 【脚本语言系列】关于Python基础知识容器,你需要知道的事