javaarraylistequal_Java集合之List的equals方法

更新时间:2023-06-24 01:54:57 阅读: 评论:0

javaarraylistequal_Java集合之List的equals⽅法
⼀、先说结论:
1、List(ArrayList)调⽤equals⽅法,判断的是存储的元素相等,⽽不是直接⽐较引⽤。说明List(ArrayList)重写了equals⽅法。
英语演讲题目List l1 = new ArrayList<>();
l1.add(T1);
List l2 = new ArrayList<>();
l2.add(T1);
l1.equals(l2); //true
2、List> res 中,可以对相同List< String>去重。直接使⽤ains(List)⽅法即可。
⼆、源码分析:
出于对ArrayList源码分析:
public class ArrayList extends AbstractList
薏仁米是什么implements List, RandomAccess, Cloneable, java.io.Serializable
发现ArrayList实现了List接⼝,按理来说ArrayList需要实现所有List的接⼝⽅法。但是equals⽅法可以从extends的Object类获得[1] 。所以我误认为ArrayList的equals⽅法是Object类的equals⽅法。ArrayList中元素需⽐较引⽤。
在对复合集合res添加List时,觉得在添加新的List时,需要遍历res所有的List,然后遍历所有List元素来去重。算法复杂度就变得很⾼。后来尝试发现直接contains即可?
List> res = new ArrayList<>();
野生草鱼List l1 = new ArrayList<>();
List l2 = new ArrayList<>();
l1.add("123");
l2.add("123");
res.add(l1);
System.out.ains(l2));// true
(1)⾸先contains⽅法是调⽤indexOf⽅法确定存在性。
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
(2)indexOf⽅法是将List中所有元素,与Object o⽐较。
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
简要事迹} el {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
(3)最终还是需要将List中元素,与Object o做equals⽐较。(就是遍历res中的List与给定targetList进⾏equals⽐较)
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
这⾥调⽤的equals⽅法并不是Object类中的。ArrayList继承了AbstractList< E>,它的equals⽅法应该从这个抽象类中来的。发现该类确实重写了equals⽅法,就是使⽤迭代器遍历两个List每个元素是否相等。 那么ArrayList调⽤equals⽅法就是元素进⾏⽐较了。
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return fal;
ListIterator e1 = listIterator();
ListIterator> e2 = ((List>) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();我就是这样
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))手工花灯
return fal;
}
return !(e1.hasNext() || e2.hasNext());
}
因此,得出⽂章开头的1、2两点结论。以上~就业证明范文
三、补充藏红花的药用价值
[1] 这⾥补充为啥没有显式extends Object的原因分析:
这个继承关系是是编译阶段完成的,所以我们表⾯上看不到。
在编译阶段,当遇到⼀个类没有⽗类的使⽤,编译器会指定⼀个默认的⽗类(⼀般为Object),当该类已经有⼀个⽗类,jvm会按照常规的⽅法去处理每⼀个类。
//原始的类,没有显式的继承Object
public class Test{
//注意这⾥没有写构造⽅法
public static void main(String args[]){
}
}
将代码编译为class后反编译为txt⽂件
//编译后,如果没有⽗类会给你加⼀个默认的object⽗类
public class Test extends java.lang.Object{
public Test();//编译阶段,如果没有构造⽅法会给你加⼀个空的构造⽅法public static void main(java.lang.String[]){};
}

本文发布于:2023-06-24 01:54:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1025380.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:没有   编译   阶段
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图