Go/C++/Java中的数组对比
阅读原文时间:2023年08月14日阅读:2

数组是大多数编程语言中的基本数据结构。然而,不同的编程语言对数组的实现和语义有所不同。以下是 Go、C++ 和 Java 中数组的主要区别:

1. 基本性质

  • Go:

    • 数组是值类型。赋值或将数组传递给函数时,内容会被复制。
    • 数组的大小是其类型的一部分。因此,具有不同大小的数组被认为是不同的类型。
  • C++:

    • 原生数组基本上是指向其首个元素的指针。赋值不会复制内容。
    • 数组大小在编译时必须已知,但 C++11 之后有了 std::array,它是一个固定大小的容器。
    • 动态大小的数组可以使用 std::vector 实现。
  • Java:

    • 数组是引用类型。赋值或传递数组时,只复制引用,不复制内容。
    • 数组可以在运行时动态创建,并且大小可以在运行时确定。

2. 初始化

  • Go:

    arr := [3]int{1, 2, 3}
  • C++:

    int arr[3] = {1, 2, 3};
  • Java:

    int[] arr = new int[]{1, 2, 3};

3. 大小和长度

  • Go:

    • 使用 len() 函数获取数组长度。
  • C++:

    • 对于原生数组,可以使用 sizeof(arr) / sizeof(arr[0]) 获取长度。
    • 对于 std::vector,使用 vector.size()
    • 对于 std::array,使用 array.size()
  • Java:

    • 使用 arr.length 属性获取数组长度。

4. 动态和多维数组

  • Go:

    • Go 的切片(slices)提供了动态数组的功能。
    • 多维数组可以通过数组的数组实现,如 [3][3]int
  • C++:

    • 使用 std::vector 作为动态数组。
    • 多维数组可以是 int arr[3][3]std::vector<std::vector<int>>
  • Java:

    • 所有的 Java 数组都是动态分配的。
    • 多维数组,如 int[][] arr = new int[3][3];

5. 其他特点

  • Go:

    • 支持数组字面量。
    • 切片(slices)为数组提供了动态和灵活的功能。
  • C++:

    • 数组与指针之间有紧密的关系。
    • 有丰富的容器库支持,例如 std::vectorstd::arraystd::list 等。
  • Java:

    • 数组是对象,有与对象相关的所有特性(如方法和属性)。

总之,虽然 Go、C++ 和 Java 都支持数组,但它们的实现和语义都有所不同,这可能会影响开发者如何使用数组以及预期的效果。