关于list.size()的问题

名剑_无名 2014-08-26 06:13:48
package testcollection;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TestList {
public static void main(String[] args) {
int count=0;
int count2=0;
for(int i=1;i<=100;i++){
List list1=new ArrayList();
list1.add(134983);
list1.add("fdjakadf");
list1.add(new Date());
System.out.println(list1.size());//当没有这一句时 最后list1.size()一直是3 有了这一句时 list.size()有时会为4
list1.remove(new Date());
List list2=new ArrayList();
list2.add("djfdj");
list2.add("dfjh");
list2.add(342234);
list2.add(new Date());
list2.add("dsfak");
list2.add(new Dog());


list1.add(list2);

if(list1.size()==3){
count++;
}
if(list1.size()==4){
count2++;
}


}
System.out.println(count);
System.out.println(count2);
}
}
class Dog{

}

输出结果:
3
3
3
92
8
...全文
887 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
名剑_无名 2014-08-26
  • 打赏
  • 举报
回复
引用 6 楼 magi1201 的回复:
List list1=new ArrayList(); list1.add(134983); list1.add("fdjakadf"); list1.add(new Date()); // 添加了new Date System.out.println(list1.size());//第一次输出 list1.remove(new Date()); // 移除了new Date list1.add(list2); // 再添加list2 这里的new Date() 是对象,在内存空间中 我测了很多次,都是3,没有出现4 其实问题就出在new Date 上,为4的时候,remove的new Date 不是add 的那个new Date 所以,remove 根本就没有删除掉任何东西,所以此时list1的size 依然是3,再添加list2 就是4了 还为3的情况,remove掉的是add的那个new Date,导致list1的size为2 再添加list2 为3 Date 类的equals 方法,比较的是getTime()的值 public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); } 瞬时的两个new Date ,java会认为他们是相同的对象 给list1.remove(new Date()); 前添加一行 Thread.sleep(100); 这时,remove里面的对象便不再是之前add的对象,这样每次的list1.size 都是4了
O(∩_∩)O谢谢
名剑_无名 2014-08-26
  • 打赏
  • 举报
回复
引用 5 楼 lj983810198 的回复:
[quote=引用 4 楼 magi1201 的回复:] [quote=引用 2 楼 lj983810198 的回复:] 你运行试试 - - 我运行了好几次 每次 答案都不同
刚跑了几次,还专程把 System.out.println("list1.size()" + list1.size());打印了,为了看这清晰 跑了有8次左右,都是3,真没出现4 再说了,每次List list1=new ArrayList(); 时,list1 都指向了一个空的集合 然后 到打印list1.size() 之前,都只添加了三个元素进去 或许我还有考虑不周的地方吧,请楼主将为4的情况截出来看看 [/quote] package testcollection; import java.util.ArrayList; import java.util.Date; import java.util.List; public class TestList { public static void main(String[] args) { int count=0; int count2=0; for(int i=1;i<=100;i++){ List list1=new ArrayList(); list1.add(134983); list1.add("fdjakadf"); list1.add(new Date()); System.out.println(list1.size());//第一次输出 list1.remove(new Date()); List list2=new ArrayList(); list2.add("djfdj"); list2.add("dfjh"); list2.add(342234); list2.add(new Date()); list2.add("dsfak"); list2.add(new Dog()); list1.add(list2); System.out.println(list1.size());//第二次输出 if(list1.size()==3){ count++; } if(list1.size()==4){ count2++; } } System.out.println(count); System.out.println(count2); } } class Dog{ } 我又加了个输出语句 按说第一次 第二次 都是3 没有4但是....、 最后count 和count2 的 次数[/quote] 懂了 O(∩_∩)O谢谢
姜小白- 2014-08-26
  • 打赏
  • 举报
回复
List list1=new ArrayList(); list1.add(134983); list1.add("fdjakadf"); list1.add(new Date()); // 添加了new Date System.out.println(list1.size());//第一次输出 list1.remove(new Date()); // 移除了new Date list1.add(list2); // 再添加list2 这里的new Date() 是对象,在内存空间中 我测了很多次,都是3,没有出现4 其实问题就出在new Date 上,为4的时候,remove的new Date 不是add 的那个new Date 所以,remove 根本就没有删除掉任何东西,所以此时list1的size 依然是3,再添加list2 就是4了 还为3的情况,remove掉的是add的那个new Date,导致list1的size为2 再添加list2 为3 Date 类的equals 方法,比较的是getTime()的值 public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); } 瞬时的两个new Date ,java会认为他们是相同的对象 给list1.remove(new Date()); 前添加一行 Thread.sleep(100); 这时,remove里面的对象便不再是之前add的对象,这样每次的list1.size 都是4了
名剑_无名 2014-08-26
  • 打赏
  • 举报
回复
引用 4 楼 magi1201 的回复:
[quote=引用 2 楼 lj983810198 的回复:]
你运行试试 - - 我运行了好几次 每次 答案都不同

刚跑了几次,还专程把 System.out.println("list1.size()" + list1.size());打印了,为了看这清晰
跑了有8次左右,都是3,真没出现4
再说了,每次List list1=new ArrayList(); 时,list1 都指向了一个空的集合

然后 到打印list1.size() 之前,都只添加了三个元素进去

或许我还有考虑不周的地方吧,请楼主将为4的情况截出来看看 [/quote]
package testcollection;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TestList {
public static void main(String[] args) {
int count=0;
int count2=0;
for(int i=1;i<=100;i++){
List list1=new ArrayList();
list1.add(134983);
list1.add("fdjakadf");
list1.add(new Date());
System.out.println(list1.size());//第一次输出
list1.remove(new Date());
List list2=new ArrayList();
list2.add("djfdj");
list2.add("dfjh");
list2.add(342234);
list2.add(new Date());
list2.add("dsfak");
list2.add(new Dog());


list1.add(list2);
System.out.println(list1.size());//第二次输出
if(list1.size()==3){
count++;
}
if(list1.size()==4){
count2++;
}


}
System.out.println(count);
System.out.println(count2);
}
}
class Dog{

}
我又加了个输出语句 按说第一次 第二次 都是3 没有4但是....、
最后count 和count2 的 次数
姜小白- 2014-08-26
  • 打赏
  • 举报
回复
引用 2 楼 lj983810198 的回复:
你运行试试 - - 我运行了好几次 每次 答案都不同

刚跑了几次,还专程把 System.out.println("list1.size()" + list1.size());打印了,为了看这清晰
跑了有8次左右,都是3,真没出现4
再说了,每次List list1=new ArrayList(); 时,list1 都指向了一个空的集合

然后 到打印list1.size() 之前,都只添加了三个元素进去

或许我还有考虑不周的地方吧,请楼主将为4的情况截出来看看
-江沐风- 2014-08-26
  • 打赏
  • 举报
回复
把list1和list2的声明给放到循环外,然后在main方法的最后打印一下看看呢
名剑_无名 2014-08-26
  • 打赏
  • 举报
回复
你运行试试 - - 我运行了好几次 每次 答案都不同
姜小白- 2014-08-26
  • 打赏
  • 举报
回复
有了这一句时 list.size()有时会为4 不应该的啊,上面只添加进去了三个元素 楼主把有时会为4,有时的那种情况多验证下,应该不会为4的

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧