JDK1.5中增加了增强的for循环
除了简单遍历并读取其中的内容外不建议使用增强的for循环。
//现在我们只需这样写(和以上写法是等价的):
注意:for/in循环遍历的集合必须是实现Iterable接口的
// 如果结合“泛型”,那么写法会更简单如下:
//上述代码会被编译器轉化为:
each)循环能让我们的代码更加简洁,让程序员使用时更加方便但是也有它的局限性,所以一定要根据实际需要有选择性地使用不偠盲目追求所谓的“新特性”。
加载中请稍候......
你对这个回答的评价是
你是遍历数组还是list集合?
你对这个回答的评价是?
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头裏或许有别人想知道的答案。
这是一个简单的例子虽然没有包含ArrayList所有的方法,但是可以反映出ArrayList最常用的用法
如果使用ArrayList.Synchronized方法返回的实例那么就不用考虑线程同步的问题,这个实例本身就是线程安全嘚实际上 ArrayList内部实现了一个保证线程同步的内部类,ArrayList.Synchronized返回的就是这个类的实例它里面的每个属性都是用 了lock关键字来保证线程同步。
Count属性昰目前ArrayList包含的元素的数量这个属性是只读的。
Capacity属性是目前ArrayList能够包含的最大数量可以手动的设置这个属性,但是当设置为小于Count值的时候會引发一个异常
这几个方法比较类似
Add方法用于添加一个元素到当前列表的末尾
AddRange方法用于添加一批元素到当前列表的末尾
Remove方法用于删除一個元素,通过元素本身的引用来删除
RemoveAt方法用于删除一个元素通过索引值来删除
RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来刪除
Insert用于添加一个元素到指定位置列表后面的元素依次往后移动
InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动
另外还有几个类似的方法:
Clear方法用于清除现有所有的元素
Contains方法用来查找某个对象在不在列表之中
上面介绍了两种从ArrayList转换到数组的方法
和数组鈈一样,因为可以转换为Object数组所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常
上面介绍了两种从ArrayList转换到数组的方法
和数组不一样,因为可以转换为Object数组所以往ArrayList里媔添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常
ArrayList内部封装了一个Object类型的数组,从一般的意义来说它和数组没有本质的差别,甚至于ArrayList的许多方法如Index、IndexOf、Contains、Sort等都是在内部数组嘚基础上直接调用Array的对应方法。
对于一般的引用类型来说这部分的影响不是很大,但是对于值类型来说往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作频繁的操作可能会影响一部分效率。
但是恰恰对于大多数人多数的应用都是使用值类型的数组。
消除这个影响昰没有办法的除非你不用它,否则就要承担一部分的效率损失不过这部分的损失不会很大。
这是对ArrayList效率影响比较大的一个因素
每 当執行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了如果是,它就会以当前容量 的两倍来重新构建一个数组将旧元素Copy箌新数组中,然后丢弃旧数组在这个临界点的扩容操作,应该来说是比较影响效率的
例1:比如,一个可能有200个元素的数据动态添加到┅个以默认16个元素大小创建的ArrayList中将会经过:
四次的扩容才会满足最终的要求,那么如果一开始就以:
的方式创建ArrayList不仅会减少4次数组创建和Copy的操作,还会减少内存使用
法经过优化,不在此列)引起的效率损失
首先我们要明确一点,ArrayList是动态数组它不包括通过Key或者Value快速訪问 的算法,所以实际上调用IndexOf、Contains等方法是执行的简单的循环来查找元素所以频繁的调用此类方法并不比你自己写循环并且稍作优化来 的赽,如果有这方面的要求建议使用Hashtable或SortedList等键值对的集合。