Array
DS要求其所有成员拥有相同的时间。当尝试将错误类型的对象存储到对象数组中时,Java会抛出ArrayStoreException。不记得C++
做了什么。
我的理解是否正确,在数组中拥有相同类型的所有对象非常重要,因为它通过以下两个操作保证了时间元素的持续访问:
1) element size * element index = offset
2) array pointer address + offset
如果对象的类型不同,因此大小不同,则上述公式将不起作用。
答案 0 :(得分:5)
因为:我们想要这样。
我的意思是:使用Java语言的人(可能与C ++相同)正在使用静态类型语言。
当这些人开始以复数形式思考时;他们通常以复数形式来思考类似的"的东西。
警告:在Java中,一切都是一个对象,所以你总是可以声明一个Object []并将任何东西都填入其中。字符串,数字等等。
这也导致另一个重要方面:在C ++中,您的数组代表内存中的一个区域。而且你最好在那个区域拥有相同大小的元素;避免数据损坏。
另一方面,在Java中,数组不指向原始内存。
长话短说:在这种情况下,Java和C ++之间存在真正的差异(必须了解才能做出明智的决定);然后就是"语言"事物本身。换句话说:这不是红宝石的土地,你只需将鸭子,数字,植物和嘎嘎声放在同一个" list"没有进一步思考。
最后的想法,基于最后一段中的笑话:在我看来,数组是列表概念的实现,因此它是关于同一性质的事物的集合。如果你想要一组不相关的东西,我宁愿称之为元组。
答案 1 :(得分:4)
是的,你是对的。恒定时间随机访问所需的一切。
此外,如果要在单个数组中存储不同的数据类型,则可以拥有一个void指针数组。例如在c ++中,做
void * a[N]
a[i] = (void *)(&YourClass)
同样,在java中使用Object[]
。
答案 2 :(得分:2)
C ++语言(和编译器)需要将元素的类型存储在数组中,原因有多种,例如指针算术和数组预订(例如x[i]
),元素的默认初始化,处理对齐限制,...)。
int x[3] = { 1,2,3 }; // array of 3 int values, each being properly aligned concerning processor architecture;
myObjectType objs[10]; // array of 10 objects of type myObjectType, each being default initialised (probably the default constructor), each being properly aligned
myObjectType *objs[10]; // array of 10 pointers to objects of type myObjectType (including subclasses of myObjectType; allowing dynamic binding and polymorphism). Note: all pointers have the same size, the object to which they point may differ insize.
int *intptr = x;
bool isEqual= (intptr[2] == x[2]); // gives true
intptr += 2; // increases the pointer by "2*sizeof(int)" bytes.
所以,是的,你是对的:一个原因是因为计算偏移量;但是还有其他原因,其他问题如对齐,数组到指针衰减,默认初始化逻辑也可能更微妙但也很重要。