专业的JAVA编程教程与资源

网站首页 > java教程 正文

数组容易忽视的干货

temp10 2025-01-17 12:54:11 java教程 7 ℃ 0 评论


数组的理解其实很简单,就是数据的连续堆积。最早FORTRAN和ALGOL 68就有数组的概念。Python的列表就是数组。

数组容易忽视的干货


最简单的数据结构

  • 现实世界中最简单方便有效的数据结构。小数据量的绝佳选择, 兼顾效率和易用。
  • 操作系统、驱动和库常有使用。


数组存放栈或堆

  • C/C++允许定义数组于堆栈区,这种方式更加灵活,尤其对于内存性能要求较高的场所。
  • C#/Java/Kotlin 等语言的数组不可能位于堆栈区,只能是堆对象,某些时候不太灵活。
  • 大部分编程语言将数组作为引用类型,包括C/C++/Java/C#等,不过Go把数组当做值类型。


数组形态

  • 大部分使用中括号表示数组,中括号加下标表示数组长度或Index.
    C/ObjC/C++/Java/C#/Python 等都遵循此规则。
  • 除了普通的一维数组、二维和多维数组,C#还提供交错数组,每个维度可以是不同的长度。


数组定义的方括号位置

  • C/ObjC/C++ 方括号在标识符后面。
  • C# 方括号必须紧跟类型。
  • Java方括号可紧跟类型之后或者标识符后面。
  • Kotlin 比较特殊,初始化数组用内置函数 arrayOf, 并不需要显式方括号。


可变数组VLA

  • 尽管C99支持VLA, C11中废弃它,因为它实在不太好用。动态数组比它优秀多了。
  • C# stackalloc支持VLA.


数组索引

字符串本质是一个数组,一般二者的索引起始点是相同的。

  • 从0开始: 和现实世界对应,"当前"的元素距离是0. 大部分编程语言采用
    • 例如C/ObjC/C++/Java/C#/Python/JavaScript/Go/Rust/Swift/仓颉/Kotlin 等。
  • 从1开始
    • 例如Pascal/Fortran/VB.
  • C语言数组名和索引位置互换是同一个意思,a[1]等同于1[a].


反向索引

  • C# 8.0支持形如^1访问数组最后一个元素,^2代表倒数第二个,以此类推。
  • Python 支持-1代表列表最后一个元素,-2代表倒数第二个,以此类推。


索引区间

  • C# 8.0提供了数组切片功能,是一个左闭右开的区间,例如0..3代表前3个元素的切片。System.Index和System.Range分别代表索引和索引区间。


索引是负数

  • Python支持索引是负数,以列表为例,-1代表倒数第一个数。
  • C/ObjC/C++ 也支持数组索引为负数,但这是比数组基址更小的位置,一般都是错误的代码。


数组元素类型

  • 为了方便管理,数组元素一般都是相同类型。
  • Javascript数组元素可以是不同对象。


数组赋值

  • C语言把数组名当成常量,数组名不可以被赋值。
  • Java/C#/Kotlin 等语言的数组名只是一个引用,本质是指针,可以被赋值。


数组可扩展

  • C/ObjC/C++/C# 创建的数组都不可以动态扩展容量。
  • C# 2.0 Array.Resize()函数是创建了新数组(同时将旧数组内容拷贝到新数组)。
  • VB提供了Redim改变数组元素个数。


访问未初始化数组

  • C#/Java/Kotlin 等语言访问未初始化数组在编译期间就会报错。
  • C/ObjC/C++ 没有如此严格,编译器可能睁一只眼闭一只眼。
    • GCC和G++ 需要额外用 -Wuninitialized 参数才会显式提示警告。







若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表