Java中的代码优化

Java中的代码优化,java,Java,我有一个打印子目录创建日期的代码。我得到了预期的输出,但我编写代码的方式并不好,我认为可以用更好的方式对其进行优化。如您所见,for循环中有三行代码,每次for循环运行时都会执行这些代码,这增加了复杂性 public static void main(String aa[]) throws IOException { DateFormat simpleDateFormat = new SimpleDateFormat("MM-dd-yyyy"); File fi

我有一个打印子目录创建日期的代码。我得到了预期的输出,但我编写代码的方式并不好,我认为可以用更好的方式对其进行优化。如您所见,for循环中有三行代码,每次for循环运行时都会执行这些代码,这增加了复杂性

public static void main(String aa[]) throws IOException
{
        DateFormat simpleDateFormat = new SimpleDateFormat("MM-dd-yyyy");

        File file = new File("G:\\TestFiles");
        File[] files = file.listFiles();

        for(File subDir: files)
        {

        BasicFileAttributes attribute = Files.readAttributes(subDir.toPath(), BasicFileAttributes.class);

        FileTime filetime = attribute.creationTime();

        String strDate = simpleDateFormat.format(filetime.toMillis());

        System.out.println(strDate);

        }       

}

我试图以这样的方式编写代码:在for循环内部,我应该只有print语句,其余三行应该在for循环外部。我采用的一种方法是声明子文件夹的路径,但它没有给出子文件夹的正确创建日期。

对我来说很合适……您可以将其拆分为:

    final DateFormat simpleDateFormat = new SimpleDateFormat("MM-dd-yyyy");
    final File file = new File("G:\\TestFiles");

    for (File subDir : file.listFiles()) {
      System.out.println(simpleDateFormat.format(Files.readAttributes(file.toPath(), BasicFileAttributes.class)
          .creationTime().toMillis())
      );
    }

…但是请注意
file.listFiles()
,因为您可能很容易得到一个NPE(尽管您也没有在原始代码中检查它)。

它对我来说很好…您可以将其拆分为:

    final DateFormat simpleDateFormat = new SimpleDateFormat("MM-dd-yyyy");
    final File file = new File("G:\\TestFiles");

    for (File subDir : file.listFiles()) {
      System.out.println(simpleDateFormat.format(Files.readAttributes(file.toPath(), BasicFileAttributes.class)
          .creationTime().toMillis())
      );
    }
…但是请注意
file.listFiles()
,因为您可能很容易获得NPE(尽管您也没有在原始代码中检查它)。

你的问题不清楚你所说的优化是什么意思

在环路外移动线路 在
for
循环内执行的代码行需要在循环内运行。这一点没有什么不优化的。我在代码中没有看到任何可以移动到循环之外的内容

如果您担心创建的对象几乎会立即被销毁并成为JVM垃圾收集器的“垃圾”…请停止担心。现代JVM经过了非常好的磨练和优化,适合于这种短期对象。不要在一个长时间运行的循环(几十万次或数百万次迭代)中轻率地创建这样的对象,但也不要为此烦恼

同样,请参见下面的代码示例。注意我是如何将时区、区域设置和格式化程序放在循环之前的。这些行在
for
循环中也可以正常工作,但它们会重复执行并创建新实例,而没有任何好处。这三个特定的对象是为了重用而构建的,所以我将它们移到了顶部。在起草代码时,我可能会将它们放在循环中,然后将它们标识为有资格移出循环

少行 如果优化意味着为了缩短代码而减少行数,我强烈建议不要这样做,原因有三

  • 代码的可读性比行数重要得多。程序员需要能够轻松阅读和理解代码,而不是破译代码
  • 如果有简单的短行代码,调试就容易多了。我所说的“短”是指专注于正在完成的一个(或几个)特定操作(而不是实际的线路长度)。如果一行中发生太多嵌套操作,则调试时跟踪值和效果会变得更加复杂
  • 像Oracle这样的现代JVM技术在编译和运行时优化代码方面做得非常出色。当给出相对简单的代码行时,这些优化将变得最强大。使代码过于密集或“聪明”实际上会减少Java编译器/运行时优化的机会
java.time 您可以做的一大改进是避免使用java.util.Date/.Calendar和SimpleTextFormat类。这些旧类是出了名的麻烦,在设计和实现上都有缺陷

这些类在Java8和更高版本中被新的Java.time包所取代。这个新的日期-时间框架受库的启发,由项目定义并扩展

您使用的类是java.time-savy。注意方法

将所需/预期时区()分配给该时刻。如果不指定时区,则会隐式应用JVM的默认时区–通常更好的做法是指定而不是隐式依赖默认时区。请注意,JVM的当前默认时区可以在运行时随时由该JVM内运行的任何应用程序的任何线程中的任何代码更改

以适当的方式创建字符串表示

让我们想象一下,一位魁北克的经理正在查看与印度业务运营相关的数据。我们想显示按照她的习惯格式化的日期-时间值,但以印度时区为框架。时区对于确定日期至关重要(印度比加拿大的新一天破晓得早)

示例输出

2014-04-19
2010-10-12
2015-06-21
优化 你的问题不清楚你所说的优化是什么意思

在环路外移动线路 在
for
循环内执行的代码行需要在循环内运行。这一点没有什么不优化的。我在代码中没有看到任何可以移动到循环之外的内容

如果您担心创建的对象几乎会立即被销毁并成为JVM垃圾收集器的“垃圾”…请停止担心。现代JVM经过了非常好的磨练和优化,适合于这种短期对象。不要在一个长时间运行的循环(几十万次或数百万次迭代)中轻率地创建这样的对象,但也不要为此烦恼

同样,请参见下面的代码示例。注意我是如何将时区、区域设置和格式化程序放在循环之前的。这些行在
for
循环中也可以正常工作,但它们会重复执行并创建新实例,而没有任何好处。这三个特定的对象是为了重用而构建的,所以我将它们移到了顶部。在起草代码时,我可能会将它们放在循环中,然后将它们标识为有资格移出循环

少行 如果优化意味着为了缩短代码而减少行数,我强烈建议不要这样做,原因有三

  • 代码的可读性比行数重要得多。节目