黑马程序员技术交流社区

标题: 关于交通灯管理系统Road的代码问题 [打印本页]

作者: 姜胜凯    时间: 2014-1-12 19:37
标题: 关于交通灯管理系统Road的代码问题
本帖最后由 姜胜凯 于 2014-1-12 19:41 编辑

package com.itheima.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Road {
        private List<String> cars = new ArrayList<String>();
        private String name=null;
        public Road(String name){
                this.name=name;        
                ExecutorService pool=Executors.newSingleThreadExecutor();
                pool.execute(new Runnable(){
                        public void run(){
                                for(int x=1;x<500;x++){
                                        try {
                                                Thread.sleep((new Random().nextInt(10)+1)*1000);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        cars.add(Road.this.name+"_第"+x+"汽车");
                                //        System.out.println(Road.this.name+"_第"+x+"汽车");
                                }
                        }
                });
               
                ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(new Runnable(){
                        public void run(){
                ****        if(cars.size()>0){
                                        boolean lamp2green=Lamp.valueOf(Road.this.name).isGreen();
                                        if(lamp2green)
                                        System.out.println(cars.remove(0)+"开过去了");
                                }                                
                        }
                },
                                1,
                                1,
                                TimeUnit.SECONDS);
               
        }
}

****处用于判断路上是否有车的语句是否可以换成(cars!=null)。
      集合cars (cars!=null)和(cars>0)的区别~
      换上就会出错,求高手解答下为什么。
作者: 王磊    时间: 2014-1-16 13:47
cars != null 并不代表其指向集合中一定包含元素.当cars直接初始化并且没有add元素进去,则执行到cars.remove(0)会报空指针.
cars.size()是实例调用方法,来判断集合中是否有元素,只有元素个数大于0,才能执行remove(0).

两者概念不同.
作者: 还记得梦想吗    时间: 2014-1-16 16:30
我的这里运行并没有出错,可能是因为集合里面一直有对象吧!集合对象为null时并不指向任何对象。而.size()则是指集合里面的对象的个数变成了0
作者: 姜胜凯    时间: 2014-1-21 12:56
王磊 发表于 2014-1-16 13:47
cars != null 并不代表其指向集合中一定包含元素.当cars直接初始化并且没有add元素进去,则执行到cars.remov ...

谢谢了。。受教~~~
作者: 宋星    时间: 2014-1-21 20:53

  1. /*
  2. 验证:集合!=null和集合.size()!=0,是否是相同的意思。
  3. 结论:集合!=null和集合.size()!=0不是一个意思。集合!=null,只是说明这个集合对象已经存在,
  4. 但并不等于说集合.size()==0,因为这个集合中可能没有装元素。null是对于这个集合是否存在讲的,
  5. size()==0是对于集合里面的是否有元素讲的。
  6. 也就是说集合!=null,但集合.size()可以==0。
  7. */
  8. import java.util.*;

  9. class TestNullAndSize
  10. {
  11.         public static void main(String[] args)
  12.         {
  13.                 List<String> list1=null;
  14.                 List<String> list2=new ArrayList<String>();
  15.                 if(list1==null)
  16.                 {
  17.                         System.out.println("null异常");               
  18.                         //打印出来了,说明list1 这个对象都不存在,还没创建出来,所以集合list1为null
  19.                 }
  20.                 if(list2==null)
  21.                 {
  22.                         System.out.println("集合为null");
  23.                         // 没打印出来,说明list2这个对象存在,所以集合list2不为null
  24.                 }
  25.                 if(list2!=null&&list2.size()==0)
  26.                 {
  27.                         System.out.println("集合中没有元素,但集合不是null");
  28.                         //打印出来了,说明list2不为null,只是集合里没有元素,长度为0。再结合上面的,说明list2!=null和list2.size()!=0不是一回事。
  29.                 }
  30.         }
  31. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2