5 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
對(duì)于對(duì)象來(lái)說(shuō),傳遞的只是引用,不是以副本形式(值)傳遞的,8 種基本類型(非對(duì)應(yīng)的類類型)才是傳值。

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
值傳遞沒(méi)錯(cuò), 但相對(duì)于簡(jiǎn)單類型是這樣, 對(duì)于類來(lái)說(shuō),值是類的內(nèi)存地址, 也就是引用. 如果你改了引用對(duì)應(yīng)對(duì)象的內(nèi)部值, 也沒(méi)有誰(shuí)能攔得了你. 網(wǎng)上資料太多, 不重復(fù)了.
打個(gè)比方說(shuō), 集合類型就是書包, 你背上書包進(jìn)了樓, 相當(dāng)于是調(diào)用了進(jìn)樓方法, 執(zhí)行完成了,你出了樓, 你沒(méi)有變, 書包也沒(méi)有變. 但你書包里的東西變沒(méi)變就不好說(shuō)了.

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
這種也叫引用傳遞,傳遞的是對(duì)象的內(nèi)存地址。也就是說(shuō)這兩個(gè)方法里的變量指向的是同一塊內(nèi)存地址。
classes.add(cls);
對(duì)內(nèi)存地址里的數(shù)據(jù)做了修改,也直接反應(yīng)到getClassSet
里的變量,因?yàn)樗鼈兪峭粋€(gè)對(duì)象

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
HashSet源碼是基于HashMap實(shí)現(xiàn)的
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
Set<Class<?>> classes = new HashSet<>();
調(diào)用private static void doAddClass(Set<Class<?>> classes, String className)方法
兩個(gè)classes引用同時(shí)指向new HashSet<>()這個(gè)對(duì)象,在方法里面執(zhí)行 classes.add(cls);
也就是調(diào)用了map的put方法,修改了這個(gè)共同指向?qū)ο罄锩娴腍ashMap成員變量的內(nèi)容,返回的也是這個(gè)對(duì)象,所以getClassSet方法返回的set里能獲取到元素。
添加回答
舉報(bào)