Java for循环每次都通过list.size()和 string.length()获取大小性能

news2024/11/24 4:07:13

有人说在for循环之前用一个局部变量先获取到list.size()、str.length(),然后在for循环的判断条件里通过这个局部变量替换list.size()、str.length()会节省数据计算的时间。事实真的是这样吗?下面就为大家解答这个问题。

说明:此文章针对Android SDK 进行说明。
List.size()

首先我们看一下List接口,我们知道.size()方法是List接口的一个方法,返回一个int类型的值。

public interface List<E> extends Collection<E> {
    //省略部分代码...
    
    /**
     * Returns the number of elements in this {@code List}.
     *
     * @return the number of elements in this {@code List}.
     */
    public int size();
    
    //省略部分代码...
}



接口中的方法都是没有具体实现的,我们下面看一下List的实现类ArrayList(LinkList也一样,这里讲ArrayList)。我们先看下ArrayList类中的size()方法是如何实现的:
 

public class ArrayList<E> extends AbstractList<E> implements Cloneable, Serializable, RandomAccess {

    //省略部分代码...
    /**
     * Returns the number of elements in this {@code ArrayList}.
     *
     * @return the number of elements in this {@code ArrayList}.
     */
    @Override public int size() {
        return size;
    }
    //省略部分代码...
}

复制代码



我们看到ArrayList里的size()方法直接return了一个size,通过查看发现size是ArrayList类中的一个int类型的成员变量,代表list结合中的元素数量。
 

    /**
     * The number of elements in this list.
     */
    int size;



通过跟踪size变量发现在ArrayList类中的add,remove方法中都会动态改变size的大小。
 

复制代码

 /**
     * Adds the specified object at the end of this {@code ArrayList}.
     *
     * @param object
     *            the object to add.
     * @return always true
     */
    @Override public boolean add(E object) {
        Object[] a = array;
        int s = size;
        if (s == a.length) {
            Object[] newArray = new Object[s +
                    (s < (MIN_CAPACITY_INCREMENT / 2) ?
                     MIN_CAPACITY_INCREMENT : s >> 1)];
            System.arraycopy(a, 0, newArray, 0, s);
            array = a = newArray;
        }
        a[s] = object;
        size = s + 1; // 添加元素size增加
        modCount++;
        return true;
    }
...
    /**
     * Removes the object at the specified location from this list.
     *
     * @param index
     *            the index of the object to remove.
     * @return the removed object.
     * @throws IndexOutOfBoundsException
     *             when {@code location < 0 || location >= size()}
     */
    @Override public E remove(int index) {
        Object[] a = array;
        int s = size;
        if (index >= s) {
            throwIndexOutOfBoundsException(index, s);
        }
        @SuppressWarnings("unchecked") E result = (E) a[index];
        System.arraycopy(a, index + 1, a, index, --s - index); //删除元素 size--
        a[s] = null;  // Prevent memory leak
        size = s;
        modCount++;
        return result;
    }

复制代码



通过上述代码我们知道通过ArrayList中的.size()方法获取集合长度,会直接返回一个集合元素数量的变量值,而不会每次调用size()方法都重新计算下集合的元素数量再返回。下面我们在看下String.length()。
String.Length()

我们看下java.lang包下得String类,首先找到String类中的.length()方法:

复制代码

/**
 * An immutable sequence of UTF-16 {@code char}s.
 * See {@link Character} for details about the relationship between {@code char} and
 * Unicode code points.
 *
 * @see StringBuffer
 * @see StringBuilder
 * @see Charset
 * @since 1.0
 */
public final class String implements Serializable, Comparable<String>, CharSequence {
    //省略部分代码...
    
     private final int count;

    //省略部分代码...
    
    /**
     * Returns the number of {@code char}s in this string. If this string contains surrogate pairs,
     * this is not the same as the number of code points.
     */
    public int length() {
        return count;
    }
    
    //省略部分代码...
}

复制代码



我们发现跟ArrayList中的size()方法一样,返回了一个int类型的成员变量count。这个count是怎么赋值的我也不清楚,有兴趣的可以去研究一下。

#总结
综上所述,我们就可以知道List.size()和String.length()方法都是直接返回一个int类型变量值,而不会花费时间再去计算大小后返回,所以放心的去使用size()和length()方法吧。

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

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

相关文章

打造成功的砍价营销大解析,销量飙升

砍价活动是吸引顾客的一种有效方式&#xff0c;可以帮助提高销量和提升品牌知名度。在乔拓云平台上&#xff0c;我们提供了一套简单易用的工具&#xff0c;让您能够轻松地制作一个成功的砍价活动。下面&#xff0c;我将详细介绍具体步骤&#xff0c;让您能够轻松上手。 第一步&…

港联证券|4%!央行宣布:降准!新股大涨138%,再现触发临停!

煤炭领涨两市&#xff0c;多股有望继续高份额分红。 沪指早间冲高后有所回落&#xff0c;上证50盘中一度涨超1%&#xff0c;保险、银行等大金融板块拉升。食品、乳业、白酒、零售等大消费板块全线拉升&#xff0c;半导体芯片股走低&#xff0c;泰凌微跌超10%&#xff0c;寒武纪…

8个神奇的UI设计工具,小白也可轻松上手

随着设计工作的不断发展&#xff0c;市面上好用的设计工具也丰富起来&#xff0c;今天本文共整理了8个好用的设计工具&#xff0c;可以充分满足设计师对设计工具使用的需求&#xff0c;接下来就一起来看看吧&#xff01; 1、即时设计 即时设计是一个面向个人设计师和中小型设…

考前冲刺上岸浙工商MBA的备考经验分享

2023年对于许多人来说都是不平凡的一年&#xff0c;历经三年的抗争&#xff0c;我们终于成功结束了疫情。而我也很幸运的被浙工商MBA项目录取&#xff0c;即将开始全新的学习生活。身为一名已在职工作6年的人&#xff0c;能够重回校园真是一种特别令人激动的体验。今天&#xf…

极致内卷的中国电商路在何方?

2023年上半年最大的价值在于终于找到了确定性&#xff1a;1&#xff0c;消费仍然在增长是确定的&#xff0c;只是增速不再那么高&#xff1b;2&#xff0c;必须从“流量”转向做“留量”是确定的&#xff0c;无论是互联网还是传统消费领域&#xff0c;所有企业都在强调做单客运…

游戏发行商能够提供什么服务?

游戏发行商可以为游戏开发者提供广泛的服务&#xff0c;以帮助他们将游戏成功地引入市场并取得更好的业绩。以下是游戏发行商可能提供的一些服务&#xff1a; 市场营销和宣传&#xff1a;发行商通常具有丰富的市场营销经验&#xff0c;可以制定并执行有效的宣传和营销策略。他们…

硬盘数据恢复- 硬盘中文件打开报错的数据恢复案例

硬盘数据恢复环境&故障情况&#xff1a; 某单位重要数据在一台WINDOWS操作系统的PC机上通过网络共享给公司员工使用。这台PC同时也连接着打印机提供打印服务&#xff0c;很多员工直接将文件拷贝到这台PC上进行打印。该PC机上只有一块500G磁盘。 该PC的F盘分区所有类型文件突…

Effetive STL | 条款2 : 小心对“容器无关代码”的幻想

Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想 文章目录 Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想STL 容器特点推行自己的容器容器能力的交集 封装Method1: typedefMethod2: class>>>>> 欢迎关注公众号【三戒纪元】…

大数据学习:kafka-producer源码分析

kafka-producer源码分析 kafka-1.0.1源码下载地址 一.kafka发送示例 /*** Created by XiChuan on 2021/6/7.*/ public class ProducerTest {public static void main(String[] args) throws Exception {KafkaProducer<String, String> producer createProducer();JSO…

企业为什么需要IM “定制化”?

企业内外部的信息交流作为一种刚需&#xff0c;证明了企业级 IM 市场稳定可靠且前景十足的商业价值。不过&#xff0c;标准化的企业 IM 产品由于定制化能力不足&#xff0c;容易形成封闭的产品生态&#xff0c;对于企业管理者的吸引力正逐渐减弱。 WorkPlus作为一个企业数字化…

电子科大软件系统架构设计——系统分析与设计概述(含课堂作业、练习答案)

系统分析与设计概述 信息系统概述 what 信息系统是一种能够完成对业务数据进行采集、转换、加工、计算、分析、传输、维护等信息处理&#xff0c;并能就某个方面问题给用户提供信息服务的计算机应用系统。 组成 信息化基础设施&#xff08;计算机、计算机网络、服务器、系统…

git文件夹内容详解

.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹&#xff0c;包含了Git仓库的所有相关信息。如下是.git文件夹中常见的一些内容及其作用&#xff1a; HEAD&#xff1a;指向当前所在的分支&#xff08;或者是一个特定的提交&#xff09;。 branches&#xff1a;存储…

SoftwareTest1 - 打破你对软件测试的偏见

软件测试答疑篇 一 . 什么是软件测试二 . 软件测试和软件开发的区别2.1 难易程度2.2 工作环境2.3 薪水("钱"景)2.4 繁忙程度2.5 测试和研发中调试的区别 三 . 软件测试岗位四 . 软件测试人员应该具备的素质4.1 综合能力4.2 优秀的测试用例设计能力4.3 掌握自动化测试…

ShardingSphere——柔性事务SEATA原理

摘要 Apache ShardingSphere集成了 SEATA 作为柔性事务的使用方案&#xff0c;本文主要介绍其实现ShardingSphere中柔性事务SEATA原理原理。帮助你更好的理解ShardingSphere原理。同时帮助大家更好的使用柔性事务SEATA原理。 一、Seata柔性事务 Apache ShardingSphere 集成了…

合并区间【贪心算法】

合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 class Solution {public int[][] merge(int[…

uniapp 配置并使用 VueX

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 VueX 1、创建需要的文件 右键点击 根目录【我的是 uni-shop】&#xff0c;然后新建 目录&a…

ICCV 2023 | 利用双重聚合的Transformer进行图像超分辨率

导读 本文提出一种同时利用图像空间和通道特征的 Transformer 模型&#xff0c;DAT&#xff08;Dual Aggregation Transformer&#xff09;&#xff0c;用于图像超分辨&#xff08;Super-Resolution&#xff0c;SR&#xff09;任务。DAT 以块间和块内的双重方式&#xff0c;在空…

轻松管理不同类型的文件,高效将文件按类型进行移动归类

如果你经常需要处理不同类型的文件素材&#xff0c;例如图片、音频、视频等&#xff0c;那么你一定知道这是一项繁琐的任务。为了帮助你快速整理这些文件&#xff0c;我们推出了一款强大的文件管理工具&#xff0c;让你能够轻松地将不同类型的文件素材归类到不同文件夹里单独保…

功率信号源的用途和作用有哪些

功率信号源是一种重要的电子设备&#xff0c;用于生成具有特定功率水平、波形和频率的电压或电流信号。它在各种应用中发挥着关键作用。下面介绍功率信号源的主要用途和作用&#xff1a; 电路测试和调试&#xff1a;功率信号源被广泛应用于电路测试和调试过程中。它可以提供不同…

SAP PP之定义活动/作业类型(Activity Type)

文章目录 前言 一、作业是什么 二、使用步骤 1.单独创建 2.创建组 注意点 前言 创建活动类型具有以下先决条件&#xff1a; 控制范围已创建并分配给公司代码。已创建成本要素类别为43的次要成本要素。 一、作业是什么 SAP活动类型是在成本范围的成本中心中产生的活动的分类。…