List的遍历方式
对List的遍历方式做一个记录,一共三种,如下
三种方式的基本原理是第一种
第一种: 最原始也是最快的
for (int i = 0; i < list.size(); i++) {
System.out.printf("%5s", list.get(i));
}
第二种:增强for
循环,效率其次
for (String temp : list) {
System.out.printf("%5s", temp);
}
第三种:迭代器:最慢
Iterator<String> iterator = list.iterator()
while (iterator.hasNext()) {
System.out.printf("%5s", iterator.next())
}
ArrayList
的小记:
1.构造器:
public ArrayList();
public ArrayList(ICollection);
public ArrayList(int);
2.IsSynchronized
属性和ArrayList.Synchronized
方法
ArrayList
支持线程同步,IsSynchronized
属性表示当前的List
是否是线程安全的,如果不是线程安全的,那么在多线程访问的时候需要手动设置同步,如下:
ArrayList list = new ArrayList();
//...
lock( list.SyncRoot )
{
list.Add( “Add a Item” );
}
如果使用静态方法ArrayList.Synchronized
返回的实例,则本身就是线程安全的,不必再进行手动操作
3.Count
属性和Capacity
属性
Count
存储了当前ArrayList
的元素数量,是只读的
Capacity
是当前ArrayList
最多能包含的数量,当然使用过程中要注意实际数量不要超过Capcity
设置的值,否则报错
4.常用方法:
add 用于添加一个元素到当前列表的末尾
addRange
remove
removeAt
removeRange
insert
insertRange
clear
contains
trimSize
toArray
5.ArrayList
与数组的互相转化
第一种
ArrayList<Strin> List = new ArrayList<>();
String [] values = List.ToArray();
第二种
ArrayList<Strin> List = new ArrayList<>();
String [] values = new String [list.size()];
list.copyTo(values);
6.使用优化:
数组扩容
这是对ArrayList效率影响比较大的一个因素。
每 当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量 的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。
例1:比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:
16*2*2*2*2 = 256
四次的扩容才会满足最终的要求,那么如果一开始就以:
ArrayList List = new ArrayList( 210 );
的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。
例2:预计有30个元素而创建了一个ArrayList:
ArrayList List = new ArrayList(30);
在执行过程中,加入了31个元素,那么数组会扩充到60个元素的大小,而这时候不会有新的元素再增加进来,而且有没有调用TrimSize方法,那么就有1次扩容的操作,并且浪费了29个元素大小的空间。如果这时候,用:
ArrayList List = new ArrayList(40);
那么一切都解决了。
所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。
频繁的调用IndexOf、Contains等方法(Sort、BinarySearch等方
法经过优化,不在此列)引起的效率损失
首先,我们要明确一点,ArrayList是动态数组,它不包括通过Key或者Value快速访问 的算法,所以实际上调用IndexOf、Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来 的快,如果有这方面的要求,建议使用Hashtable或SortedList等键值对的集合。