在Java中,我想将数组转换为列表。鉴于Java是一种OOP语言,我期望做类似的事情:
int[] myArray = { 1, 2, 3 }; // non-working code
List myList = myArray.toList();
但是当我发现array
对象没有toList方法并且正确地执行我想要的方式时,我感到很惊讶:
int[] myArray = { 1, 2, 3 }; // working Java code
List myList = Arrays.asList(myArray);
起初我想知道int[]
是否不被视为对象,但我能够在其上调用clone()
等方法,所以我确信它是一个对象。
为什么Java的设计者使用第二种方法(静态方法与OOP不一致)与第一种方法(对象符合OOP原则的对象)?
我注意到C ++也做了类似于第二种方法的东西,我认为它是从C遗留下来的行李。但是在C#中,有一种ToList()
方法。
Arrays.asList()
是否只是支持OOP的进化游行,还是有一些基本理论可以这样做?
答案 0 :(得分:3)
int []是一个对象。
但是,没有任何关于OOP的内容要求对象提供接受它作为参数的所有工厂方法。
答案 1 :(得分:3)
数组没有你可能期望它们拥有的各种方法,它所拥有的方法都是从Object继承而且通常是无用的。
int[] array = { 1, 2, 3 };
int[] array2 = { 1, 2, 3 };
System.out.println(array.equals(array2)); // prints false
System.out.println(array.hashCode() == array2.hashCode()); // prints false
System.out.println(array.toString()); // prints something like [I@a2634feg
我试图让Sun / Oracle解决这个问题但我回来的谣言是,正确修复它会非常复杂。
答案 2 :(得分:1)
从第一个版本(JDK1.0)开始,Java中存在数组(int[]
,Foo[]
)。对数据结构的支持很少 - 你必须自己完成所有这些。 V1.2(http://docs.oracle.com/javase/6/ocs/api/java/util/List.html)中引入了List
和ArrayList
以及Arrays
。当发生这种情况时,可能无法改变语言,或者当时它太复杂了。
我是Java早期(通过Sun联系人)的密切观察者。我记得Java 1.0是相当基础的,并且图形(AWT 1.02)是在最后一刻编写的。在我的回忆中,Java被设计为OO,但最初的范围有限(它被宣传为一种新的动画语言,但Java AWT 1.02非常有限)。那个时期的人工制品仍然存在于规范中。
当时Java的巨大贡献是WriteOnceRunAnywhere(WORA)(最初是WriteOnceDebugEverywhere!),我怀疑这是早期开发人员和维护人员的首要考虑因素。 Java由C ++通知并带有一些结构(例如int,double作为原语 - autoboxing后来作为kludge)。 C#能够从Java(而不是C ++)开始,并且在某些方面是对Java应该如何的修订。所有语言都从一些行李开始,每个新的语言都摆脱了一些。
答案 3 :(得分:1)
转换方法不是您期望的转换方法。而且没有真正的技术原因。如果你看一下Scala(它使用相同的VM,并且字节码是兼容的):
object ArrayListDemo {
def main(args: Array[String]) {
val list = args.toList
val array = list.toArray
println("= List =")
println(list)
println(list.mkString(", "))
println(list.size)
println(list.length)
println("= Array =")
println(array)
println(array.mkString(", "))
println(array.size)
println(array.length)
}
}
这会给你这个结果(如果用两个参数Hello
和world
调用):
= List =
清单(你好,世界)
你好,世界
2
2
=数组=
[Ljava.lang.String; @ 15663a2
你好,世界
2
2
你可以看到它真的是一个“JVM阵列”,还有其他方法。 所有集合类型(丰富和原始)都有转换方法。
所以,是的,它不像OOP - 感觉“势在必行”。