List接口中add()方法的使用

List概述

List接口是一個(gè)繼承了集合(Collection)接口的有序集合的接口蹲诀,常見的ArrayList岳守、LinkedList都以不用形式來(lái)實(shí)現(xiàn)List接口。具體說(shuō)明參考源代碼或Oracle文檔

add()方法

add()方法是將指定的元素附加到此列表的末尾。

     * Appends the specified element to the end of this list (optional
     * operation).
     *
     * <p>Lists that support this operation may place limitations on what
     * elements may be added to this list.  In particular, some
     * lists will refuse to add null elements, and others will impose
     * restrictions on the type of elements that may be added.  List
     * classes should clearly specify in their documentation any restrictions
     * on what elements may be added.

在列表的末尾添加元素羡忘,但是在使用是,如果添加的是自定義的對(duì)象時(shí)磕昼,卻不是直接添加該對(duì)象卷雕,而是添加該對(duì)象的引用(或者說(shuō)地址);如果添加的是String票从、int等基本類型數(shù)據(jù)時(shí)爽蝴,添加的是本身的值,而不是引用纫骑。以下測(cè)試印證。

測(cè)試

使用ArrayList測(cè)試九孩,分別添加元素為基本類型和自定義對(duì)象先馆。

基本類型

String類型

public void testStringList(){
    
    String name = "";
    List<String> list = new ArrayList<String>();
    
    System.out.println("------------part 1------------");
    System.out.println("-----name:"+name+",hashcode:"+name.hashCode());
    System.out.println("-----list:"+list.toString()+",hashcode:"+list.hashCode());
    
    name="aaa";
    list.add(name);
    
    System.out.println("------------part 2------------");
    System.out.println("-----name:"+name+",hashcode:"+name.hashCode());
    System.out.println("-----list:"+list.toString()+",hashcode:"+list.hashCode());

    name="bbb";
    list.add(name);
    
    System.out.println("------------part 3------------");
    System.out.println("-----name:"+name+",hashcode:"+name.hashCode());
    System.out.println("-----list:"+list.toString()+",hashcode:"+list.hashCode());

}

打印的結(jié)果:

------------part 1------------
-----name:,hashcode:0
-----list:[],hashcode:1
------------part 2------------
-----name:aaa,hashcode:96321
-----list:[aaa],hashcode:96352
------------part 3------------
-----name:bbb,hashcode:97314
-----list:[aaa, bbb],hashcode:3084226

part 1 為初始階段,沒有賦值時(shí)name值為空躺彬,list也為空(此時(shí)list的hashcode為1煤墙,是另外一個(gè)問(wèn)題了);part 2 和 part 3 的區(qū)別是重點(diǎn)宪拥,為name賦了不同的值仿野,hashcode發(fā)生變化,list中的數(shù)據(jù)不同她君。此時(shí)list存儲(chǔ)的是基本類型元素的值脚作。

其他類型

Integer等基本類型測(cè)試也適用。

自定義類

自定義測(cè)試類:

public class BaseEntity {

    private String id;
    
    private String name;
    
    public BaseEntity(String id){
        this.id=id;
    };
    
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "id:"+this.id+",name:"+this.name;
    }

}

不同對(duì)象

測(cè)試代碼:

public void testOtherObjectList(){
    
    List<BaseEntity> list = new ArrayList<BaseEntity>();
    
    BaseEntity entity_1 = new BaseEntity("a1");
    entity_1.setName("name-3");
    list.add(entity_1);
    
    System.out.println("----------part 1-----------");
    System.out.println("---entity-----hashcode:"+entity_1.hashCode()+"--------toString:"+entity_1.toString());
    System.out.println("---list-------hashcode:"+list.hashCode()+"--------toString:"+list.toString());
    System.out.println(list.get(0));
    
    BaseEntity entity_2 = new BaseEntity("a2");
    entity_2.setName("name-4");
    list.add(entity_2);
    
    System.out.println("----------part 2-----------");
    System.out.println("---entity-----hashcode:"+entity_2.hashCode()+"--------toString:"+entity_2.toString());
    System.out.println("---list-------hashcode:"+list.hashCode()+"--------toString:"+list.toString());
    System.out.println(list.get(0));
    System.out.println(list.get(1));
    
}

打印結(jié)果:

----------part 1-----------
---entity-----hashcode:1838148248--------toString:id:a1,name:name-3
---list-------hashcode:1838148279--------toString:[id:a1,name:name-3]
id:a1,name:name-3
----------part 2-----------
---entity-----hashcode:57858394--------toString:id:a2,name:name-4
---list-------hashcode:1205880195--------toString:[id:a1,name:name-3, id:a2,name:name-4]
id:a1,name:name-3
id:a2,name:name-4

part 1是添加第一個(gè)元素,part 2是添加第二個(gè)元素球涛。兩次添加的元素劣针,類相同但卻是兩個(gè)實(shí)例對(duì)象。兩個(gè)對(duì)象的hashcode不同亿扁,賦值不同捺典,添加到list中,list的內(nèi)容也不同从祝。

同一個(gè)對(duì)象

測(cè)試代碼:

public void testObjectList(){
        
    List<BaseEntity> list = new ArrayList<BaseEntity>();
    
    BaseEntity entity_1 = new BaseEntity("b1");
    entity_1.setName("name-1");
    list.add(entity_1);
    
    System.out.println("----------part 1-----------");
    System.out.println("---entity-----hashcode:"+entity_1.hashCode()+"--------toString:"+entity_1.toString());
    System.out.println("---list-------hashcode:"+list.hashCode()+"--------toString:"+list.toString());
    System.out.println(list.get(0));
    
    entity_1.setId("b2");
    entity_1.setName("name-2");
    list.add(entity_1);
    
    System.out.println("----------part 2-----------");
    System.out.println("---entity-----hashcode:"+entity_1.hashCode()+"--------toString:"+entity_1.toString());
    System.out.println("---list-------hashcode:"+list.hashCode()+"--------toString:"+list.toString());
    System.out.println(list.get(0));
    System.out.println(list.get(1));
    
    }

打印結(jié)果:

----------part 1-----------
---entity-----hashcode:88633879--------toString:id:b1,name:name-1
---list-------hashcode:88633910--------toString:[id:b1,name:name-1]
id:b1,name:name-1
----------part 2-----------
---entity-----hashcode:88633879--------toString:id:b2,name:name-2
---list-------hashcode:-1458682207--------toString:[id:b2,name:name-2, id:b2,name:name-2]
id:b2,name:name-2
id:b2,name:name-2

part 1是添加第一個(gè)元素襟己,part 2是添加第二個(gè)元素。兩次添加過(guò)程中牍陌,同一個(gè)對(duì)象兩次賦值擎浴,屬性值變了但是hashcode值沒有變,過(guò)程中對(duì)象的存儲(chǔ)沒有改變呐赡;但是list在第二次執(zhí)行add()方法后退客,兩個(gè)位置中的元素值相同。此時(shí)list中的第一個(gè)元素值改變了链嘀,對(duì)比不同對(duì)象添加的結(jié)果萌狂,可以說(shuō)明list存儲(chǔ)的是該元素對(duì)象的引用。

結(jié)論

List在執(zhí)行add()方法時(shí)怀泊,如果添加的元素是基本類型茫藏,則添加的是基本類型的值,而如果添加的是自定義的類對(duì)象時(shí)霹琼,添加的實(shí)際上是該對(duì)象的引用或者說(shuō)是虛擬地址务傲,在需要list中的某個(gè)元素時(shí),還是根據(jù)這個(gè)引用查找該對(duì)象枣申。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末售葡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忠藤,更是在濱河造成了極大的恐慌挟伙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件模孩,死亡現(xiàn)場(chǎng)離奇詭異尖阔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)榨咐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門介却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人块茁,你說(shuō)我怎么就攤上這事齿坷。” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵胃夏,是天一觀的道長(zhǎng)轴或。 經(jīng)常有香客問(wèn)我,道長(zhǎng)仰禀,這世上最難降的妖魔是什么照雁? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮答恶,結(jié)果婚禮上饺蚊,老公的妹妹穿的比我還像新娘。我一直安慰自己悬嗓,他們只是感情好污呼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著包竹,像睡著了一般燕酷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上周瞎,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天苗缩,我揣著相機(jī)與錄音,去河邊找鬼声诸。 笑死酱讶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彼乌。 我是一名探鬼主播泻肯,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼慰照!你這毒婦竟也來(lái)了灶挟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毒租,失蹤者是張志新(化名)和其女友劉穎膏萧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝌衔,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蝌蹂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了噩斟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孤个,死狀恐怖剃允,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤斥废,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布椒楣,位于F島的核電站,受9級(jí)特大地震影響牡肉,放射性物質(zhì)發(fā)生泄漏捧灰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一统锤、第九天 我趴在偏房一處隱蔽的房頂上張望毛俏。 院中可真熱鬧,春花似錦饲窿、人聲如沸煌寇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阀溶。三九已至,卻和暖如春鸦泳,著一層夾襖步出監(jiān)牢的瞬間银锻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工辽故, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徒仓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓誊垢,卻偏偏與公主長(zhǎng)得像掉弛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喂走,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理殃饿,服務(wù)發(fā)現(xiàn),斷路器芋肠,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評(píng)論 25 707
  • 問(wèn)答題47 /72 常見瀏覽器兼容性問(wèn)題與解決方案乎芳? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92
  • 寫給找尋財(cái)富自由的自己。 今天是2016年11月26日帖池,平凡的一天奈惑,作為簡(jiǎn)書的開始,寫寫近期的感悟睡汹。 前幾天結(jié)婚肴甸,...
    奔跑的大球票閱讀 196評(píng)論 0 1
  • 如果別人不想或者不喜歡,就不要來(lái)硬的庶柿,只會(huì)讓人更反感村怪。 雅兒之所以認(rèn)識(shí)洲子,是因?yàn)橐粋€(gè)社團(tuán)師兄的無(wú)意間約大家岀來(lái)玩...
    蘇微閱讀 627評(píng)論 1 0