A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ArrayList list = new ArrayList();
list.add(new Person("张三", 23));
list.add(new Person("李四", 24));
list.remove(new Person("张三", 23));
老师说过,new这个词一出现,就表示新创建了一个对象.而在上述代码中,remove方法删除了list中已经存在的那个叫张三的对象,那么在remove过程中是不是new了个张三出来?

13 个回复

倒序浏览
个人觉得,是的,运行new Person()方法的确会创建对象,然后,你又把它remove掉了,没有意义,正常不会这么做的...
回复 使用道具 举报
这么深奥,能不能问正常点的....
回复 使用道具 举报
Fate_stay 发表于 2016-9-15 23:41
个人觉得,是的,运行new Person()方法的确会创建对象,然后,你又把它remove掉了,没有意义,正常不会这么做的.. ...

你看是不是这样:remove()进栈后,先new一个("张三",23)的对象出来,然后拿new出来的这个对象去和list里面的元素一个一个的进行equals方法(重写过的)比较,如果有相同的,则删除该元素.如果没有相同的,则返回false.
回复 使用道具 举报
我觉得是啊,new了一个对象,这个对象和上面的张三貌似一样,但是哈希值不一样,也就是说上面new的张三并没有被remove,个人看法...
回复 使用道具 举报
list.remove(new Person("张三", 23));
首先在堆中new出来了一个对象。
ArrayList可重复,且两个对象地址值不同,这时候存在3个对象
然后被remove掉
最后剩下前两个对象

点评

楼上说的非常正确  发表于 2016-9-16 11:31
回复 使用道具 举报 1 0
起啥名好呢 发表于 2016-9-16 09:14
我觉得是啊,new了一个对象,这个对象和上面的张三貌似一样,但是哈希值不一样,也就是说上面new的张三并没 ...

在remove方法里面new出来的那个对象没有哈希码值吧,因为hashcode方法是被ArrayList的对象添加元素的时候才会调用的.remove里面那个new出来的张三是不会添加进list集合里面的
回复 使用道具 举报
somnus-sir 发表于 2016-9-16 11:07
list.remove(new Person("张三", 23));
首先在堆中new出来了一个对象。
ArrayList可重复,且两个对象地址值 ...

这位兄台,remove()一次只会删除list里面的一个元素,不会一次调用就删除所有叫("张三",23)的对象.而上述代码的运行结果是list里面只剩一个元素("李四",24)了.
回复 使用道具 举报
长空皓月 发表于 2016-9-16 11:23
这位兄台,remove()一次只会删除list里面的一个元素,不会一次调用就删除所有叫("张三",23)的对象.而上述代 ...

你先去运行一次看看
回复 使用道具 举报
somnus-sir 发表于 2016-9-16 11:33
你先去运行一次看看

运行结果

QQ图片20160916113934.png (9.16 KB, 下载次数: 1)

QQ图片20160916113934.png
回复 使用道具 举报

D:\m.png
你是不是重写hashCode 和equals方法了
回复 使用道具 举报
somnus-sir 发表于 2016-9-16 11:44
你是不是重写hashCode 和equals方法了

重写了呀
回复 使用道具 举报
本帖最后由 litianji2016 于 2016-9-16 11:58 编辑

对,只要用到new关键字就是在内存中开辟一块内存用来实例一个新的对象,先说ArrayList中存的是什么,如果是引用数据类型,那它只存对象的引用既在内存中的地址,如果是基本数据类型的话,我想我不用我说你也明白,那么你new出来的对象的地址一定不是你之前的那个张三对象的地址,所以删除不了,你可以看看源码,对你会有帮助的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马