在阅读了c#的隐藏特性之后,我想知道Java的隐藏特性有哪些?
当前回答
c风格的printf():)
System.out.printf("%d %f %.4f", 3,Math.E,Math.E);
输出: 3 2.718282 2.7183
二分搜索(以及它的返回值)
int[] q = new int[] { 1,3,4,5};
int position = Arrays.binarySearch(q, 2);
类似于c#,如果在数组中没有找到'2',它会返回一个负值,但如果你对返回值取1的补,你实际上会得到'2'可以插入的位置。
在上面的例子中,position = -2, ~position = 1,这是2应该插入的位置…它还允许您找到数组中“最接近”的匹配项。
我认为它很漂亮……:)
其他回答
那么自JDK 1.5以来就存在的协变返回类型呢?它的宣传很差,因为它是一个不吸引人的附加,但据我所知,它对泛型工作是绝对必要的。
本质上,编译器现在允许子类将被覆盖方法的返回类型缩小为原始方法返回类型的子类。所以这是允许的:
class Souper {
Collection<String> values() {
...
}
}
class ThreadSafeSortedSub extends Souper {
@Override
ConcurrentSkipListSet<String> values() {
...
}
}
您可以调用子类的values方法并获得一个排序的线程安全的字符串集,而不必向下强制转换为ConcurrentSkipListSet。
Java 6以来的类路径通配符。
java -classpath ./lib/* so.Main
而不是
java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main
参见http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html
一些控制流的技巧,最后围绕一个return语句:
int getCount() {
try { return 1; }
finally { System.out.println("Bye!"); }
}
确定赋值规则将检查最终变量总是通过简单的控制流分析进行赋值:
final int foo;
if(...)
foo = 1;
else
throw new Exception();
foo+1;
前几天我对实例初始化器感到惊讶。我删除了一些代码折叠方法,最终创建了多个实例初始化器:
public class App {
public App(String name) { System.out.println(name + "'s constructor called"); }
static { System.out.println("static initializer called"); }
{ System.out.println("instance initializer called"); }
static { System.out.println("static initializer2 called"); }
{ System.out.println("instance initializer2 called"); }
public static void main( String[] args ) {
new App("one");
new App("two");
}
}
执行main方法将显示:
static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called
我想,如果您有多个构造函数并且需要通用代码,那么这些将很有用
它们还提供了初始化类的语法糖:
List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};
Map<String,String> codes = new HashMap<String,String>(){{
put("1","one");
put("2","two");
}};
真正让我吃惊的是自定义序列化机制。
而这些方法是私有的!!,它们会在对象序列化期间被JVM“神秘地”调用。
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
通过这种方式,您可以创建自己的自定义序列化,使其更加“随便”(安全、快速、罕见、简单等)。
如果大量信息必须通过节点传递,这是真正应该考虑的事情。序列化机制可以更改为发送数据的一半。很多时候,瓶颈并不在平台上,而是在通过线路发送的数量上,这可能会为您节省数千个硬件dll。
这是一篇文章。 http://java.sun.com/developer/technicalArticles/Programming/serialization/
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap