为什么Java数组固定长度?

时间:2016-03-07 14:41:50

标签: java arrays fixed

int[] array = new int[10]; // Length is fixed when the array is created.
  

创建数组时建立数组的长度。创建后,它的长度是固定的。

为什么必须如此?

2 个答案:

答案 0 :(得分:6)

正如其他答案所指出的那样,固定大小是定义的一部分,你必须与原作者交谈才能找到真相。

但是作为一般性观点,实现可变长度容器要复杂得多,并且有许多策略可以实现它(链表,内存重新分配...)。 p>

如果作者在20世纪90年代早期将数组定义为可变长度,那么会产生一些不必要的后果:

  • 数组的核心JVM定义会复杂得多,并且所有实现都会被迫在较低级别提供这种复杂性;
  • 在给定的JVM中会有一个“一刀切”的大小调整实现,这可能无法满足许多用例;
  • 不同的实现可能会引入大的性能差异,这可能需要额外的复杂约束定义;
  • 它引入了边界检查数组的线程安全问题,因为a.length变得可变;
  • 表达扩展的其他语言支持=>更大的语言;
  • 对数组下标的性能影响,可能缺少O(1)索引;
  • C和C ++程序员不熟悉的领域,他们习惯于不可扩展的数组(或者在库中提供这样的机制);
  • 铸造一个可变长度的机制,已经由更高级别的结构(java.util.Vector在当天回复,现在是Java Collections,Guava等)。

总而言之,人们普遍认为Java诞生的C语言系列中的数组是构建更高级别结构的简单工具 - 那时候,固定大小限制没有出乎意料。我们现在可以选择这种结构的实现(LinkedListArrayList等),它们提供了一系列运行时行为,大多数开发人员都使用这些抽象。

答案 1 :(得分:1)

这是Java TcpClient remoteClient = new TcpClient(request.GetRemoteHost(), 80); byte[] remoteRequest = Encoding.UTF8.GetBytes(requestStr); NetworkStream remoteStream = remoteClient.GetStream(); remoteStream.Write(remoteRequest, 0, remoteRequest.Length); remoteStream.Flush(); int j; string remoteStr = ""; byte[] remoteBuffer = new byte[App.BufferSize]; recvRequest = true; while (recvRequest && (j = remoteStream.Read(remoteBuffer, 0, remoteBuffer.Length)) != 0) { string receivedData = Encoding.ASCII.GetString(remoteBuffer, 0, j); if (receivedData.IndexOf(Eol) < 0) { remoteStr += receivedData; } else { remoteStr += receivedData.Substring(0, receivedData.IndexOf(Eol + Eol)); recvRequest = false; } } MessageBox.Show(remoteStr); 的定义:

  

数组是一个容器对象,它包含固定数量的单一类型的值

(见here)。

使用array进行可变大小的数组实现。