AS3中的Dictionary类

AS3中的Dictionary类(flash.utils.Dictionary)是一个新的AS类。Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键。例如:

var obj:Object = new Object();
obj["name"] = 1; // 键是字符串"name"
obj[1] = 2; // 键是1 (被转换成字符串"1")
obj[new Object()] = 3; // 键是new Object(),被转传成字符串"[object Object]"

for (var prop:String in obj) {
      trace(prop); // 输出:[object Object], 1, name
      trace(obj[prop]); // 输出:3, 2, 1
}

也就是说,无论用什么类型的变量作为键,都将被转换成字符串。同时,如果你使用了不同的对象作为键,都会被转换成字符串"[object Object]"作为键,因此而指向了同一个数据。例如:

var a:Object = new Object();   
var b:Object = new Object();

var obj:Object = new Object();   
obj[a] = 1; // obj["[object Object]"] = 1;   
obj[b] = 2; // obj["[object Object]"] = 2;

for (var prop:String in obj) {   
      trace(prop); // traces: [object Object]   
      trace(obj[prop]); // traces: 2   
}

Dictionary类将没有这个限制,你可以将键设置成任何一种数据类型。例如:

import flash.utils.Dictionary;

var a:Object = new Object();
var b:Object = new Object();

var dict:Dictionary = new Dictionary();
dict[a] = 1; // dict[a] = 1;
dict[b] = 2; // dict[b] = 2;

for (var prop:* in dict) {
      trace(prop); // traces: [object Object], [object Object]
      trace(dict[prop]); // traces: 1, 2
}

注意:

1、虽然在trace的时候,输出的还是[object Object],但是这个结果是对象的toString的结果。在Dictionary对象中,代表的是不同的对象引用。

2、这里的prop的类型是*。这是很重要的,因为dict对象中的键可能是任何数据类型的。

以下是本人对Dictionary与Object的不同之处的一个小结:

1、Object的键必须是字符串,或表示字符串的表达式(变量或函数),若不是字符串的表达式,则将调用toString()方法,将其转化为字符串;

2、与Object不同的是,Dictionary使用的键是对象的引用,而不是字符串,且非原始对象键调用之前是通过全等运算符(===)来进行判断,并不会将数据类型强制转换之后再进行判断。

对象键和内存管理

Adobe Flash Player 使用垃圾回收系统来恢复不再使用的内存。当对象不具有指向它的引用时,即可对其进行垃圾回收,并会在下次执行垃圾回收系统时恢复内存。例如,以下代码创建一个新对象,并将对此对象的引用分配给变量 myObject:
var myObject:Object = new Object();

只要有对此对象的引用,垃圾回收系统就不会恢复此对象占用的内存。如果更改 myObject 的值以使其指向其它对象或将其设置为值 null,并且没有对原始对象的其它引用,则可以对原始对象占用的内存进行垃圾回收。

如果将 myObject 用作 Dictionary 对象中的键,则会创建对原始对象的另一个引用。例如,以下代码创建两个对象引用(myObject 变量和 myMap 对象中的键):
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary();
myMap[myObject] = "foo";

要使 myObject 引用的对象能够进行垃圾回收,您必须删除对它的所有引用。在此情况下,必须更改 myObject 的值并从 myMap 中删除 myObject 键,如以下代码所示:
myObject = null;
delete myMap[myObject];

此外,它可以使用 Dictionary 构造函数的 useWeakReference 参数,以使所有字典的键成为“弱引用”。垃圾回收系统忽略弱引用,也就是说只具有弱引用的对象可以进行垃圾回收。例如,在以下代码中,要使对象能够进行垃圾回收,您不需要从 myMap 中删除 myObject 键:
import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary(true);
myMap[myObject] = "foo";
myObject = null; // 使对象能够进行垃圾回收。

时间: 2024-11-06 11:40:48

AS3中的Dictionary类的相关文章

C#中的Dictionary类,默认key是区分大小写的

在C#中定义一个Dictionary Dictionary<string,string> dictionary = new Dictionary<string,string>(); dictionary.Add("a","b"); dictionary.Add("A","B");//A与a是不同的 但如果想要创建不区分大小写的Dictionary类,也不是没有办法: 使用这样的构造方法就可以了: Dic

as3.0中通过ApplicationDomain类获得被加载swf

as3.0中通过ApplicationDomain类获得被加载swf(转载) 首先先回顾一下FLASH的OO构成.对于FLASH,我们可以把任何的可视化元件都看成某个类文件的具体实例,包括swf文件.我们可以把swf文件看成一个类的具体实例,而它里面拥有个个其他类的实例对象,例如:我们新建一个loaded.fla文件,然后我们建立一个影片剪辑元件,你可以在它的内部做一些动画处理,打开库,单击元件右建,选择“链接”打开“链接属性”,在类的输入框里我们键入“myClass”. 这样一来我们就可以把这

As3.0 Interface 与类的使用

来源:http://blog.sina.com.cn/s/blog_4d65c19e0100bfkb.html 抽象类:又叫抽象基类:可以包含一般类所包含的所有特性,例如,字段,属性,方法,抽象类不能被实例化他主要用在类的定义和部分实现这方面,所以他需要在扩充类中完整的扩充并实现功能.另外抽象类还包含一个很特殊的方法,叫抽象方法(这些方法基本上是没有执行代码的函数,由继承于该类的类重写(override)并提供具体实现).在Java和C#中,有abstract关键字来定义抽象类,而在As3中,并

javaAPI中的常用 类 以及接口

java.lang包中的常用类以及接口 类 1. Integer :Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 2. Math :类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 3 Double :类在对象中包装一个基本类型 double 的值.每个 Double 类型的对象都包含一个 double 类型的字段. 4 Object  :是类层次结构的根类.每个类都使用 Object 作为超类.所有对

Pyhton中的元类

目录 前言 一切皆对象 动态的创建类 到底什么是元类 自定义元类 为什么要用metaclass类而不是函数 结语 前言 本片文章主要是StackOverflow上关于元类解释的高赞文章的译文,顺便加了一点个人的理解. 想看原文的同学可以直接点击 What-are-metaclasses-in-python. 环境使用Python2 一切皆对象 在Python中,一切皆对象. 字符串.列表.字典和函数是对象,类也是对象.因此你可以: 把类赋值给一个变量 可以拷贝它 可以为它添加属性 可以把它作为一

Java Dictionary 类存储键值

字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构. 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary. 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary. 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary. 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary. Dictionary类已经过时了

OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗.. 注:那为什么基本类型不能存入到集合中呢? 原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有

C++中虚基类

摘自<C++程序设计> 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员. C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员. 下面举例说明: 在如下的图中: Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类. 如果使用虚基类的话,Graduate将有两份age拷贝,两份gender拷贝,两份name

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6