当前位置: 首页 > 面试题库 >

为什么数组不可扩展?

沙柏
2023-03-14
问题内容

创建数组时,无法更改其大小;它是固定的。好的,看起来不错,我们可以创建一个新的更大的数组并逐个复制值,这有点慢。它的技术背景是什么?


问题答案:

这个问题没有提到语言,因此我将选择基于“ C”的数组作为答案。

数组被分配为单个内存块。增长数组是有问题的,因为正确执行此操作的唯一方法是在最后增长它。为了增加大小N,在数组的末尾必须在下一个分配的地址之前至少有N个空闲字节。

要支持这种类型的分配,必须在虚拟地址空间中分配分配。这既消除了使内存分配彼此更接近的好处,又增加了碎片的产生。面对大多数试图将内存打包在一起并减少碎片的内存管理器,这是不对的。

在内存中有足够空间的地方分配一个新数组并复制该数组,这根本不是一般解决方案。原因是该数组的先前位置对用户而言可以通过指针看到。

int* array = malloc(int*someSize);
int* pointer1 = &(arr[2]);
growArray(&array, 12);  // Can't move because pointer1 knows the address of the array


 类似资料:
  • 问题内容: 作为实验,我尝试扩展-array,如下所示: 在类本身中添加一些与排序,交换,子数组构建等有关的方法。但是我在编译时遇到了这个错误: 我很好奇:为什么Java不允许扩展数组? 问题答案: 扩展基本类型(例如a 或数组)会打开安全漏洞。如果Java允许您扩展数组,则采用数组的方法将变得不安全。这就是字符串为,而数组根本不能扩展的原因。 例如,您可以重写该方法,并返回不正确大小的数组。这有

  • 如果我编写了ToIntFunction接口,我希望在接口中编码这样一个事实,即它只是一个返回原始int的函数,如下所示: 我想知道,Java8 API设计者选择将原始的替代方案与函数完全分离,是不是有一个令人信服的原因?是否有证据显示他们曾考虑这样做,并决定不这样做?我想类似的问题至少也会出现在其他一些“特殊”功能接口上,比如Consumer(可能是function )和Supplier(func

  • 问题内容: 我已经看过几次了,但是在我看到的帖子中,没有人解释。为什么我不应该扩展JFrame(或任何组件)?是否存在我应该扩展组件的条件,或者这是您不应该采用的严格规则? 问题答案: 一般而言,扩展组件往往严格使用该组件。这在设计方面以不必要的方式严重地限制了你的选项,以使你的类无法扩展不同的类,你无法隐藏JFrame的方法,从而导致在使用类时,JFrame的维护更加困难并且更容易触发意外的错误

  • 问题内容: 事实并非如此,这让我感到惊讶。 我认为,如果这样声明,那将是很有意义的: 毕竟,是的集合,不是吗? 那么,为什么没有这样一个很好的实现呢? 感谢Cletus提供的最权威的答案,但是我仍然想知道为什么,如果你已经可以查看(通过),那么它不仅扩展了该接口。 如果a 是a ,则元素是什么?唯一合理的答案是“键值对” 确实会很棒! 但这提供了非常有限的(且不是特别有用的)Map抽象。 但是,如

  • 问题内容: 有人可以给我一个为什么它不起作用的充分理由: 这将是我建议的(如果不太出色)的解决方案。但这是微不足道的,所以我觉得我很想知道为什么未实现这一点的充分理由。 问题答案: 更新: 条件一致性已在 Swift 4.1中 实现 。 数组和元素的可选元素本身就是 现在,您的代码 可以按照Xcode 9.3的要求进行编译和工作。不再需要解决方法。 (旧答案:) 仅当基础包装类型为等值类型时,才可

  • 问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚