0

我有以下代码

 public boolean matches(String word) {

     Pattern p = Pattern.compile("\\w$");
     Matcher m = p.matcher(word);
     return m.find();

 }

我想知道 java 编译器是用对象替换 Pattern.compile("\w$") 短语,还是在每次调用函数时创建对象。

如何找出 java 对我的代码的影响?
有没有显示这个的eclipse插件?

4

5 回答 5

1

根据源代码,每次调用函数时都会创建对象。

public static Pattern compile(String regex) {
    return new Pattern(regex, 0);
}
于 2013-05-09T12:51:44.630 回答
1

Java 编译器将简单地invokestatic针对java.util.regex.Pattern.compile. 实际上,此方法将返回Pattern您的代码随后可以使用的对象。

因此,您真正想知道的内容在Pattern.compile. 如果该方法只返回一个新Pattern对象,那么以后的调用将不会重用。如果您看到对象正在被缓存,那么就会发生一些重用。

因此,请查看您感兴趣的 Java 版本的源代码。

于 2013-05-09T13:11:53.977 回答
0

compile方法创建新对象Pattern,稍后重用。

从源代码:

public static Pattern compile(String regex, int flags) {
    return new Pattern(regex, flags);
}
于 2013-05-09T12:49:53.557 回答
0

要查看编​​译器完成的优化,您可以按照以下方式进行操作:

1)编译你的程序

2)使用可用的java反编译器(可以在google中查看)反编译您的程序以再次生成源代码

3)将您的源代码与反编译的源代码进行比较。

这会给你足够的想法......

因为反编译器不是那么聪明(也没有必要)。

虽然查看运行时优化要困难得多。

于 2013-05-09T12:58:55.970 回答
0

如果您查看了 Java Bytecode 生成的正弦波,您只能确定知道 Java 已经内置了很多优化。

对于 Eclipse,我知道Bytecode Outline 插件可以直接从 Eclipse 中显示字节码。也许您可能需要搜索一些资源如何读取 bytecolde,但其中大部分都像对象创建或类调用一样简单。

于 2013-05-09T13:00:50.360 回答