for
循环和foreach
循环的主要区别是什么?
在哪些情况下我们可以使用for
而不能使用foreach
,反之亦然。
能否用一个简单的程序来演示?
它们两个看起来都一样。我分不清它们。
当您事先确定需要循环运行的次数时,for循环非常有用。例如,如果您需要针对每周的每一天执行某个过程,那么您知道您需要7次循环。
foreach循环是当您想要重复处理集合或数组的所有元素时使用的,但并不重要循环运行的次数具体是多少。例如,您正在为用户格式化一份收藏书籍的列表。每个用户可能拥有不同数量的书籍,或者没有书籍,我们并不关心具体有多少本书,我们只想让循环处理它们所有。
public class ConcurrentModification {
public static void main(String[] args) {
List<String> str = new ArrayList<>();
for(int i=0; i<1000; i++){
str.add(String.valueOf(i));
}
/**
* this for loop is fail-safe. It goes into infinite loop but does not fail.
*/
for(int i=0; i<str.size(); i++){
System.out.println(str.get(i));
str.add(i+ " " + "10");
}
/**
* throws ConcurrentModificationexception
for(String st: str){
System.out.println(st);
str.add("10");
}
*/
/* throws ConcurrentModificationException
Iterator<String> itr = str.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
str.add("10");
}*/
}
}
就性能而言,我更喜欢使用FOR循环。当您处理更多的项目时,FOREACH会慢一些。
如果您对实例执行更多的业务逻辑,则FOREACH的性能更快。
演示: 我创建了一个包含10000000个实例的列表,并使用FOR和FOREACH进行循环。
循环所需时间:
以下是示例代码。
class Program
{
static void Main(string[] args)
{
List<TestClass> lst = new List<TestClass>();
for (int i = 1; i <= 10000000; i++)
{
TestClass obj = new TestClass() {
ID = i,
Name = "Name" + i.ToString()
};
lst.Add(obj);
}
DateTime start = DateTime.Now;
foreach (var obj in lst)
{
//obj.ID = obj.ID + 1;
//obj.Name = obj.Name + "1";
}
DateTime end = DateTime.Now;
var first = end.Subtract(start).TotalMilliseconds;
start = DateTime.Now;
for (int j = 0; j<lst.Count;j++)
{
//lst[j].ID = lst[j].ID + 1;
//lst[j].Name = lst[j].Name + "1";
}
end = DateTime.Now;
var second = end.Subtract(start).TotalMilliseconds;
}
}
public class TestClass
{
public long ID { get; set; }
public string Name { get; set; }
}
如果我取消循环内的代码: 那么,循环所花费的时间为:
结论
如果您需要使用更多实例的业务逻辑,则建议使用FOREACH。
如果您不需要使用太多实例的业务逻辑,则建议使用FOR。
int[] test = { 0, 1, 2, 3, ...};
当你有一个二维数组时,你可以使用for循环。
int[][] test = {{1,2,3,4},
{5,2,6,5,8}};
for
和/或 foreach
来处理这两种情况。 - James Thorpefor和foreach之间的简单区别
for循环是使用值进行操作的。它必须有条件、递增和初始化。你必须知道“循环重复了多少次”。
foreach循环是使用对象和枚举器进行操作的。不需要知道循环重复了多少次。
foreach 语法简单快捷。 for 语法稍微复杂,但也更加灵活。
当迭代集合中的所有项时,foreach 很有用。当迭代整个或子集合中的项时,for 很有用。
foreach 迭代 变量 提供每个集合项,是只读的,因此我们无法在迭代时修改这些项。使用 for 语法,我们可以根据需要修改这些项。
总之- 使用 foreach 快速迭代集合中的所有项。使用 for 迭代集合的子集或在迭代时修改项。
foreach 相关的一个重要事项是,在循环体中不能更新(或分配新值)foreach 迭代变量。
例如:
List<string> myStrlist = new List<string>() { "Sachin", "Ganguly", "Dravid" };
foreach(string item in myStrlist)
{
item += " cricket"; // ***Not Possible***
}
{ "Sachin cricket", "Ganguly cricket", "Dravid cricket" }
。
你不能够添加或移除列表中的任何元素。在循环内调用 myStrlist.Add("Another");
会引发异常。 - 0wl
for
(例如,如果你想向后迭代集合或只想迭代它的每第二个元素),如果迭代顺序不重要,则使用foreach
。(顺便说一句,在需要迭代顺序的情况下也可以使用foreach
- 在这种情况下,需要重新构造集合。但这会降低程序性能) - Agnius Vasiliauskas