zoukankan      html  css  js  c++  java
  • JavaSE--for each

    参考: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 }

  • 相关阅读:
    四个好看的CSS样式表格
    POJ 2255 Tree Recovery
    黑马程序猿_2014 7月 我使用多线程体验
    Dos命令将合并两个文本文件的内容
    栈和堆之间的差(他转身无数的文章)
    【Espruino】NO.12 加速度计演示
    MySQL进口.sql文件和常用命令
    typedef和define具体的具体差异
    muduo网络图书馆评测
    Web采矿技术
  • 原文地址:https://www.cnblogs.com/microcat/p/6569018.html
Copyright © 2011-2022 走看看