关联对象

关联对象,第1张

associatedObject又称关联对象。顾名思义,就是把一个对象关联到另外一个对象身上。使两者能够产生联系。

这样我们就可以通过associatedObject在运行时给cagetory添加getter和setter。因为category中添加的property不会生成带下划线"_"的成员变量以及getter和setter的实现。所以可以通过关联对象实现getter和setter。

objc_setAssociatedObject(id object, const void key, id value, objc_AssociationPolicy policy)

参数一:id object : 给哪个对象添加属性,这里要给自己添加属性,用self。

参数二:void == id key : key值,根据key获取关联对象的属性的值,在objc_getAssociatedObject中通过次key获得属性的值并返回。

参数三:id value : 关联的值,也就是set方法传入的值给属性去保存。

参数四:objc_AssociationPolicy policy: 策略,属性以什么形式保存。

objc_getAssociatedObject(id object, const void key);

参数一:id object : 获取哪个对象里面的关联的属性。

参数二:void == id key : 什么属性,与objc_setAssociatedObject中的key相对应,即通过key值取出value。

总结:

关联对象并不存储在被关联对象本身内存中,而是有一个全局统一的 AssociationsManager中

一个实例对象就对应一个ObjectAssociationMap,

而ObjectAssociationMap中存储着多个此实例对象的关联对象的key以及ObjcAssociation,

ObjcAssociation中存储着关联对象的value和policy策略

你可以直接造一个新的RecordID给get这个方法,前提是你必须实现RecordID的equals方法和hashcode方法,用来比较两个对象是否相等,默认的equals方法是比较的地址。所以是不相等,得到的肯定是null。如果你的RecordID对象用Integer或是String等已经从新实现了的equals方法的类型代替,就可以直接new了。

你如果想遍历所有的可以用iterator

也可以直接用foreace循环如下:如果哪里不清楚,请留言

LinkedHashMap <RecordID, Record>lhm=new LinkedHashMap<RecordID, Record>();

for(Record i:mvalues()){

Systemoutprintln(i);

}

你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用MapEntry类,你可以得到在同一时间得到所有的信息。 标准的Map访问方法如下: Set keys = mapkeySet( ); if(keys != null) { Iterator iterator = keysiterator( ); while(iteratorhasNext( )) { Object key = iteratornext( ); Object value = mapget(key); ;… ;} } 然后,这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。 幸运的是,这里有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个MapEntry实例化后的对象集。 接着,MapEntry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下: Set entries = mapentrySet( ); if(entries != null) { Iterator iterator = entriesiterator( ); while(iteratorhasNext( )) { MapEntry entry =iteratornext( ); Object key = entrygetKey( ); Object value = entrygetValue(); ;… } } 尽管增加了一行代码,我们却省略了许多对Map不必要的"get"调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。MapEntry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。 Hashtable内部排列的方式是散列排布,所以当输出信息时会是无序的。为了能保证输出的数据按照顺序排列,不要渴望用java自带的函数来对 Hashtable对象进行调整处理。当我们获取Hashtable里的KEY和VALUE时,一般都运行了MapEntry类来转换,好,现在就用这 个类来作文章,我具体写了一个方法。 代码: / 方法名称:getSortedHashtable 参数:Hashtable h 引入被处理的散列表 描述:将引入的hashtableentrySet进行排序,并返回 / public static MapEntry[] getSortedHashtable(Hashtable h){ Set set = hentrySet(); MapEntry[] entries = (MapEntry[])settoArray(new MapEntry[setsize()]); Arrayssort(entries,new Comparator(){ public int compare(Object arg0, Object arg1) { Object key1 = ((MapEntry)arg0)。getKey(); Object key2 = ((MapEntry)arg1)。getKey(); return ((Comparable)key1)。compareTo(key2); } }); return entries; } 调用这个方法: MapEntry[] set = getSortedHashtable(t); //perportyTable for (int i=0;i<setlength;i++){ Systemoutprintln(set[i]getKey()。toString()); Systemoutprintln(set[i]getValue()。toString()); }

以上就是关于关联对象全部的内容,包括:关联对象、Java HashMap get(Object key)的使用方法、如何获得Hashtable中所有key的值和value的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/9663264.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存