2019独角兽企业重金招聘Python工程师标准>>>
之前写程序,如果是队列数据的话,一般都是用ArrayList来作为存储介质,但是现在接手公司的新项目,因为之前这个公司是在windows mobile上实现的(也就是C写的),他们可能更习惯使用Vector,之前也没有了解过Vector,后来查询java的api文档,java确实也有Vector的实现。
先看下java中对Vector的描述:(对Vector熟悉的下面这段可不看)
Vector
类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
从 Java 2 平台 v1.2 开始,此类改进为可以实现 List
接口,使它成为 Java Collections Framework 的成员。与新 collection 实现不同,Vector
是同步的。
android指南:intent、 之前看think in java 中也有提到,Vector与List相比,主要的区别就在于,Vector是同步的,List是非同步的,Vector在迭代的时候是不能对队里的数据进行增删操作的,否则会抛出ConcurrentModificationException异常,同理,在单一线程条件下,Vector的效率较之ArrayList等会更低,因此在Android平台下可能也不太会使用到该类。
下面就是重点了,先看下Vector的类图:
可以看到Vector是实现了Serializable接口的,所以很显然,Intent是可以传递这样的数据的,但是在实践中还是发现问题了,当我在Activity A中将Vector数据put进入intent的bundle中时,在Activity B中去取出数据(getSerializable)时,将其强转为Vector,程序会报错,cant Cast ArrayList to Vector(不能将Arraylist转换为Vector类型),见鬼了,后来去搜了下,stackflow上也有哥们问到这样的问题,有人猜测是所有Collection数据在进入Intent后,都被Android强转为Arraylist了,这里我还没有查询Android源码,但根据表现出来的问题也基本是这样的,哪位大神可以看下源码。
所以,结论就是,尽量不要在Android中使用Vector,如果确实因为线程同步的问题必须使用,那当你看到那个类转换异常时也不要惊讶,老老实实把它先用Arraylist盛放起来,再转回到Vector,或者程序的参数或者返回值接口不要写死为Vector,使用List这种泛型,这样也比较有利于程序的扩展。
算是今天的一点心得,记下来先...