返回信息流0. 国际化字符串。java.text.MessageFormat提供国际化的字符串格式化支持。考虑到各个语言的语序不同,格式化采用{0}, {1}这样的定位方式,可以重排参数的顺序,而不是像printf的%d, %f那样严格按照参数的顺序排列。Locale类提供了各种语言的各种习惯的支持,比如汉语使用者习惯使用年-月-日,24小时制;而英语使用者习惯月/日/年,12小时制。这些Java都处理得很好。还考虑了一些语言的“数量”语法,允许one file, two files这样的选择结构。
package cn.byr.nuanyangyang.java20.msgfmt;
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
public class MsgFmtTest {
public static void main(String[] args) {
String fileName = "foo.txt";
Date completeTime = new Date(); // now
MessageFormat chineseFmt = new MessageFormat("在{1,date} {1,time}下载了文件{0}。", Locale.CHINESE);
MessageFormat englishFmt = new MessageFormat("Downloaded file {0} at {1, time} on {1,date}.", Locale.ENGLISH);
for (MessageFormat fmt : new MessageFormat[] { chineseFmt, englishFmt }) {
System.out.println(fmt.format(new Object[] { fileName, completeTime }));
}
}
}
输出:
在2015-5-25 22:41:05下载了文件foo.txt。
Downloaded file foo.txt at 10:41:05 PM on May 25, 2015.
1. 高精度数学运算。Java提供高精度的数量表示和算数运算。java.math.BigInteger应该是最常用的,ACM-ICPC选手的最爱。而别的语言,比如C,就要依赖GNUMP这样的第三方库了。Python对高精度的支持倒是比Java更紧密。
package cn.byr.nuanyangyang.java20.bigint;
import java.math.BigInteger;
public class BigIntTest {
public static BigInteger bigFactorial(int n) {
BigInteger p = BigInteger.ONE;
for (int i = 2; i <= n; i++) {
BigInteger bi = BigInteger.valueOf(i);
p = p.multiply(bi);
}
return p;
}
public static void main(String[] args) {
System.out.println(bigFactorial(100)); // 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
}
}
2. JDBC数据库接口。Java提供了标准的数据库接口。这对关系型数据库的用户来说方便了很多。但是,毕竟各个数据库的SQL语言略有区别,JDBC不能做到完全抽象,但有个标准接口还是缓和了学习曲线。
package cn.byr.nuanyangyang.java20.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) throws Exception {
try (Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:mymemdb", "SA", "")) {
try (Statement stmt = conn.createStatement()) {
stmt.execute("CREATE TABLE people (name VARCHAR(50), age INT);");
}
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO people (name, age) VALUES (?,?);")) {
ps.setString(1, "Foo");
ps.setInt(2, 30);
ps.execute();
ps.setString(1, "Bar");
ps.setInt(2, 40);
ps.execute();
ps.setString(1, "Baz");
ps.setInt(2, 50);
ps.execute();
}
try (PreparedStatement ps = conn.prepareStatement("UPDATE people SET age = ? WHERE name = ?;")) {
ps.setInt(1, 70);
ps.setString(2, "Bar");
int updateCount = ps.executeUpdate();
System.out.format("%d rows affected.\n", updateCount);
}
try (PreparedStatement ps = conn.prepareStatement("SELECT name, age FROM people WHERE age > ?;")) {
ps.setInt(1, 45);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.format("name: %s, age: %d\n", rs.getString(1), rs.getInt(2));
}
}
}
}
}
}
3. 内部类。Java允许创建内部类,可以是类的内部,也可以是函数的内部。在函数内部的时候,还可以访问局部变量。这相当于函数式语言里的“闭包”,给程序员提供了很大的方便。这比起C/C++这样的语言是很大的优势,但是比起Haskell这样的函数式语言来说还是略显啰嗦,毕竟不是函数式语言。C++11终于有了lambda。终于……
package cn.byr.nuanyangyang.java20.innercls;
interface Adder {
int addTo(int n);
}
public class InnerClassTest {
public static Adder getAdder(final int m) {
class MyAdder implements Adder {
@Override
public int addTo(int n) {
return n + m;
}
}
return new MyAdder();
}
public static void main(String[] args) {
Adder a4 = getAdder(4);
Adder a7 = getAdder(7);
System.out.println(a4.addTo(9)); // 13
System.out.println(a7.addTo(9)); // 16
}
}
4. JNI。Java的JNI是Java语言和本地程序交互的机制。Java选择了“重量级”的风格:JNI提供很厚的封装,本地代码不能直接访问Java对象,而必须使用API函数来访问;同样,本地程序不可以直接持有Java对象的指针,而必须用不透明的“句柄”来间接访问。我个人认为这样的抽象虽然给JVM本身提供了干净的环境,但让本地接口的使用者感到头疼,也影响效率。现在有JSR,要给Java增加类似C#的unsafe一样的接口。
这里暂时没有编译器,不好贴代码,有人愿意贡献的话,欢迎哦。[ema20]
这是一条镜像帖。来源:北邮人论坛 / java / #41091同步于 2015/5/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[Java20年]Quiz:下列特性是哪个Java版本引入的?(2)
nuanyangyang
2015/5/25镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复