ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

浅谈contains方法底层代码实现及其使用示例

2021-05-11 21:35:44  阅读:155  来源: 互联网

标签:contains return 浅谈 示例 int Object equals String


==与equals区别与关系

==:基本数据类型比较值是否相同;引用类型比较地址是否相同。示例代码如下:

int a = 10;
int b = 10;
System.out.println(a == b);
String c = "A";
String d = "B";
System.out.println(c == d);

equals:基本数据类型是不能直接调用方法的,所以equals只能用于引用类型,Object类中equals实质就是比较地址是否相同;Integer等包装类是比较类中存储的内容是否相同,String类中equals实质比较字符串内容是否相同。示例代码如下:

Object n = 10;
Object o = 10;
System.out.println(n.equals(o));
Integer e = 10;
Integer f = 10;
System.out.println(e.equals(f));
String g = "C";
String h = "D";
System.out.println(g.equals(h));

jdk14中contains方法底层代码实现

自定义一个测试类,用来调用contains方法,方便后面介绍contains方法底层代码实现:

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

public class Test {

	public static void main(String[] args) {
		List<String> nameList = new ArrayList<>();//多态,编译时会调用List的方法,而实际运行时会调用ArrayList的方法
		nameList.add("Jack");
		String name = "Jack";
		System.out.println(nameList.contains(name));//nameList调用contains方法
	}

}

contains方法底层代码:

public boolean contains(Object o) {
	    return indexOf(o) >= 0;
 }

 public int indexOf(Object o) {
    return indexOfRange(o, 0, size);
  }

  int indexOfRange(Object o, int start, int end) {
    Object[] es = elementData;
    if (o == null) {
       for (int i = start; i < end; i++) {
        if (es[i] == null) {
          return i;
        }
      }
    } else {
      for (int i = start; i < end; i++) {
        if (o.equals(es[i])) {
          return i;
        }
      }
    }
    return -1;
  }

public boolean contains(Object o) //name为传入参数——>o指向name所指向的对象——>name对象为上转型对象

return indexOf(o) >= 0;//return返回值,并开始调用下面indexOf方法。

public int indexOf(Object o) {//indexOf方法中o指向contains方法o指向的对象——>indexOf方法o实质指向name对象

if (o == null) //该方法中已经为name对象赋值,所以o不为null——>o == null 这条语句false,继续往下执行

for (int i = start; i < end; i++)//for循环从start到end遍历nameList中每一个元素;其中start从indexOf方法传进来的值为0、end从indexOf方法传进来的值为size;之所以需要遍历集合是因为要将新传入的参数和原集合中的每个参数进行比较lai判断集合中是否存在特定参数

if (o.equals(es[i]))//o指向的对象与将nameList中遍历出来的每个元素进行对比,对比规则o.equals(es[i])——>因为o指向name变量的地址,所以执行时指向的是String类中的equals。

jdk14中equals底层代码分析

Object类中equals实质就是比较地址是否相同:

public boolean equals(Object obj) {
   return (this == obj);
 }

Integer类中重写了Object类中的equals方法,其实质是比较类中存储的内容是否相同

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
      return value == ((Integer)obj).intValue();
    }
    return false;
  }

Stringr类中重写了Object类中的equals方法,其实质是比较字符串内容是否相同:

public boolean equals(Object anObject) {
   if (this == anObject) {
     return true;
   }
   if (anObject instanceof String) {
     String aString = (String)anObject;
     if (!COMPACT_STRINGS || this.coder == aString.coder) {
       return StringLatin1.equals(value, aString.value);
     }
   }
   return false;
 }

标签:contains,return,浅谈,示例,int,Object,equals,String
来源: https://www.cnblogs.com/lty-blogs/p/14756134.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有