我的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>
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

数据结构与基本算法的学习笔记-顺序搜索-2

顺序搜索及运行时间。

顺序容器 - 2【C++ Primer 学习笔记 - 第九章】

list ilist(10); // 空容器:*ilist.begin() 无法解引用 // 空容器:back()、front() 操作,未定义 if(!ilist.empty()) { list:...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

spring学习笔记(16)趣谈spring 事件机制[2]:多监听器流水线式顺序处理

上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条作业调度流水线,它不能异步,必须按照先后次序执行不...

C++ Primer 学习笔记_28_STL实践与分析(2) --顺序容器的操作(上)

 STL实践与分析 --顺序容器的操作(上) 引: 每种顺序容器都提供了一组有用的类型定义以及以下操作:     1)在容器内添加元素;     2)在容器中删除元素; ...

NO3.java学习笔记(顺序结构、判断结构、选择结构、循环结构、函数)

一、流程控制 1.顺序结构 2.判断结构 if() else if() else if() else int a=1;b=2; if(a>b) System.out.println("a大于b")...

java学习笔记---构造器的多态和调用顺序

话不多说,先看一个例子: public class Constructor extends Child { public Constructor() { System.out.pri...

关于java类初始化顺序的学习笔记

1)类的初始化顺序:(静态变量,静态初始化块)>(变量,初始化块)>构造器 public class InitClass {  // 构造器        public InitClass() {  ...

【Cocos2d-X开发学习笔记】第11期:时间调度schedule函数的使用

对于一个游戏而言,只存在精灵、层、场景等元素是不完整的,而缺少的正是这些元素的逻辑。例如精灵移动的 逻辑、动画逻辑、碰撞逻辑等,而这些逻辑一般情况下是需要及时做出反馈的,所以我们这些逻辑将放置在更新函...

Nilearn学习笔记2-从FMRI数据到时间序列

通过前面的学习了解,我们知道最原始的Fmri数据是4维的,包含三围的空间信息和一维的时间。在实际应用中,我们更多的是利用大脑图像时间序列做研究分析,因为无法直接使用fmri数据做相关研究。在我们使用数...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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