1、基本写法
javascript
//dart
List<int> list1 = [];
// 带初始值的数组
List<int> numbers = [1, 2, 3, 4, 5];
var fruits = ['苹果', '香蕉', '橙子']; // 推断为 List<String>
// Swift
var numbers: [Int] = [1, 2, 3]
let arr1:Array<String> = ["3","4"]
// Kotlin
val numbers: Array<Int> = arrayOf(1, 2, 3) // 显式类型
val emptyArray: Array<String> = emptyArray()
// List(不可变默认)
val list = listOf(1, 2, 3) // 不可变列表
val mutableList = mutableListOf(1, 2, 3) // 可变列表
// TypeScript
const numbers: number[] = [1, 2, 3]; // 显式类型
//Python
numbers = [1, 2, 3] # 字面量
names = list(("John", "Jane")) # 构造函数
2、引用类型和值类型
上面几门语言中swift的数组是值类型,但是其他的是引用类型,值类型的数组具有以下特点:
(1)值类型写时赋值
javascript
// 数组是值类型 - 验证
var array1 = [1, 2, 3]
var array2 = array1 // 这里可能创建副本(写时复制)
array1.append(4) // 修改 array1 不会影响 array2
如果是引用类型那么array1和array2指向的是同一份内存地址,但是swift的值类型特性就不是这样
(2)值类型修改时地址变化
javascript
var variableArray = [1, 2, 3]
print("初始地址:", Unmanaged.passUnretained(variableArray as AnyObject).toOpaque())
variableArray.append(4) // [1, 2, 3, 4]
print("append后地址:", Unmanaged.passUnretained(variableArray as AnyObject).toOpaque())
variableArray[0] = 10 // [10, 2, 3, 4]
print("修改元素后地址:", Unmanaged.passUnretained(variableArray as AnyObject).toOpaque())
variableArray = [5, 6, 7] // 重新赋值
print("重新赋值后地址:", Unmanaged.passUnretained(variableArray as AnyObject).toOpaque())
初始地址: 0x0000600003e6c0a0
append后地址: 0x0000600003e6c1c0
修改元素后地址: 0x0000600003e6c1c0 // 可能与append后相同
重新赋值后地址: 0x0000600003e6c2e0
只要数组有变动就可能重新分配内存
3、可变与不可变
js/ts/python完全可变,但是swift和kotlin有不可变的数组,具体为:
swift:用let 和var来控制不可变与可变,用var申明就完全可变,用let申明就完全不可变,体现为,不可修改不可重新赋值
kotlin:用val和var来修饰的也能控制可变不可变,但是与swift完全不一样,val修饰的不可变不是真正意义的不可变,而是说不可以重新赋值,到可以修改内容,真正的不可变与可变通过不同的申明方式来实现,Array可变,List默认不可变
javascript
val numbers: Array<Int> = arrayOf(1, 2, 3) // 可变
val emptyArray: Array<String> = emptyArray()//可变
// List(不可变默认)
val list = listOf(1, 2, 3) // 不可变列表
val mutableList = mutableListOf(1, 2, 3) // 可变列表