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

List概述

List接口是一个继承了集合(Collection)接口的有序集合的接口,常见的ArrayList、LinkedList都以不用形式来实现List接口。具体说明参考源代码或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.

在列表的末尾添加元素,但是在使用是,如果添加的是自定义的对象时,却不是直接添加该对象,而是添加该对象的引用(或者说地址);如果添加的是String、int等基本类型数据时,添加的是本身的值,而不是引用。以下测试印证。

测试

使用ArrayList测试,分别添加元素为基本类型和自定义对象。

基本类型

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());

}

打印的结果:

------------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 为初始阶段,没有赋值时name值为空,list也为空(此时list的hashcode为1,是另外一个问题了);part 2 和 part 3 的区别是重点,为name赋了不同的值,hashcode发生变化,list中的数据不同。此时list存储的是基本类型元素的值。

其他类型

Integer等基本类型测试也适用。

自定义类

自定义测试类:

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;
    }

}

不同对象

测试代码:

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));
    
}

打印结果:

----------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是添加第一个元素,part 2是添加第二个元素。两次添加的元素,类相同但却是两个实例对象。两个对象的hashcode不同,赋值不同,添加到list中,list的内容也不同。

同一个对象

测试代码:

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));
    
    }

打印结果:

----------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是添加第一个元素,part 2是添加第二个元素。两次添加过程中,同一个对象两次赋值,属性值变了但是hashcode值没有变,过程中对象的存储没有改变;但是list在第二次执行add()方法后,两个位置中的元素值相同。此时list中的第一个元素值改变了,对比不同对象添加的结果,可以说明list存储的是该元素对象的引用。

结论

List在执行add()方法时,如果添加的元素是基本类型,则添加的是基本类型的值,而如果添加的是自定义的类对象时,添加的实际上是该对象的引用或者说是虚拟地址,在需要list中的某个元素时,还是根据这个引用查找该对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 写给找寻财富自由的自己。 今天是2016年11月26日,平凡的一天,作为简书的开始,写写近期的感悟。 前几天结婚,...
    奔跑的大球票阅读 194评论 0 1
  • 如果别人不想或者不喜欢,就不要来硬的,只会让人更反感。 雅儿之所以认识洲子,是因为一个社团师兄的无意间约大家岀来玩...
    苏微阅读 626评论 1 0