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