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

求教一个问题现象~3Q~
RT,今天发现一个小的问题,求指教~

package david.deepInCollection;

import java.util.Calendar;

public class SearchedFile implements Comparable<SearchedFile> {
    private String _fileName;
    private Calendar _lastModifed;

    public SearchedFile(String fileName, Calendar lastModified) {
// TODO Auto-generated constructor stub
_fileName = fileName;
_lastModifed = Calendar.getInstance();
_lastModifed.setTimeInMillis(lastModified.getTimeInMillis());
    }

    @Override
    public String toString() {
// TODO Auto-generated method stub
return String.format("{文件名:%s, 最后修改时间:%s}", _fileName, _lastModifed
.getTime().toString());
    }

    @Override
    public int compareTo(SearchedFile o) {
// TODO Auto-generated method stub
if (o == null)
    return -1;

return _lastModifed.compareTo(o._lastModifed) > 0 ? -1 : 1;
    }
}

public static void searchFilesDemo() {
Calendar calendar = Calendar.getInstance();
calendar.set(2013, 0, 1, 0, 0, 0);
String filepath = "D:\\";
File file = new File(filepath);
Calendar lastmodifiedDate = Calendar.getInstance();
List<SearchedFile> searchedResult = new ArrayList<SearchedFile>();
for (File item : file.listFiles()) {
    lastmodifiedDate.clear();
    lastmodifiedDate.setTimeInMillis(item.lastModified());
    if (lastmodifiedDate.compareTo(calendar) > 0) {
if (!item.isHidden()) {
    SearchedFile sf = new SearchedFile(item.getName(),
    lastmodifiedDate);
    searchedResult.add(sf);
}
    }
}
Collections.sort(searchedResult);
for (SearchedFile searchItem : searchedResult) {
    System.out.println(searchItem.toString());
}
    }

上述方法出来的特定时间下的文件输出没问题,但是如果把SearchFile的构造方法里面的换成

    public SearchedFile(String fileName, Calendar lastModified) {
// TODO Auto-generated constructor stub
_fileName = fileName;
// _lastModifed = Calendar.getInstance();
// _lastModifed.setTimeInMillis(lastModified.getTimeInMillis());
_lastModifed = lastModified;
    }



第一种正常结果是:
{文件名:Java, 最后修改时间:Tue Oct 15 00:05:34 CST 2013}
{文件名:360安全浏览器下载, 最后修改时间:Tue Oct 15 00:05:03 CST 2013}
第二种不正常结果是:
{文件名:飞速Tudou, 最后修改时间:Sun Jan 27 16:27:34 CST 2013}
{文件名:灌篮高手全国大赛, 最后修改时间:Sun Jan 27 16:27:34 CST 2013}

这样出来的结果所有的最后修改时间都变成了就是最后一个被添加的文件的时间了,是不是C#和Java在对象上的机制有什么不同才导致这样的问题...如果有知道的朋友求指导~谷歌没找到相应想要的答案~
java

------解决方案--------------------
java中是传对象的概念,
举一个例子,
A
B=A
C=B
那么C==A
如果A做了修改,C也是会被修改的。因为C在栈区中的地址是指向A对象的

Calendar lastmodifiedDate = Calendar.getInstance();//这里生成了一个对象Ca吧
    List<SearchedFile> searchedResult = new ArrayList<SearchedFile>();
    for (File item : file.listFiles()) {
        lastmodifiedDate.clear();
        lastmodifiedDate.setTimeInMillis(item.lastModified());
        if (lastmodifiedDate.compareTo(calendar) > 0) {
        if (!item.isHidden()) {
            SearchedFile sf = new SearchedFile(item.getName(),
                lastmodifiedDate);这里循环两次,你传入的都是Ca这一个对象,
            searchedResult.add(sf);
        }
        }
    }
你传入的都是同一个对象,并且没有对这个对象进行复制,所以这两个file对象中存储的Ca对象是同一个。
_lastModifed = Calendar.getInstance();
    _lastModifed.setTimeInMillis(lastModified.getTimeInMillis());
而这代码的意思是生成一个新的Ca对象,并添加原Ca的值。