前言

有人说在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()方法吧。

Java for循环每次都通过list.size()和 string.length()获取大小是否消耗性能?的更多相关文章

  1. 关于vector.size()和string.length() 的返回类型 size_type

    今天写循环的时候碰到一个问题,发现:string.length()返回的类型是size_type.它是unsigned 类型.string::size_type它在不同的机器上,长度是可以不同的,并非 ...

  2. 从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧

    最近工作中要查看一下string的长度,然后忘了是哪个函数,所以去网上搜了一搜,决定把网上学的和其他的一些有关长度的东西在这里汇总一下, 然后就有了此帖. string 是从c语言的char数组的概念 ...

  3. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  4. JAVA中循环删除list中元素的方法总结【转】

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  5. Java for-each循环解惑

    Java for-each循环解惑 2014/04/24 | 分类: 技术之外 | 0 条评论 | 标签: JAVA 分享到:21 本文由 ImportNew - liqing 翻译自 javarev ...

  6. JAVA中循环删除list中元素

    文章来源: https://www.cnblogs.com/pcheng/p/5336903.html JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环) ...

  7. JAVA中循环删除list中元素的方法总结(同上篇)

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  8. java _循环练习和数组练习

    练习 1.输出所有的水仙花数,所谓水仙花数是指一个数3位数,其每位数字立方和等于其本身,如153 = 1*1*1 + 3*3*3 + 5*5*5(很经典的题目) 分析: 通过观察发现,本题目要实现打印 ...

  9. JAVA中循环遍历list有三种方式

    转自:https://blog.csdn.net/changjizhi1212/article/details/81036509JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常 ...

随机推荐

  1. Java多线程——查看线程堆栈信息

    Java多线程——查看线程堆栈信息 摘要:本文主要介绍了查看线程堆栈信息的方法. 使用Thread类的getAllStackTraces()方法 方法定义 可以看到getAllStackTraces( ...

  2. Linux下java验证码不显示:Could not initialize class sun.awt.X11FontManager

    一.问题 javaweb项目,登录的时候有个图片验证码的功能.在Windows本地测试能够正常显示,部署到Linux上就不行了.报错如下: org.springframework.web.util.N ...

  3. 图书推荐《图解HTTP》

    作品简介 本书对互联网基盘——HTTP协议进行了全面系统的介绍.作者由HTTP协议的发展历史娓娓道来,严谨细致地剖析了HTTP协议的结构,列举诸多常见通信场景及实战案例,最后延伸到Web安全.最新技术 ...

  4. pwrite

    写入起始地址的偏移量,写入地址=文件开始+offset 注意:执行后,文件偏移指针不变 ssize_t pread(int fd, void *buf, size_t count, off_t off ...

  5. Jmeter-While控制器

    Jmeter-While控制器 背景: 用作循环的控制器里, 最常用的就’循环控制器’和’While控制器’. 循环控制器仅能定义循环次数(永远和自定义次数). 缺乏判断能力.While控制器正好弥补 ...

  6. java多线程执行时主线程的等待

    1.通过thread.join()方式,注意:如果有多个子线程,需要将全部的线程先start,然后再join.代码示例如下: public class Main {     public static ...

  7. for循环,数字、字符串和列表内置方法

    目录 控制流程之for循环 基本语法 for+break for+continue for+else for循环打印lodaing 数字类型内置方法 整型 int 浮点型 float 字符串内置方法 ...

  8. Mybatis-plus使用分页进行分页查询

    首先先配置配置文件 @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginat ...

  9. 201871010136-赵艳强《面向对象程序设计(java)》第六,七周学习总结

            201871010136-赵艳强<面向对象程序设计(java)>第六七周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://w ...

  10. socket服务

    1.socket_server import socket import threading server = socket.socket(socket.AF_INET, socket.SOCK_ST ...