参考:http://blog.csdn.net/yasi_xi/article/details/25482173
学习多线程的时候实例化线程数组而挖掘出来的一直以来的理解误区
之前一直以为for each 本质上和for循环以及迭代器没什么区别
1 package foreach; 2 3 public class ForeachDemo1 { 4 5 public static void main(String[] args) { 6 Object[] objs = new Test[5]; 7 int i = 0; 8 //for each的简洁使得我喜欢这种使用方式 9 for(Object obj : objs) { 10 obj = new Test(i + ""); 11 System.out.println(objs[i++]);//2 12 } 13 System.out.println(objs[2]);//1 14 } 15 16 } 17 18 class Test { 19 20 private String value; 21 22 public Test(String value) { 23 this.value = value; 24 } 25 26 public String getValue() { 27 return value; 28 } 29 30 public void setValue(String value) { 31 this.value = value; 32 } 33 34 @Override 35 public String toString() { 36 return "Test [value=" + value + "]"; 37 } 38 39 40 41 }
打印的结果使得我很是懵逼
后来查了下资料才知道for each内部的大概实现方式
有趣的是,这个砸到我头的苹果是这样的..
1 package foreach; 2 3 public class Apple1 { 4 5 public static void main(String[] args) { 6 Thread[] t1 = new T1[3]; 7 Thread[] t2 = new T2[2]; 8 9 for(Thread t : t1) { 10 t = new T2();//大概就是这样,原代码是生产者消费者交替打印而产生的线程无限等待 11 //然而这样做并没毛病 12 //-->等价于 13 //Thread t = t1[0] 14 //t = new T2() 15 //t.start() 16 //这当然没问题了 17 t.start(); 18 } 19 20 t1[0] = new T2(); 21 //但是这样的话 就抛异常了【当你试图将错误类型的对象存储到一个对象数组时抛出的异常】 22 //声明的空间和实际new的类型不一致 23 } 24 25 } 26 27 class T1 extends Thread { 28 29 //... 30 31 @Override 32 public void run() { 33 // TODO Auto-generated method stub 34 } 35 36 } 37 38 class T2 extends Thread { 39 40 //.. 41 42 @Override 43 public void run() { 44 // TODO Auto-generated method stub 45 } 46 47 }
验证:
1 package foreach; 2 3 public class Demo2 { 4 5 public static void main(String[] args) { 6 String[] strs = new String[3]; 7 8 for(String s : strs) { 9 s = "1"; 10 } 11 12 System.out.println(strs[0]); 13 } 14 15 }
时间: 2024-10-12 16:53:02