排序方法使用700,000K内存。帮助我减少它

时间:2014-06-18 15:00:22

标签: java date arraylist

所以我为日期创建了自己的类对象(DMY.java),当我尝试对列表进行排序时,内存使用量从20,000k变为近700,000k。我把它缩小到导致记忆通过屋顶的排序方法。它在方法中实例化了一些对象,所以我认为这就是占用所有内存的东西。但有人认为他们可以帮助我优化它以减少使用内存吗?这是代码:

   public static ArrayList<String> sortListByDate(ArrayList<String> list)
   {
       DMY currDate = null;
       DMY oldDate1 = null;
       DMY oldDate2 = null;
       ArrayList<String> temp = new ArrayList<String>();

       for(int x = 0; x < list.size(); x++) {
           currDate = new DMY(Regex.matchPattern(list.get(x), "\\d+[-]\\d+[-]\\d+ \\d+[:]\\d+[:]\\d+").trim(), false);

           if(temp.size() == 0) { 
               temp.add(list.get(x)); 
           } else if(temp.size() == 1) {
               oldDate1 = new DMY(Regex.matchPattern(temp.get(0), "\\d+[-]\\d+[-]\\d+ \\d+[:]\\d+[:]\\d+").trim(), false);
               if(currDate.compareToFull(oldDate1) == -1) {
                   temp.add(0, list.get(x));
               } else {
                   temp.add(list.get(x));
               }
           } else {
               for(int y = 0; y < temp.size(); y++) {
                   if(!(x + 1 < temp.size())) {
                       temp.add(list.get(x));
                   } else {
                       oldDate1 = new DMY(Regex.matchPattern(temp.get(x), "\\d+[-]\\d+[-]\\d+ \\d+[:]\\d+[:]\\d+").trim(), false);
                       oldDate2 = new DMY(Regex.matchPattern(temp.get(x + 1), "\\d+[-]\\d+[-]\\d+ \\d+[:]\\d+[:]\\d+").trim(), false);

                       if(currDate.compareToFull(oldDate1) == 1 && currDate.compareToFull(oldDate2) == -1) {
                           temp.add(x + 1, list.get(x));
                       } 
                   }
               }
           }       
       }

       return temp;
   }

基本上,如果排序列表的大小为0,只需将该行添加到新列表中即可。如果排序列表的大小为1,请查看新日期是在该日期之前还是之后,然后相应地将其添加到排序列表中。否则,只需循环遍历列表中的每个值,并查看下两行的日期是否比当前行更新或更旧。然后相应地添加它。

正如您所看到的,有很多对象和很多循环。原始列表是包含日期的字符串列表。该方法的作用是使用正则表达式获取日期,然后将其与列表中的其他日期进行比较。由于某种原因,它使用了大量内存,我需要减少它。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  • 使用Collections.sort而不是滚动自己的
  • 使用比较器实现所需的排序行为
  • 避免使用隐式创建对象的昂贵操作(例如RegEx,String.trim())。如果你不能没有RegEx,至少预先编译并重用它们。
  • 通常为了比较而避免创建对象