向上转换为ArrayList对象然后向下转换为自定义ArrayList的成本

时间:2012-12-19 14:19:24

标签: java object arraylist downcast upcasting

我遇到的情况是我从数据库中获取数据,我想将其上传到ArrayList of objects,然后将其向下转换为不同的自定义ArrayList,即List<User>List<Groups>等。

我的问题是向上转换为对象,然后向下转换为ArrayList,成本是多少,是高效还是良好的做法。

EDITED

我没有将数据作为List<User>, List<Groups>等获取,而是希望将数据设为ArrayList<objetcs>一次,然后根据我的需要,我会将数据转发到ArrayList<User>, ArrayList<Groups>

5 个答案:

答案 0 :(得分:5)

“向下投射”并不是一个好主意,因为您不需要使用任何特定于ArrayList的方法。你应该可以使用List来做每件事。 ArrayList提供的唯一不在List中的公共方法是ensureCapacity(它看起来没那么有用)和trimToSize很少有用。

就成本而言,这取决于你是否有可能失败。如果您没有抛出异常,典型的类型检查可能需要约40纳秒。 JIT应该优化Upcast。

答案 1 :(得分:3)

如果数据库实际上没有返回ArrayList,则转换不会为您转换 - 而是在运行时会看到ClassCastException。您应该实例化一个您想要使用的类型的新集合,并对从数据库返回的集合调用其addAll(Collection c)方法。

答案 2 :(得分:2)

如果您从ArrayList<Object>开始,将此广告投放到ArrayList 不是向上广播:它只是将参数化类型转换为其原始对应项。此外,将ArrayList投射到ArrayList<String> 不是向下倾斜,或者:未经检查的投射为参数化类型。两者都只是编译器工件并且没有运行时等效

答案 3 :(得分:2)

如果您getting/saving的{​​{1}}个表与database不同,那么每个table的每个table都会为每个table创建一个完整映射{{1}}的类。然后在(插入,更新,删除,选择)的功能中传递具有相应表类对象的数据。并按原样使用。为此,您必须创建不同的功能以获取或保存数据到表。但它是执行此任务的最有效方式。有关向上/向下转发的更多信息,请参阅链接here

答案 4 :(得分:0)

在性能方面的“成本”几乎为零(唯一的成本是在向下转发的运行时检查中)。

Casting不会更改列表本身,只会更改引用的类型。

以什么形式(数据类型)获取“数据库中的数据”?如果您希望能够从例如一个JDBC ResultSet到List,它不能用于强制转换 - 你实际上需要遍历ResultSet来获取数据。