当前位置: 首页 > news >正文

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

有人说在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 leaksize = 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.lryc.cn/news/150510.html

相关文章:

  • 面试题 08.01. 三步问题
  • springboot添加SSL证书,支持https与http
  • 【AI】《动手学-深度学习-PyTorch版》笔记(二十):图像增强、微调
  • Vulnhub: Ragnar Lothbrok: 1靶机
  • Ubuntu 20.04 Server配置网络
  • jmeter 线程组
  • springboot集成logback
  • 【从互联网商业思维的角度分析商业模式在国内各大互联网产品的运用】
  • Leetcode394 字符串解码
  • git学习笔记 | 版本管理 - 分支管理
  • pytest---添加自定义命令行参数(pytest_addoption )
  • Flutter开发- iOS 问题CocoaPods not installed or not in valid state
  • leetcode 1207. 独一无二的出现次数
  • linux C编程 获取系统时间
  • Golang 中如何判断两个结构体相等
  • code 架构
  • Nuxt 菜鸟入门学习笔记五:CSS 样式
  • java企业工程管理系统源码之提高工程项目管理软件的效率
  • 蓝桥杯 2240. 买钢笔和铅笔的方案数c++解法
  • 中间件环境搭建配置过程解读
  • Pytest 自定义HOOK函数
  • VUE笔记(六)vue路由
  • nginx反向代理 负载均衡
  • hugging face inference API返回内容太短的问题
  • react中redux的详细使用以及持久化处理
  • 论文笔记: 循环神经网络进行速度模型反演 (未完)
  • 多维时序 | Matlab实现BiLSTM-Adaboost和BiLSTM多变量时间序列预测对比
  • excel绘制直方图
  • react-grid-layout 实现原理介绍
  • 集合框架-(Collection/Map)