2024-04-20 09:00:01

Java的隐藏特性

在阅读了c#的隐藏特性之后,我想知道Java的隐藏特性有哪些?


当前回答

我最喜欢的:转储所有线程堆栈跟踪到标准输出。

在你的java cmd/控制台窗口中按CTRL-Break键

unix: kill -3 PID

其他回答

在Java 1.6 Update 10及以后版本中发现的下一代Java插件有一些非常简洁的特性:

传递java_arguments参数,将参数传递给创建的JVM。这允许您控制给予applet的内存量。 为每个applet创建单独的类装入器,甚至单独的JVM。 指定要使用的JVM版本。 在只需要完整Java库功能的一个子集的情况下,安装部分Java内核。 更好的Vista支持。 支持(实验性)将applet拖出浏览器,并在导航离开时让它继续运行。

这里记录了许多其他事情:http://jdk6.dev.java.net/plugin2/

更多信息请访问:http://jdk6.dev.java.net/6u10ea.html

语言级assert关键字。

最终初始化可以推迟。

它确保即使使用复杂的逻辑流也始终设置返回值。很容易错过一个case并意外返回null。它并不是不可能返回null,只是很明显它是故意的:

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 2";
    } else {
         element = "Result 3";
    }
    return element;
}

来自Java 6的注释处理API看起来非常适合代码生成和静态代码验证。

部分功能,部分麻烦:Java的String处理使其“看起来”是原生类型(使用运算符,+,+=)

能写的:

String s = "A";
s += " String"; // so s == "A String"

非常方便,但只是语法糖(即被编译为):

String s = new String("A");
s = new StringBuffer(s).append(" String").toString();

因此,一个对象实例化和2个方法调用一个简单的连接。想象一下以这种方式在循环中构建一个长字符串!?并且StringBuffer的所有方法都声明为同步的。谢天谢地,在Java 5中,他们引入了StringBuilder,它与StringBuffer是一样的,只是没有同步。

这样的循环:

String s = "";
for (int i = 0 ; i < 1000 ; ++i)
  s += " " + i; // Really an Object instantiation & 3 method invocations!

可以(应该)在你的代码中重写为:

StringBuilder buf = new StringBuilder(); // Empty buffer
for (int i = 0 ; i < 1000 ; ++i)
  buf.append(' ').append(i); // Cut out the object instantiation & reduce to 2 method invocations
String s = buf.toString();

并将运行大约80+%比原来的循环! (在我运行的一些基准测试中高达180%)