【问题标题】:Java Array with multiple data types具有多种数据类型的 Java 数组
【发布时间】:2014-05-30 14:58:10
【问题描述】:

我可以使用什么来存储多种不同类型的数据,Int/String/等?我来自 PHP 背景,我可以将不同类型的数据存储到数组中,但我不知道如何在 Java 中做到这一点。

举个例子:

$array = array(
    "val1" => 1,
    "val2" => "cat",
    "val3" => true
);

如何在 Java 中制作类似的东西?

【问题讨论】:

  • 看看HashMaps
  • 您不必使用 HashMap 定义您的值吗?
  • Object[] 是你的朋友和敌人
  • 这是怎么复制的?我不同意。这是一个与标记为重复的问题不同的问题。
  • 已关闭,因此我无法回答,但我会使用有效 Java 中所述的typesafe heterogenous container(并链接到本句前面的部分)。类型安全的异构容器通过允许您找出地图中每个位置存储的内容的类别,解决了稍后检索对象的问题。

标签: java


【解决方案1】:

Java 是一种强类型语言。在 PHP 或 Javascript 中,变量没有严格的类型。但是,在 Java 中,每个对象和基元都有严格的类型。您可以将多种类型的数据存储在 Array 中,但您只能将其作为 Object 取回。

你可以有一个对象数组:

Object[] objects = new Object[3];
objects[0] = "foo";
objects[1] = 5;

请注意,5 被自动装箱为 new Integer(5),它是整数 5 的对象包装器。

但是,如果你想从数组中获取数据,你只能将它作为一个对象来获取。以下将不起作用:

int i1 = objects[1]; // Won't work.
Integer i2 = objects[2]; // Also won't work.

你必须把它作为一个对象取回:

Object o = objects[0]; // Will work.

但是,现在您无法取回原始表单。你可以试试危险的演员阵容:

String s = (String) o;

但是你不知道o 是一个字符串。

您可以通过instanceof查看:

String s = null;

if (o instanceof String)
    s = (String) o;

【讨论】:

  • 谢谢,我试试看
  • 这肯定行得通,但你必须 instanceof 从数组中获得的每个项目,只要存储在数组中的对象类型的数量就需要一个条件。
【解决方案2】:

您可以使用对象数组,但是在检索您存储的对象时会产生问题。相反,我会使用 Effective Java 中所述的typesafe heterogenous container(并链接到本句前面的部分)。

public class DateStuff{

    private Map<Class<?>, Object> dateMap =
        new HashMap<Class<?>, Object>();

    public <T> void putDate(Class<T> type, T instance){
          if(type == null)
              throw new NullPointerException("Type null");
          dateMap.put(type, instance);
    } 

    public<T> getDate(Class<T> type){
          return type.cast(dateMap.get(type));
    }

}

类型安全的异构容器通过按对象的类映射对象来解决以后检索对象的问题。在你的情况下,我会将它与其他数据结构结合起来——例如List&lt;Date&gt;List&lt;String&gt;List&lt;Integer&gt;,作为基类,以提供一种在一个集合中存储多种不同类型对象的方法。然后要检索值,您只需获取子集合,例如List&lt;Date&gt;,知道其中包含的所有项目都属于同一类。

【讨论】:

    【解决方案3】:

    这篇文章是为了更简单

    您可以使用内置的Object 类来创建一个支持字符串、整数等的数组。

    例子:

    Object[] x = {"Item 1", 2, null, true};
    

    【讨论】:

    • 是的,但你以后如何从中获得价值?
    猜你喜欢
    • 2017-12-19
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2022-11-28
    • 2021-12-27
    相关资源
    最近更新 更多