我可以用什么来存储多种不同类型的数据,Int/String/等?我有 PHP 背景,我可以将不同类型的数据存储到数组中,但我不知道如何在 Java 中做到这一点。
举这个例子:
$array = array(
"val1" => 1,
"val2" => "cat",
"val3" => true
);
我怎样才能用Java制作类似的东西?
Java 是一种强类型语言。在 PHP 或 Javascript 中,变量没有严格的类型。然而,在 Java 中,每个对象和基元都有严格的类型。您可以在数组中存储多种类型的数据,但只能将其作为对象返回。
你可以有一个对象数组:
Object[] objects = new Object[3];
objects[0] = "foo";
objects[1] = 5;
请注意,5 被自动装箱到
new Integer(5)
中,这是围绕整数 5 的对象包装器。
但是,如果想从数组中获取数据,就只能以Object的形式获取。以下内容将不起作用:
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;
您可以使用对象数组,但这会在检索已存储的对象时产生问题。相反,我会使用“类型安全的异构容器”,如《Effective Java》中所述(并链接到本句前面的内容)。
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<Date>
、
List<String>
或 List<Integer>
,作为基类,以提供一种在一个集合中存储多种不同类型的对象的方法。然后要检索值,您只需获取子集合,例如a List<Date>
,知道其中包含的所有物品都属于同一类别。 您可以使用内置的
Object
类来创建支持字符串、整数等的数组
示例:Object[] x = {"Item 1", 2, null, true};
int[] array1 = new int[]{1, 2, 3, 4, 5};
String[] array2 = new String[]{"aa", "bb", "cc", "dd", "ee"};
var array3 = new Object[(array1.length + array2.length)];
for (int i = 0; i < array1.length; i++) {
array3[i] = array1[i];
}
for (int i = array1.length, j = 0; i < array1.length + array2.length; i++, j++) {
array3[i] = array2[j];
}
for(var i:array3)
System.out.println(i);