java使用linkedlist的remove删除出问题

2025-03-04 08:48:18
推荐回答(3个)
回答1:

PhoneList bb = new PhoneList("112",2);

PhoneList cc = new PhoneList("112",2);

是两个不同的对象,他们指向不同的内存位置。你这样写只是他们的值一样而已,因为你在v里面并没有把cc放进去,所以是不能remove滴孩纸

回答2:

Java提供的List和Map都是用(o==null ? get(i)==null : o.equals(get(i)))实现Remove(Object o),这个语句依赖于Object本身的方法equals,而这个方法默认只是比较两个对象是否是同一个对象(和==运算符的效果是一样的),而不是两个对象的内容是否相同。bb和cc内容相同但实际是两个对象,所以remove的时候就只能remove同一个对象。
因此,想比较两个对象的内容是否相同需要重写这个方法,一般的IDE都会提供生成默认重写代码的快捷方式,格式类似:
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ClassName other = (ClassName) obj;
if (classMemeber1== null) {
if (other.coclassMemeber1 null)
return false;
} else if (!classMemeber1.equals(other.classMemeber1))
return false;
...
return true;

你说的hashmap函数应该是hashCode()方法。Java提供的很多List和Map实现类都有Hash前缀,意思是使用hashCode()方法进行散列,是提高查找对象效率的一种方法,目的是把对象内容通过一定算法散列到类似一个树状结构的索引中,查找对象时只需要遍历索引的一条路径就可以了。影响效率高低的就是对象散列的分布情况,想象下如果散列成一个只有1深度的树或者每层叶节点为1的树,那查找对象的效率就等同于遍历整个集合。Object提供的hashCode方法是固定的,因此要提高效率只能重写这个方法。一般的IDE也会提供生成默认重写代码的快捷方式,格式类似:
final int prime = 31;
int result = 1;
result = prime * result + ((classMemeber1 == null) ? 0 : classMemeber1.hashCode());
...
return result;

连同上面两个方法,还有一个方法也默认所有类都要重写的,就是toString()方法,这个你试过查日志排查问题的时候就会深有体会了。
另外实体对象最好也实现Serializable接口,该接口没有方法,只是告诉Java这个类可以被序列化,提高以后使用对象传输技术的可能性。

回答3:

把数据存放在map中啊,你这么存成什么了