不同语言数组详解

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)    // 可变列表

4、都支持 map、filter、reduce 等函数式操作

相关推荐
s***4531 小时前
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置
windows·分布式·rabbitmq
q***75182 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
CS_浮鱼2 小时前
【Linux】线程
linux·c++·算法
q***13344 小时前
Linux(CentOS)安装 Nginx
linux·nginx·centos
摘星编程4 小时前
openGauss 快速上手:CentOS 环境下单机部署完整指南
linux·运维·centos
哈里谢顿9 小时前
使用kvm创建一台虚拟机
linux
hanyi_qwe10 小时前
文本三剑客--awk
linux·运维·服务器
liu****11 小时前
27.epoll(三)
服务器·开发语言·网络·tcp/ip·udp
Caven7711 小时前
【Linux 技巧】如何在登录时自动激活 Conda Base 环境
linux·运维·conda