深度解析Contains底层代码

在分析contains之前,我们先看一下==和equals区别,

1、==和equals区别

String str1="Jim";
String str2 ="Jim";
System.out.println(str1==str2);`

==:基本数据类型比较值是否相同;引用类型比较地址是否相同

String str3="Jim";
String str4 =new String("Jim");
System.out.println(str3.equals(str4));

equals:Object类中equals实质就是比较地址是否相同;一些数据类型在引用上重写了equals(),String类中equals实质是比较字符转内容后是否相同。

2.contains底层源码分析

1>先上一段代码来调用contains。

List<String> name= new ArrayList<>();name.add("Jimmy");System.out.println(name.contains("Tonny"));

2>按着键盘Ctrl+鼠标左键单击进入ArrayList数组里的contains方法。这是我们会看到如下内容,其object里面的参数o为我们要比较的对象Tonny,对Tonny进行了上转型操作,返回值为判断indexof(Tonny) >= 0。

public boolean contains(Object o) {//Tonny为传入参数,o指向Tonny对象,Tonny为上转型对象return indexOf(o) >= 0;//调用下面的indexOf方法
}

3>接着Ctel+左键点击indexof,进入indexof方法,该方法并未做什么操作,只是将参数封装调入到另一个方法indexOfRange取进行字符串截取比较。点击进去indexOfRange。

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

4>关键点:字符串比较。

    int indexOfRange(Object o, int start, int end) {//Tonny为传入参数,start为该数组的0位,end为末尾。Object[] es = elementData;//将要进行判断的数组列表if (o == null) {//Tonny地址不为空,不执行if语句for (int i = start; i < end; i++) {if (es[i] == null) {return i;}}} else {//遍历集合中所有元素判断是否存在元素与test相同for (int i = start; i < end; i++) {if (o.equals(es[i])) {//使用equals方法判断是否相等return i;相等,则返回该值所在位置坐标,上面contains方法最终返回true。}}}return -1;//不相等,则返回-1值上面contains方法最终返回false。}

3、contains代码实用场景

1。String类型比较两者参数相同,类型相同,最后返回值为true。如果类型不同||参数不同则返回结果为false。
List<String> names= new ArrayList<>();names.add("Jimmy");String name="Jimmy"System.out.println(names.contains("Jimmy"));
 int indexOfRange(Object o, int start, int end) {//name为传入参数,o指向name对象,name为上转型对象Object[] es = elementData;if (o == null) {/name指向的字符串不为null,if语句不执行for (int i = start; i < end; i++) {if (es[i] == null) {return i;}}} else {for (int i = start; i < end; i++) {//for遍历该数组获取其下标if (o.equals(es[i])) {//拿Jimmy对象和各个元素进行比较判断,这是我们会发现两者字符相同return i;//返回其相等后的坐标值给上面的contains方法,最后返回true。}}}return -1;}
2。判断自定义类型

接下来我们创建Student类型对象,向ArrayList数组添加元素。这里就会发现结果为false,两者值虽然相同,但两者都是创建的新的对象,两者的内存地址不相等,自定义类型在比较时用的是Object的equals方法(比较地址是否相同),所以返回为false。

List<Student> list = new ArrayList<>();
list.add(new Student("Tom"));
String student= new Student("Tom");
System.out.println(list.equals(student)));
    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])) {//在这里比较时equals用的是Object的equals方法(比较地址是否相同)return i;}}}return -1;//所以两者地址不相同,返回-1值上面contains方法最终返回false。}

3。通过上述自定义类型很难满足我们的需求,当两者内容相同,数据类型相同时我们想让他们相等,这里我们就要对Object里的equals方法进行重写操作。

@Overridepublic boolean equals(Object obj) {if (obj instanceof Student) {Student other = (Student) obj;return Objects.equals(this.name, other.name);}return false;}

深度解析Contains底层代码相关推荐

  1. 深度解析HashMap底层实现架构

    摘要:分析Map接口的详细使用以及HashMap的底层是如何实现的? 本文分享自华为云社区<[图文并茂]深度解析HashMap高频面试及底层实现结构![奔跑吧!JAVA]>,原文作者:灰小 ...

  2. Spring MVC学习总结(16)——SpringMVC运行流程深度解析(含代码)

    spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器 ...

  3. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)

    五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 ,  指定初始化方法 init-method 方法​ 二 ,指定销毁 ...

  4. 深度解析HashMap高频面试及底层实现架构!

    深度解析HashMap高频面试及底层实现架构! HashMap高频面试题 1,Map接口和List接口是什么关系? 2.Map有哪些常用的实现类? 3.请阐述HashMap的put过程? 4.链表中是 ...

  5. 利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法

    利用图文和代码深度解析操作系统OS的内存管理实现原理机制和算法. 内存作为计算机系统的组成部分,跟开发人员的日常开发活动有着密切的联系,我们平时遇到的Segment Fault.OutOfMemory ...

  6. String/StringBuilder/ToString()底层代码解析( JAVA / C# )

    C# /JAVA: 字符串构建利器StringBuilder区别 前言 名词解释 1.1 示例 案例一: 不同变量赋值( = ) 案例二:相同变量赋值( = ) 案例三:变量追加赋值( += ) 1. ...

  7. 深度解析黑白棋AI代码原理(蒙特卡洛搜索树MCTS+Roxanne策略)

    深度解析黑白棋AI代码原理(蒙特卡洛搜索树MCTS+Roxanne策略) 文章目录 深度解析黑白棋AI代码原理(蒙特卡洛搜索树MCTS+Roxanne策略) 黑白棋规则 传统黑白棋策略 蒙特卡洛搜索树 ...

  8. 单文件浏览器_图文并茂深度解析浏览器渲染原理,包看懂超值得收藏

    在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广 ...

  9. 深度解析:mPaaS 3.0全新组件

    摘要:以"数字金融新原力(The New Force of Digital Finance)"为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办.分论坛上,蚂蚁金服产 ...

  10. 深度解析ASP.NET2.0中的Callback机制

    callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了.但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么,就要先深入了解callback的实现机制 ...

最新文章

  1. 对ListenSocket 的研究(四)
  2. 关于AxWebBrowser关闭网页时的关闭提示
  3. moel vue 自定义v_vue在自定义组件中使用v-model的方法
  4. 深入理解Scala的隐式转换
  5. 英特尔技术流新帅履职,给员工们一些“笔记”学习一下
  6. 原创:华三杯2018山东省赛决赛样题试做
  7. 雾霾的结构化责任主体
  8. 机器学习自动写诗-学习笔记
  9. 阿里云aks使用demo
  10. pure-ftp 启用虚拟账户的问题
  11. 恋爱计时:只要时间在走,我们的爱就在继续
  12. python用cartopy包画地图_python绘制地图的利器Cartopy使用说明
  13. 网络安全风险评估关键技术讨论
  14. 【电子工程师】示波器基础知识问答
  15. input 标签 autofill属性生效导致的输入框背景色变成黄色(或其他色)的解决办法
  16. 发那科机器人回原位置先上升_机器人小知识 | 发那科机器人位置信息修改介绍...
  17. Mathtype和word关联
  18. bearer token头_BearerToken之JWT的介绍
  19. 测绘专业c语言程序,2017年武汉大学测绘遥感信息工程国家重点实验室968C语言程序设计[专业硕士]考研导师圈点必考题汇编...
  20. SystemUI之ScreenShot

热门文章

  1. 前端高效开发必备的 js 库
  2. yigo项目中使用的函数
  3. java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署
  4. 微信小程序泛滥的今天,你知道如何测试吗?
  5. Verilog 按键消抖的一些分析和想法
  6. 深度学习之美(张玉宏)——第三章 机器学习三重门
  7. e4a 安卓获取ROOT权限的方法思路 转载
  8. React高频面试题梳理,看看面试怎么答?(上)
  9. MapWinGis学习(一) 新建图层 在指定点上打上图标
  10. 麦普奇医疗获得千万元A轮融资,投资方为达晨财智...