日期:2014-05-20  浏览次数:20768 次

一道Java笔试题,能详细说明下结果吗 List不懂
private static List < String > getList(){
List < String > list = new ArrayList();
StringBuffer str = new StringBuffer();
  for (int i = 0;i < 2;i++) {
  list.add(str.append(i).toString());
  }
  return list;

public static void main(String[] args) { 
String returnValue = "";
List < String > listFromDb = getList();
List < String > list = new ArrayList();
list = listFromDb;
for (int i = 0;i < listFromDb.size();i++) {
String str = listFromDb.get(i);
StringBuffer strBuffer = new StringBuffer();
for (int j = 0;j < 2;j++) {
if (str.equals(strBuffer.append(j).toString())) {
list.add(strBuffer.append(j).toString());
break;
}
}
}
for (int i = 0;i < list.size();i++) {
returnValue += list.get(i);
}
System.out.println(returnValue);
}

------解决方案--------------------
首先要清楚getList()这个函数得到的是一个包含什么样的list{"0";"01"}这是程序开始的时候listFromDb包含的内容,虽然list初始化了,但是由于这句代码list = listFromDb;这是一个引用的赋值,list和listFromDb都指向了同一块内存,所以后面对list的添加实际上就是对listFromDb的添加(list.add(strBuffer.append(j).toString());)
//在第一个大循环中,由于listFromDb的内容不断增加
//所以第一个循环实际上循环了4次
//在第一次和第二次循环进入add函数
for (int i = 0;i < listFromDb.size();i++) {
String str = listFromDb.get(i);
StringBuffer strBuffer = new StringBuffer();
for (int j = 0;j < 2;j++) {
if (str.equals(strBuffer.append(j).toString())) {
list.add(strBuffer.append(j).toString());
break;
}
}
}
我们可以得到{"0""01""00""011"}这个list
------解决方案--------------------
Java code
import java.util.ArrayList;
import java.util.List;

public class Test01 {

    private static List<String> getList() {
        List<String> list = new ArrayList();//新建一个
        StringBuffer str = new StringBuffer();//stringbudder你就把他当成string就好
        for (int i = 0; i < 2; i++) {//循环2次,i=0,i=1
            list.add(str.append(i).toString());//list中俩个值 0和01
        }
        return list;
    }

    public static void main(String[] args) {
        String returnValue = "";
        List<String> listFromDb = getList();//listFromDb中俩个值0和01
        List<String> list = new ArrayList();
        list = listFromDb;//list和listFromDb指向同一个引用了,可以理解为他们是同一个“人”
        for (int i = 0; i < listFromDb.size(); i++) {//size是大小,等于2
            String str = listFromDb.get(i);//listFromDb中俩个值0和01
            StringBuffer strBuffer = new StringBuffer();
            for (int j = 0; j < 2; j++) {
                if (str.equals(strBuffer.append(j).toString())) {
                    list.add(strBuffer.append(j).toString());
                    break;//应该就他是知识点了,break是跳出本循环就是直接又回到上面最近的那个
                          //for。而且j又从0开始,但是下面的那句strBuffer.append(j)可是一直在添加
                          //所以后边会有011
                }
            }
        }
        for (int i = 0; i < list.size(); i++) {
            returnValue += list.get(i);//list4个值 0 01 00 011
        }
        System.out.println(returnValue);
    }
}