for循环中代码效率求解

姜小白- 2014-11-11 10:28:38
方式一:

Staff staff = null;
String telNo = null;
for(String staffId : staffIds) {
// 根据staffId 查询staff 信息
staff = staffServiceI.getStaffById(staffId);
telNo = staff.getMobilePhone();
if (null != telNo) {
telNos.add(telNo);
}
}


方式二:

Staff staff = null;
for(String staffId : staffIds) {
// 根据staffId 查询staff 信息
staff = staffServiceI.getStaffById(staffId);
if (null != staff.getMobilePhone()) {
telNos.add(staff.getMobilePhone());
}
}


请问这两种方式,代码在执行效率上有什么区别,哪种能好一些,为什么?
...全文
332 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghx287524027 2014-11-12
  • 打赏
  • 举报
回复
从内存机制的角度考虑,方式二的性能应该优于方式一,但正如3楼的测试,在数据量不可观的情况下,两者的差别很小
fengzhw 2014-11-12
  • 打赏
  • 举报
回复
把telNo设置成局部变量,那么对telNo的赋值是可以由编译器优化掉的。 而对getMobilePhone()的两次调用,则成为效率高低的关键。 从现在这个例子看,二者差异应该不大,都没有什么特别复杂的操作。 能想到多种不同的做法,并通过测试做出比较,就是好的程序员。
chaobin05240108 2014-11-11
  • 打赏
  • 举报
回复
方式二 稍微快一点,不用赋值了,直接取值比较,少了一次引用,实际上字符串的地址是相同的。
shixitong 2014-11-11
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 14-11-11.
 */
public class Test4 {

    private List<Staff> staffList = new ArrayList<Staff>();
    public static void main(String args[]){

        Test4 test = new Test4();
        List<String> telNos = new ArrayList<String>();
        String[] staffIds =test.initStaffArray(100);
           long l1=System.currentTimeMillis();
        Staff staff = null;
        String telNo = null;
        for(String staffId : staffIds) {
            // 根据staffId 查询staff 信息
            staff = test.getStaffById(staffId);
            if(staff!=null){
                telNo = staff.getMobilePhone();
            }
            if (null != telNo) {
                telNos.add(telNo);
            }
        }
        long l2=System.currentTimeMillis();
        System.out.println("耗时:"+(l2-l1));
     /* long l3=System.currentTimeMillis();

       Staff staff = null;
        for(String staffId : staffIds) {
            // 根据staffId 查询staff 信息
            staff = test.getStaffById(staffId);
            if (null != staff.getMobilePhone()) {
                telNos.add(staff.getMobilePhone());
            }
        }
        long l4=System.currentTimeMillis();
        System.out.println("耗时:"+(l4-l3));*/
        System.out.println(telNos);
    }

    public Staff getStaffById(String id){
        for(Staff staff1:staffList){
            String tempid=staff1.getId();
            if(tempid.equals(id)){
                return staff1;
            }
        }
        return null;
    }

    public  String[] initStaffArray(int length){
        String[] staffIds = new String[length];
        for(int i=0;i<length;i++){
            staffIds[i]=String.valueOf(i+1);
            staffList.add(new Staff(staffIds[i],"name"+staffIds[i]));
        }
        return staffIds;

    }
}



class Staff{

    Staff(){

    }

    Staff(String id,String mobilePhone){
        this.id=id;
        this.mobilePhone=mobilePhone;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String id;

    private String mobilePhone;

    public String getMobilePhone() {
        return mobilePhone;
    }

    public void setMobilePhone(String mobilePhone) {
        this.mobilePhone = mobilePhone;
    }
}
100以内没有差别,1000以上才有稍微差别
S117 2014-11-11
  • 打赏
  • 举报
回复
方式二貌似能快点,少了一步更新telNo引用的步骤,不过也不好说,还是实际测试下为好
tony4geek 2014-11-11
  • 打赏
  • 举报
回复
没试过啊,你循环写个测试看看。
wyc_ 2014-11-11
  • 打赏
  • 举报
回复
这个不好说,看方式二中返回的值是直接拿来比较还是另外开辟内存存放之后在比较,第一种情况的话就是方式二快一些,第二种情况的话就是方式一快一些。说的不一定对。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧