java和swift数据传递的区别
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java除了基本数据类型是值传递,都是引用传递。不难发现,new出来的对象都是引用传递(注意String也是可以new出来的),而且这些对象相比基本数据类型更大更复杂。new出来的对象是放在堆里的,堆的分配和清理花的时间多一些,对于基本类型数据这种又小又简单的数据,不必采用new,而是直接存储“值”在栈中,它的存取速度仅次于寄存器。
在Swift众多数据类型中,只有class是指针传递,其余的如Int,Float,Bool,Character,Array,Set,enum,struct全都是值传递。
一个例子是,在java用forEach循环一个集合时,不可改变遍历对象的值,否则循环次数会出问题,而在swift用for-in循环遍历一个数组时,可以改变遍历对象的值。
因为在java里,循环开始时,一个栈空间分配给这个循环,集合也从堆被引用到其中,对集合的修改也在这个栈中。
在swift里,循环开始时,数组的值复制一份,循环次数立即确定,一个栈空间分配给这个循环,循环内的操作如对数组的修改也不在这个栈中,而是又复制一份,在另一个栈中完成这部分操作。
一个例子可以见我的一道leetcode题《比较队列存放森林》,用同样的方法分别用java和swift解答。
https://leetcode.cn/profile/articles/