Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android里面为什么要设计出Bundle而不是直接用Map结构 #142

Closed
DancingWing opened this issue Apr 24, 2015 · 6 comments
Closed

Comments

@DancingWing
Copy link

如题,麻烦各位不吝赐教

@R1NC
Copy link

R1NC commented Apr 24, 2015

Bundle 父类 BaseBundle 内部确实有个 ArrayMap<String, Object> 类型的 mMap 成员。
我觉得之所以封装为 Bundle 应该和 Android 特有的 Parcelable 序列化方式有关(比 JDK 自带的 Serializable 效率高)。通过源码可以看到内部各种 put 和 get 方法都调用了这个 unparcel 方法。

@DancingWing
Copy link
Author

多谢~

@haiyang1994
Copy link

补充下上面的回答:
Map里实现了Serializable接口,而在Bundle实现了Parcelable的接口

@ZhaoKaiQiang
Copy link

  • Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,只适合于小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而HashMap内部则是数组+链表结构,所以在数据量较少的时候,HashMap的Entry Array比ArrayMap占用更多的内存。因为使用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种情况下使用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因此使用Bundle来传递数据,可以保证更快的速度和更少的内存占用。
  • 另外一个原因,则是在Android中如果使用Intent来携带数据的话,需要数据是基本类型或者是可序列化类型,HashMap使用Serializable进行序列化,而Bundle则是使用Parcelable进行序列化。而在Android平台中,更推荐使用Parcelable实现序列化,虽然写法复杂,但是开销更小,所以为了更加快速的进行数据的序列化和反序列化,系统封装了Bundle类,方便我们进行数据的传输。

#参考资料

更多可关注:https://github.com/ZhaoKaiQiang/AndroidDifficultAnalysis

@XYliang
Copy link

XYliang commented Mar 6, 2019

推荐阅读:http://tryenough.com/android-intent-bundle

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants