java 判断是否是list_JAVA从头开始一基础梳理(4-3)

5a581816699ed5bd020db60e2d9c3997.png

大家好,今天我们介绍一下java中常用的集合类型。

首先,我们先看一下java中集合类型的结构。

1a622eba6855f9b3102b4ebbe48a8cba.png

以上是集合的继承关系图,通常我们使用的比较多的是 Set , List , Map以及其衍生的子类和接口实现类。

首先给大家介绍一下List,List本身是一个接口类,它向它的实现类定义了一系列的接口函数。

在List类后跟了一个标记,表示对于List来说,是可以指定类型的,比如List,代表list保存的数据类型为String字符串,又比如List,代表list保存的数据类型为封装int

d534263239906b7191c7367287dae652.png

他代表的是有序的,可重复的一个集合体,为了研究他的具体逻辑,我们从ArrayList的源码开始对应List接口所规范的接口函数。

1.add(E e);

add函数提供了向ArrayList对象添加一个数据的功能,具体源码如下

77c5acf259e1066a3c24414d82212113.png

可以看到ArrayList类实现了List接口中的add函数,我们来看看他是如何做的。

首先源码462行中,调用了函数ensureCapacityInternal,这个函数的主要作用是用于判断当前集合内保存数据的数组(what?)的长度是否满足继续添加,如果不满足的话就需要进行扩容,具体实现代码如下

280de7c9537ceb16b5e901084eaf743e.png
4d4725a51c702e2cdec1b55ceb2191bc.png

我们发现,ArrayList对象做add操作时似乎是将数据保存在了数组中,向上翻阅源码

852cae9936960764030a343e1c8265b8.png

原来ArrayList对象对于数据的保存是确实是放在了数组里,那么从这里我们至少可以了解到,对于ArrayList来说,最多保存的数据量也就是int数字的最大值。而由于保存的内容是放在数组里的,于是,对于ArrayList,保存的数据是有顺序性的(数组用标识来表示顺序)。

接着看源码的463行,add函数将传入的参数加入到了数组中,放入的位置是size++。那么size又代表什么呢,我们继续查看源码

f139effa88ff2edae066445be2809a2c.png

上面的注释已经很明确的告诉我们,size代表的是当前的arraylist对象的长度,由于int类型的默认值为0,所以,当我们第一次调用add函数,执行的代码实际上是

elementData[0] = e;

由于执行了size++,所以,当这一次add操作完成时,size的值由0 增长 为了1,那么下一次再执行add操作时,传入的参数就放到了数组的标识1的位置。

2.size();

e2ebfc53b540984e3cbf58afdafbc29f.png

根据上面的分析,我们很容易就可以知道,这个函数得到的结果是当前ArrayList对象中数据数组所保存的数据数量(不是数组长度)

了解了这些内容,那么其他的函数就比较好理解了。

3.isEmpty()

2561a3e6d5c4e29207edd2d9e62263bb.png

判断当前对象的数据量是否是0

4.indexOf(Object o)

58e59847ed3d3366acf24833113c16eb.png

通过正向遍历,获得指定值第一次出现的标识值

5.lastIndexOf(Object o)

968a29288973da665ae18f4be01d91d7.png

通过逆向遍历,获得指定值最后一次出现的标识值

6.contains(Object o)

9f880ca95962ca6e0c8e6cf1c610e235.png

调用indexof函数确定指定的值时否存在于当前数组中

7.get(int index)

bf842cee6952da2efc331404aceb6cae.png
282667c3eb11b7d2d865f91bedb32e78.png

rangeCheck函数用于确定传入的标识是在数组的允许标识范围内,如果没有满足,则会抛出异常,对于异常,在后续章节会为大家介绍。接着,调用elementData函数返回数组中指定标识的数据

8.remove(int index) / remove(Object o)

0ce221ec63b5934f7430abe54c7eb903.png

remove函数删除指定标识的数据/remove函数删除指定内容的数据

remove函数稍微复杂一些,首先验证了标识的正确性,接着将指定标识位置的数据暂存在oldValue变量中,接着通过系统提供的arraycopy函数将当前数组中从标识的位置开始,一直都尾部的数据进行重新覆盖,接着,size自减,并将数组的最后一位设置为null。

上图为各位演示ArrayList的使用示例

022892e0be60182d4417b7ec93e49f09.png

运行结果为

07f8b84b791c23d869c671b14175a5c7.png

ps:对于源码中的一些函数如果不能理解,可以尝试自己去找找资料,或者给 进击留言,有时间的时候会给大家回复的哈。

通过add和remove函数,我们了解到,ArrayList本身实现基于数组,而又由于数组本身的特性(定义长度后不可更改长度,只能重新声明),ArrayList在增加,删除时,系统资源开销会比较大,所以,如果在以后有需要频繁的增删操作的集合结构,应该尽量避免使用ArrayList。

以上就是ArrayList类中一些常用的函数,除了这些之外,还有很多没有介绍到的函数,大家可以自己去了解一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端网页广告无线翻滚_从小白到web前端工程师进阶之路 从0到1到更深

互联网的发展,让web前端技术发生了翻天覆地的变化,前端开发工程师可以让网页内容变得更加生动,为用户带来更好的体验。那么,武汉web前端培训哪个好?web前端好学吗?作为一个合格的Web前端工程师,…

判读一个对象不为空_ArrayList实现分析(一)——对象创建

ArrayList是java中最常用的集合类之一,它的内部实现是基于数组,因此ArryList可以根据索引实现随机访问。ArryList继承了AbstractList类,并且实现了List, RandomAccess, Cloneable接口。下面详细分析一下ArrayList的实现,下面的分析…

AngularJS与Angular的区别

指同一事物,版本的区别,叫法不同 Angular2.0之前的版本(1.x)叫做AngularJS 1.x的使用是引入AngularJS的js文件到网页。 2.0之后,就是完全不同了。 Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是…

网页控制台调用click()失败_C# 调用百度AI 人脸识别

一、设置登录百度云控制台,添加应用-添加人脸识别,查找,对比等。设置人脸识别应用记住API Key和Secret Key二、创建Demo程序1、使用Nuget安装 Baidu.AI 和 Newtonsoft.JsonNuget2、直接下载SDK https://ai.baidu.com/file/7D961BC013AB4AA790…

mysql查看服务器CPU和内存_怎么查看服务器的cpu和内存的硬件信息

可以按照如下方式进行操作:一、查看cpu总个数方法:1、首先执行top命令,如下图中内容所表示。2、在top命令的显示界面,按数字键1,即可查看到当前系统中的总cpu数,如下图中内容所表示。二、查看总内存的方法&…

极光推送指定用户推送_干货|SpringBoot集成极光推送完整实现代码(建议收藏)...

工作中经常会遇到服务器向App推送消息的需求,一般企业中选择用极光推送的比较多,在集成极光时发现极光的文档并不完整,网上的文章也很多不能直接使用,这里列出我在工作中集成极光的全部代码,只需要按照如下代码保证一次…

Babylon-AST初探-代码更新删除(Update Remove)

通过前两篇文章的介绍,大家已经了解了Create和Retrieve,我们接着介绍Update和 Remove操作。Update操作通常配合Create来完成。我们这篇文章主要介绍几个常用的NodePathAPI:replace、insert、remove。具体也可以看babel-handbook中的Manipulat…

编解码异常分析

前言 最近在做的项目,有H264解码的需求。部分H264文件解码播放后,显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…

js根据name获取value_js 函数的重载

js 函数的重载我们知道,很多编程语言都有函数的重载。所谓的重载,看定义:重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间&#xff…

存储过程循环遍历一个月的每一天的函数_JavaScript 循环:如何处理 async/await

同步循环很久以前我写的循环是这样的:后来 JavaScript 提供了很多新的特性,现在我们会更倾向于用下面这种写法:在开发过程可能会有这么一种需求,我们需要在循环中异步处理 item,那么可以怎么做呢?异步循环如…

Angular程序架构

component,组件是Angular应用的基本构建块,你可以把一个组件理解为一段带有业务逻辑和数据的html。组件下面可以有子组件,子组件下有孙子组件,像树一样。指令:允许你向html元素添加自定义行为。模块Ngmodule&#xff1…

易语言python1.1模块_易语言之编写模块与引入模块

本人并不精通易语言,只是对其进行一定了解后做一个简单的总结。直接新建一个易语言模块,然后添加子程序即可。子程序当然可以随意命名,实际上,易语言的子程序就和c语言的函数,java中的方法一样(实际上,java…

spring boot开发笔记——mybatis

概述 mybatis框架的优点,就不用多说了,今天这边干货主要讲mybatis的逆向工程,以及springboot的集成技巧,和分页的使用 因为在日常的开发中,当碰到特殊需求之类会手动写一下sql语句,大部分的时候完全可以用m…

Angular项目目录介绍

通过 ng new 项目名生成的项目 一级目录 Angular cli 工具生成的目录文件名不要随意修改,要不然会影响工具的使用。e2e:端到端的测试目录,用来做自动测试的。node_modules:Angular第三方包。src:应用源代码目录&#…

jvm内存模型_四种视角看JVM内存模型

1.JVM运行视角程序计数器Java虚拟机栈本地方法栈Java堆方法区1 .程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的行号指示器。这个计数器记录的是正在执行的虚拟机字节码指令的地址。此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何Ou…

Tomcat服务脚本

为什么80%的码农都做不了架构师?>>> #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # S…

oracle 取当前日期时间的前一天前一小时前一分钟前一秒

原文链接:http://wentao365.iteye.com/blog/779492 点击阅读原文 --------------------------------------------------------------------------- SELECT 当前时间 TITLE, TO_CHAR(SYSDATE, yyyy-mm-dd hh24:mi:ss) TIME FROM DUAL --当前时间 UNION ALL S…

mysql8事务级别_Mysql几种事务隔离级别

前言:之前对mysql的基础知识通过了几篇博客进行了一个详解,包括从数据库系统的原理以及最基本的操作使用,此篇博客将主要对mysql的事务级别进行实战分析1.什么是事务?事务是应用程序中一系列严密的操作,所有操作必须成…

控制台应用和空项目有什么区别_互联网小程序的应用以及APP的应用有什么区别及发展...

随时移动互联网进入的千家万户,互联网的手机应用程序也渐渐的在市场上流行起来了。今天主要跟大家谈一下互联网小程序的应用以及APP的应用有什么区别以及未来的发展趋。未来会流行什么手机应用或者APP应用,我带大家都为了解一下。下边先来了解一下小程序…

day19_java基础加强_动态代理+注解+类加载器

一、动态代理 1.1、代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一。        代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 …