看老大的代码需要取list里面每个元素的时候,都是
Iterator it = list.iterator();
while (it.hasNext()) {
personnelID= (String) it.next();
}这样比我直接写for(int i=0;i<list.size();i++){
personnelId=(String)list.get(i);}
有什么优点吗?
Iterator it = list.iterator();
while (it.hasNext()) {
personnelID= (String) it.next();
}这样比我直接写for(int i=0;i<list.size();i++){
personnelId=(String)list.get(i);}
有什么优点吗?
楼主【crowgns】截止到2008-07-22 16:29:52的历史汇总数据(不包括此帖):
发帖的总数量:25 发帖的总分数:1220 每贴平均分数:48
回帖的总数量:202 得分贴总数量:92 回帖的得分率:45%
结贴的总数量:25 结贴的总分数:1220
无满意结贴数:2 无满意结贴分:56
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:8.00 % 无满意结分率:4.59 %
敬礼!
for(String str : list){
}
好像不对吧?我觉得这两种方式各有各得好处,当你在循环内要使用索引的时候,for就比iterator好一些,否则iterator还要在声明一个变量,然后在递增。
比如以后你的代码改了,list不在是list接口了,而是set接口(没有get(i)方法),
这时你的代码改动就大了,for里面全部要重写,而你老大的代码几乎不用任何修改,当然这也牺牲了部分性能
原因,我说了,然后楼上也有兄弟补充了!
有兴趣,你可以看看jvm相关的!
这位仁兄你说的不对,做了个简单的测试如下:----------测试ArrayList-----------
iterator操作:80ms
get操作:40ms
----------测试LinkedList-----------
iterator操作:110ms
get操作:140ms结论:ArrayList随机访问更快,LinkedList顺序访问更快
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;/**
* IteratorTest
* @author SageZk
*/
public class IteratorTest { public static long testForloops(List<String> list) {
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start = System.nanoTime();
for (int i = list.size() - 1; i >= 0; --i) {
le = list.get(i);
}
end = System.nanoTime();
return end - start;
} public static long testIterator(List<String> list) {
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start = System.nanoTime();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
le = it.next();
}
end = System.nanoTime();
return end - start;
} public static void main(String[] args) {
//测试列表长度
final int LEN = 10000; //初始化测试用数据
List<String> arraylist = new ArrayList<String>();
List<String> linkedlist = new LinkedList<String>();
for (int i = 0; i < LEN; ++i) {
String s = Integer.toString(i, 2);
arraylist.add(s);
linkedlist.add(s);
} //打印测试结果
final String FORMAT = "%1$-16s%2$-16s%3$16d\n";
System.out.println("List\t\tType\t\tTime(nanoseconds)");
System.out.println("-------------------------------------------------");
System.out.printf(FORMAT, "ArrayList", "for", testForloops(arraylist));
System.out.printf(FORMAT, "ArrayList", "Iterator", testIterator(arraylist));
System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
System.out.printf(FORMAT, "LinkedList", "Iterator", testIterator(linkedlist));
}}以下是 3 组测试结果:[code=BatchFile]List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1189258
ArrayList Iterator 2365594
LinkedList for 152396254
LinkedList Iterator 2340801List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1235701
ArrayList Iterator 4249982
LinkedList for 149825606
LinkedList Iterator 2525531List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1198267
ArrayList Iterator 2584617
LinkedList for 150382451
LinkedList Iterator 2347994
[/code]
比如楼主例子中,如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 TreeSet 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。
试了下,
管·
ArrayList,顾名思义,以数组方式实现,便与随机访问,查慢改快。foreach内部实现原理也是迭代,但不方便单个数据的修改。------------
c,c++,数据结构没及格学生留。
应该是:
LinkedList,是以链表为基础实现,链表便于顺序访问。在操作的时候,查慢改快。ArrayList,顾名思义,以数组方式实现,便与随机访问, 查快改慢。
List<String> arraylist = new ArrayList<String>();
for (String str:arraylist) {
System.out.println(str);
}这做到了最好的封装性.
如:.....
Collection c = new Hashset();
c.add(new Name("fff1", "llll"));
c.add(new Name("fff1", "llll"));
c.add(new Name("fff1", "llll"));for(Iterator<Name> i=c.iterator(); i.hasNext(); ) {
Name name = i.next();
if(name.getFirstName().length() < 3) {
i.remove();
/*
而不能是
c.remove(name);
只能由Iterator来调用对象,而不能是其他。
*/
}
}
List <String> list = new ArrayList <String>();
for (String s:list) {
System.out.println(s);
} Iterator it = list.iterator(); 这样的用法一般在jdk 1.5以前使用。
难道就是少了两行代码
LinkedList用Iterator还有System.nanoTime();
LinkedList当数据很多的时候你用get试试看,鄙视
但是当linklist元素很多又没有索引的情况下使用linklist是不合理的。因为调用linklist.remove(Object)是很慢的,最坏的在m-1次。如果在有索引可用的情况下使用linklist.remove(int):它是先判断要删除的索引下标在链表的前半、后半部分,如果在前半部就从链表的前面开始查找,在后半部分则从后面开始查找。