【问题标题】:How to have variables with dynamic data types in Java?如何在 Java 中拥有具有动态数据类型的变量?
【发布时间】:2010-05-21 12:41:48
【问题描述】:

我需要一个UserProfile 类,它就是这样,一个用户配置文件。这个用户配置文件当然有一些重要的用户数据,但它还需要有用户朋友发送的消息列表。

我需要将这些消息保存在LinkedListArrayListHashMapTreeMap 中。但一次只有一个,并且不会为每个数据结构复制消息。基本上,类似于动态变量类型,我可以在其中选择消息的数据类型。

这在 Java 中是否可行?或者我最好的方法是like this?我的意思是,有 2 个不同的类(用于用户配置文件),一个将消息托管为 Map<K,V>(然后我在适当的情况下使用 HashMapTreeMap)和另一个类,我将它们托管为 List<E> (然后我在适当的地方使用LinkedListArrayList)。并且可能为UserProfile 使用一个超类,这样我就不必为数据、年龄、地址等字段重复变量和方法......

有什么想法吗?

【问题讨论】:

  • 是否有理由需要将它们存储在不同的数据结构中?
  • 是的,请阅读下面我对 Péter Török 的回答的评论。

标签: java inheritance dynamic-variables


【解决方案1】:

首先,您不会通过同时将消息添加到不同的集合来复制消息 - 您只是将不同的引用存储到同一个对象。 (好吧,除非消息被表示为像long 这样的原始类型......但无论如何这些都不能添加到集合中。)

为什么不能在同一个 UserProfile 中拥有所有这些集合?这将允许您通过键或索引访问消息,并以您喜欢的任何方式遍历它们。

LinkedHashMap 对您来说也可能是一个有趣的选项,因为它保证了迭代顺序,因此在某种程度上它在迭代方面的行为类似于 List,同时仍然是 Map。归根结底,它归结为您希望如何访问给定用户的消息,您没有详细说明。

更新: @Snake,您只能在 Java 集合中存储对对象的引用。因此不能直接存储原始的long 值,只能先转换为Long 对象。请注意,从 Java5 开始,由于自动装箱,这种转换可能是隐式的,因此您在代码中看不到它,但它仍然会发生 - 例如

List<Long> list = new ArrayList<Long>();
list.add(1L); // the primitive value is boxed into a Long object,
              // which is then added to the list
long value = list.get(0); // the value of the Long object in the list is outboxed
                          // and assigned to the primitive variable

【讨论】:

  • 为什么不能创建一个长列表?
  • 我不能做你说的任何事情,因为这不是我的选择,这是这个大学项目对我的要求。我需要这些(以及我提到的那些)不同的数据结构,因为我的想法是衡量它们中每一个的性能。我可以轻松地为每个类创建一个不同的类,但我想尽可能避免这种情况。
  • 我所说的“复制”的意思是让用户配置文件类具有 4 个私有变量(每个数据结构一个)我只想拥有一个(或最多 2 个,对于 MapList) 并从那里开始工作。
  • @Nazgulled,嗯...您需要测量的性能究竟是什么?不同的集合实现?那么为什么你需要整个用户配置文件(而不是仅仅将 100 万个项目放入不同的集合中并测量执行时间)?恐怕我还没有得到全貌......
  • 你不需要知道全貌和你对我没有答案的问题的质疑。我正在做我被要求做的事情......这个想法不是测量集合本身,而是测量具有用户配置文件的集合。这就是我必须做的。
【解决方案2】:

如果这是一个大学项目,那么我怀疑你要做的是:

Collection mycoll;
mycoll = new ArrayList();
for (Message m:message) {
  // do stuff and measure the performance
}
// do other stuff and measure the performance
mycoll = new LinkedList();
// do the same stuff as a above and measure the performance again
mycoll = new HashMap();
//... and so on

如上所述,将对象添加到集合中不会复制它。

【讨论】:

  • 我需要有一个用于用户配置文件的类,并且消息需要在该类中。我所说的“复制”的意思是让用户配置文件类具有 4 个私有变量(每个数据结构一个)我只想拥有一个(或最多 2 个,用于 Map 和 List)并从那里工作。
【解决方案3】:

我最终使用了我在第一篇文章中描述的内容:

这在 Java 中是否可行?或者 我最好的方法是 这个?我的意思是,有 2 个不同的课程 (对于用户个人资料),我 将消息托管为 Map (和 然后我在哪里使用 HashMap 和 TreeMap 适当地)和另一个类 我将它们作为列表托管(然后我使用 LinkedList 和 ArrayList 在哪里 适当)。并且可能使用 UserProfile 的超类,所以我 不必重复变量和 数据,年龄等字段的方法, 地址等...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2017-05-08
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2014-03-15
    • 2021-08-07
    • 2013-09-15
    相关资源
    最近更新 更多