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

原创 2007年09月18日 22:55:00

对象的集合

1 概述

容器类类库的用途是持有对象,所有的容器都只能保存对Object的引用。包括:

1Collection: 一组独立的元素

List: 必须保持元素特定的顺序

Set: 不能有重复元素

2Map: 一组成对的键值对(key-value pairkey and value are all objects)对象。因此Map 可以返回所有键(key)组成的 Set,所有值(value)组成的Collection

JDK1.4)容器类框架全景图:

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

  

2 容器中的对象都是Object

在将对象加入容器的时候就丢失了类型信息

1. 容器中只能容纳对象,不能容纳基本类型

2. 在使用容器中的元素前必须要做类型转换操作

3迭代器(Iterator

遍历并选择序列中的对象。客户端程序员不关心序列底层的结构。

1. 集合对象的iterator()方法要求容器返回一个Iterator。第一次调用Iteratornext()方法时,它返回序列的第一个元素。

2. 使用next()获得序列中的下一个元素。而且只能向下移动

3. 使用hasNext()检查序列中是否还有元素。

4. 使用remove()将上一次返回的元素从迭代器中移除

4 List

List: interface,次序是 List 最重要的特点;它保证维护元素特定的顺序。

1 ArrayList,由数组实现的List。允许对元素进行快速随机访问,但是向List 中间插入与移除元素的速度很慢。

2LinkedList,对顺序访问进行了优化,向 List 中间插入与删除的开销并不大。随机访问则相对较慢。

5 Set

Set (interface):存入 Set 的每个元素都必须是唯一的。因为Set 不保存重复元素,加入 Set 的元素必须定义equals()方法以确保对象的唯一性。Set 接口不保证维护元素的次序。

1.  HashSet:为快速查找设计的Set。存入HashSet 的对象必须定义hashCode()

:重载equals()方法时永远要重载hashCode()方法。否则的话会导致类与所有基于散列的集合一起使用时不能正常工作,这些集合包括HashSetHashMapHashtable

java.lang.Object规范的约定:

a)         如果在应用程序执行期间,用于对象的equals()方法中的信息不被修改,那么对同一对象的多次调用,hashCode()方法总是返回相同的整数。这个整数不要求在同一应用程序的不同执行间保持一致

b)        如果两个对象按照equals()方法是相同的,那么对这两个对象的任一个调用hashCode()方法,必须要产生同样的整数结果

c)        如果两个对象根据equals()方法不相同,那么对这两个对象中的任一个对象调用hashCode()方法,不要求产生两个不同的整数结果。但是,为不相等的对象产生不同的整数结果可以提高hash表的性能

6 Map

ArrayList 使用数字从对象序列中选择元素,因此它在数字与对象之间建立了关联。Map维护“键值对”的关联性,使你可以通过“键”查找“值”。

1HashMapMap基于散列表的实现(无序)。

7 HashMap & Hashtable ArrayList & Vector

HashMapHashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口,主要区别在于:

Ø         HashMap允许空(null)键值(key),而Hashtable不允许。HashMap由于非线程安全,效率上要高于Hashtable

Ø         HashMapHashtablecontains方法去掉了,改成containsValuecontainsKey。因为contains方法容易让人引起误解。

Ø         Hashtable继承自Dictionary类,而HashMapJava1.2引进的Map 接口的一个实现。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供同步。

Ø         HashtableHashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

 

ArrayListVector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,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>

我的java学习笔记(1)不按时间顺序

Try{       For(; ;){       Try{       // }catch(Exception e){              //}finally{       Continu...
  • paulfong
  • paulfong
  • 2007年09月18日 22:47
  • 347

批处理 按顺序按时间重命名文件

转载自:http://hi.baidu.com/zhhb/blog/item/aa0b1bd533a043cf50da4bbd.html @echo off :k...
  • xuehuic
  • xuehuic
  • 2011年12月04日 23:59
  • 2230

Copy文件的顺序

选择一批文件(列表或详细资料查看方式),拖动copy.第一个copy的文件将是拖动时鼠标所在的文件(有个虚线标识),接着是按列表顺序copy.手机上文件缺省按上传顺序排列,才注意到这一点。...
  • redvalley
  • redvalley
  • 2005年10月30日 13:11
  • 861

C程序设计综合练习-- 综合测验2:

1. 题目(Description): 输入整数a和b,如果a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。 输入(Input): 两个整数 输出...
  • yanyangjie
  • yanyangjie
  • 2018年01月15日 15:15
  • 47

java中map里面的key按我们插入进去的顺序输出

TreeMap的顺序是自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序。  用LinkedHashMap吧。它内部有一个链表,保持插入的顺序。迭代的时候,也是按照插入顺序迭代,而...
  • Zhangxichao100
  • Zhangxichao100
  • 2017年05月17日 16:48
  • 1771

再次明确Oracle插入与读取的顺序问题

今天老婆问到一个问题:Oracle中,插入多条记录后,读的时候如果不用Order by,那顺序是如何?如果中间涉及UPDATE和DELETE,是否有影响? 这个其实之前总结过这个问题,但确实...
  • bisal
  • bisal
  • 2013年12月07日 18:57
  • 3845

定义枚举实例时按照顺序定义的好处

java的枚举基本上大家都用过,枚举定义时候的顺序对程序的影响呢,呵呵,我也是最近才发现这个问题,这涉及到两个方法public final int compareTo(E o);和public fin...
  • coffee_hc
  • coffee_hc
  • 2014年09月17日 08:49
  • 891

c++如何顺序遍历目录下所有文件

此问题还未找到有效解决办法......
  • Allyli0022
  • Allyli0022
  • 2018年01月08日 20:54
  • 82

python os.listdir按文件存取时间顺序列出目录

import os DIR = "/home/serho/workspace/lisp" def compare(x, y):     stat_x = os...
  • chengxuyuanyonghu
  • chengxuyuanyonghu
  • 2016年04月21日 16:33
  • 3790

Python之Matplotlib 解决绘图 X 轴值不按数组排序问题.

在用Matplotlib库绘制折线图的时候遇到一个问题,当定义一个x轴数组时,plot绘制折线图时,x轴并不会按照我们定义的数组的顺序去排列显示,例如:import matplotlib.pyplot...
  • zmisno1
  • zmisno1
  • 2018年01月20日 11:18
  • 136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的JAVA学习笔记(2)不按时间顺序
举报原因:
原因补充:

(最多只允许输入30个字)