Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';Java ArrayList是否可以通过唯一键访问?_Java_Arrays_Arraylist - Fatal编程技术网

为什么可以';Java ArrayList是否可以通过唯一键访问?

为什么可以';Java ArrayList是否可以通过唯一键访问?,java,arrays,arraylist,Java,Arrays,Arraylist,我在通过考试时遇到了以下问题(№8) : 我回答了一个问题,这是真的。但是为什么D不是真的呢?我打开ArrayList的源代码,找到以下代码块: /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with ele

我在通过考试时遇到了以下问题(№8) :

我回答了一个问题,这是真的。但是为什么D不是真的呢?我打开ArrayList的源代码,找到以下代码块:

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer. Any
 * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
 * DEFAULT_CAPACITY when the first element is added.
 */
private transient Object[] elementData;
因为,我们可以使用唯一键(元素索引)访问ArrayList的任何元素。为什么这样的推理是错误的

使用唯一键访问集合中的元素


这将描述一个
映射
,而不是
列表
。我会问自己同样的问题,实际上数组索引可以被认为是一个“键”。但是,由于这样的键是隐式唯一的,最后一条语句似乎更能描述映射结构。

ArrayList的元素可以通过它们在列表中的索引而不是键来访问

你问为什么元素不能被“唯一键”访问。。。答案是语言定义不允许这样做。(您可能将索引误认为键。)


精化:索引不是键。索引指定结构中的位置,键需要在结构中搜索该键的值。你会感到困惑,因为每个索引都是独一无二的。。。但是它们不是键

唯一键
只是表示表示java.util.ArrayList元素的
索引
,没有两个不同的元素具有相同的
索引
。对

你的确是对的:可以使用唯一键访问列表;限制是您不能随意选择密钥

事实上,映射也称为“关联数组”,强调了
列表
映射
之间的等价性


至于为什么你的考试不接受这一点,是因为在写考题时不够小心。根据个人经验,我可以证明,要想正确地进行考试,需要非常小心。

当您使用一个键/值时,您可以通过查找同一个键来访问该值,而不管地图中的其他条目如何更改


索引不是键,因为它可以在每次添加或删除条目时更改。如果您一直从列表开始删除,您可以使用
get(0)
访问列表中的每个元素,这显然不是该值所独有的。

我想。您认为
索引
的概念有很大不同吗?键通常与映射或表或任何对的集合相关联。列表实际上不是关联数组,因此它们应该是不同的概念。但是,没有什么可以阻止您将索引视为“键”。这取决于问题的上下文。
地图
列表
在概念上有什么区别?两个整型键都映射到任意值。@MarkoTopolnik在概念上没有区别,但您已经有了两个不同的类。映射中有一个显式键,而列表中的索引是“隐式”键。概念上的区别在于如何访问值:索引允许您从某个位置访问值;键要求您搜索结构以检索值。否。。索引不是一个键。索引指定结构中的位置,键需要在结构中搜索该键的值。你会感到困惑,因为每个索引都是独一无二的。。。但它们不是关键,你把实现和抽象混为一谈。索引是数组中的键。“键”不是一个与映射实现相关的技术术语,它是一个概念,意味着在一组键和一组值之间存在映射。
int
s的集合确实符合这个定义。索引是对结构中某个位置的引用。需要在结构中“搜索”一个键。虽然ArrayList中的每个索引都是“唯一的”,但它并不满足键的“键的搜索结构”的正常含义。仅仅因为“索引是对结构中某个位置的引用”,并不以任何方式阻止它也成为键。你所提倡的“关键”的定义太具体,肯定不是“正常的”。可以实现map,使得不执行搜索以到达密钥;例如,
Map
可以使用纯数组实现,在与键对应的索引处存储值。实际上,当索引在某处时,将键称为必须匹配的内容(通过搜索)是正常的。您可以重复任意次数,但这不会使它成为真。事实上,无需搜索的直接访问是完美地图实现的圣杯。短语“稀疏数组索引3处的元素”对您有意义吗?根据您的定义,这是没有意义的,因为稀疏数组通常无法实现为索引对应于结构中的位置;索引是结构中的位置引用,从中获取值。简单地说是唯一的并不意味着使用了唯一的键。@erstwhileii,是真的,但是
唯一键
不适合
元素
或'value'。可能只是文字上的误解:染料。。。这是关于语言的!“键”用于搜索,“索引”用于位置。幸运的是,语言的特殊性是编程的一个要求。你的术语总是让我觉得有道理(我相信它没有错),但相信我,我真的理解你的观点,我们有不同的术语,但我们指的是同一件事:D,这就是为什么我尊重你,我在下面的答案中给你加上1.唯一性从未应用于时间维度。在列表的任意状态下,都有从索引到值的唯一映射。删除元素时,映射会更改,但“唯一性”属性保持不变。保持键值映射的稳定性
/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer. Any
 * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to
 * DEFAULT_CAPACITY when the first element is added.
 */
private transient Object[] elementData;