解惑

解己之惑,解人之惑

标签:List

反射创建一个指定类型的List

由于最近在做C#版的测试框架,所以对C#的反射研究得比较多一点,这里是另外一个心得,由于运行时才知道类型,所以如何创建一个指定类型的List?其实很简单:

Type elementType = realType;
Type listType = typeof(List<>);
Type typedListType = listType.MakeGenericType(elementType);

List的问题

今天遇到一个奇怪的问题,从一个List取一个SubList,然后对从SubList删除某些元素,然后再从List里面删除SubList里面剩余的元素,但是所有的删除都没有找到匹配的东西,并没有删除成功,但是原来的List出问题了,它的内容出现不规则的变化,有时候变成0,但是有时候不重新取数据的话还能恢复成原来的状态。
呵呵,怀疑这个是JDK的bug,但是没有时间验证了,做个记号。
现在的解决方法是拿到subList后再创建一个新的List,把SubList的内容加进去,这样就没有问题了。
从JDK的API看,从List得到SubList只是得到了原来的List的一个view,所以进行这些操作的时候原来的List和View之间在进行处理的时候可能有问题。

使用分类提高速度

这个是我做这个单元测试框架最大的感受,原来的代码存在两个使用大List的地方,一个是MockEJB自己带的AspectSystemImpl,它把所有的Aspect放在一个List然后查找匹配的,后来我修改了实现,按照不同的Bean放到不同List再用一个Map分类,一举提高20倍速度,然后我又修改了原来Command队列的实现,使用同样的原理,也提高了30%的性能。
所以如果你的代码中也使用到了List之类的集合,添加到里面的东西比较多,要进行比较或者某种查找,那么进行简单的分类可能是提高性能的关键。分类功能简单的使用一个HashMap就可以了。

© 2024 解惑

本主题由Anders Noren提供向上 ↑