不同语言数组详解

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 等函数式操作

相关推荐
笑锝没心没肺5 小时前
fail2ban工具安装配置及使用
linux·运维·服务器
zt1985q6 小时前
本地部署开源智能家居集成平台 ioBroker 并实现外部访问( Windows 版本)
运维·服务器·智能家居
大卡片7 小时前
linux内核驱动开发
linux·运维·驱动开发
心心喵8 小时前
[linux] nohup和pm2的区别 进程保活
linux·运维·服务器
醉熏的石头9 小时前
Ubuntu 中的编程语言(中)
linux·ubuntu·scala
dddwjzx12 小时前
嵌入式Linux C应用编程入门——信号
linux·嵌入式
范什么特西13 小时前
网络代理问题
java·linux·服务器
utf8mb4安全女神13 小时前
【Redis数据库】哨兵集群/redis集群/安装配置/主从复制/数据持久化操作/数据结构/安全限制/PHP redis/
linux·服务器·数据结构·数据库·redis·缓存
Zk.Sun14 小时前
Linux设置触屏双击距离容差
linux·运维·数据库
Let's Chat Coding14 小时前
对称密钥认证:主机和设备共享同一把密钥
运维·服务器·网络