java和swift數(shù)據(jù)傳遞的區(qū)別
值傳遞:是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。
引用傳遞:是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
Java除了基本數(shù)據(jù)類型是值傳遞,都是引用傳遞。不難發(fā)現(xiàn),new出來的對(duì)象都是引用傳遞(注意String也是可以new出來的),而且這些對(duì)象相比基本數(shù)據(jù)類型更大更復(fù)雜。new出來的對(duì)象是放在堆里的,堆的分配和清理花的時(shí)間多一些,對(duì)于基本類型數(shù)據(jù)這種又小又簡單的數(shù)據(jù),不必采用new,而是直接存儲(chǔ)“值”在棧中,它的存取速度僅次于寄存器。
在Swift眾多數(shù)據(jù)類型中,只有class是指針傳遞,其余的如Int,Float,Bool,Character,Array,Set,enum,struct全都是值傳遞。
一個(gè)例子是,在java用forEach循環(huán)一個(gè)集合時(shí),不可改變遍歷對(duì)象的值,否則循環(huán)次數(shù)會(huì)出問題,而在swift用for-in循環(huán)遍歷一個(gè)數(shù)組時(shí),可以改變遍歷對(duì)象的值。
因?yàn)樵趈ava里,循環(huán)開始時(shí),一個(gè)棧空間分配給這個(gè)循環(huán),集合也從堆被引用到其中,對(duì)集合的修改也在這個(gè)棧中。
在swift里,循環(huán)開始時(shí),數(shù)組的值復(fù)制一份,循環(huán)次數(shù)立即確定,一個(gè)棧空間分配給這個(gè)循環(huán),循環(huán)內(nèi)的操作如對(duì)數(shù)組的修改也不在這個(gè)棧中,而是又復(fù)制一份,在另一個(gè)棧中完成這部分操作。
一個(gè)例子可以見我的一道leetcode題《比較隊(duì)列存放森林》,用同樣的方法分別用java和swift解答。
https://leetcode.cn/profile/articles/