新特性总结-JDK1.7
来源:互联网 发布:电脑编程代码 编辑:程序博客网 时间:2024/06/06 04:43
说明
- 2011年发布
- 一些子项目被推迟到JKD1.8
- 新增G1垃圾回收
- 增强动态语言的支持
- 新增64位系统的压缩指针
- NIO 2.0
对集合类的语言支持 【无效】
Java将包含对创建集合类的第一类语言支持。这意味着集合类的创建可以像Ruby和Perl那样了。
注: 经测试,该特性不适用JDK1.7,特性不可用,忽略即可。
原本需要这样:
List<String> list = new ArrayList<String>(); list.add("item"); String item = list.get(0); Set<String> set = new HashSet<String>(); set.add("item"); Map<String, Integer> map = new HashMap<String, Integer>(); map.put("key", 1); int value = map.get("key");
现在你可以这样:
List<String> list = ["item"]; String item = list[0]; Set<String> set = {"item"}; Map<String, Integer> map = {"key" : 1}; int value = map["key"];
这些集合是不可变的。
自动资源管理
Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。
这个新的语言特性:
允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。
以前:
BufferedReader br = new BufferedReader(new FileReader(path));try { return br.readLine();} finally { br.close();}
现在:
try (BufferedReader br = new BufferedReader(new FileReader(path)) { return br.readLine(); }
你还可以定义多个资源:
try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest)) { //TODO something }
为了支持这一行为,所有可关闭的类将被修改为可以实现一个AutoCloseable/Closeable(可关闭的)接口。
增强对通用实例创建的类型推断
类型推断是一个特殊的烦恼,下面的代码:
Map<String, List<String>> map = new HashMap<String, List<String>>();
通过类型推断后变成:
Map<String, List<String>> map = new HashMap<>();
这个<>被叫做diamond(钻石)运算符,该运算符从引用的声明中推断类型。
数字字面量-下划线支持
很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了,如:
int money = 1_000_000;
运算时先去除下划线,如:
int sum1 = 1_2 * 10; // 120int sum2 = 130 – 1_0;// 120
switch中使用string
以前你在switch中只能使用number或enum。现在你可以使用String了:
String str = "case";switch (str) { case "key": //TODO case "word": //TODO case "case": //TODO case "case1": //TODO default: //TODO}
二进制字面量
由于继承C语言,Java代码在传统上迫使程序员只能使用十进制,八进制或十六进制来表示数(numbers)。
由于很少的域是以bit导向的,这种限制可能导致错误。
现在可以使用0b/0B前缀创建二进制字面量
例如:
int binary = 0b1001_1001;
现在可以使用二进制字面量这种表示方式,并且以非常简短的代码,将二进制字符转换为数值类型,如byte或short
例如:
byte obByte = (byte)0b001; short obShort = (short)0B010;
简化可变参数调用
有些参数类型,例如ArrayList<Number>
和 List<String>
,是非具体化的(non-reifiable).在编译阶段,编译器会擦除该类型信息。
当程序员试图使用一个不可具体化的可变参数并调用一个varargs (可变)方法时,编辑器会生成一个“非安全操作”的警告。
例如:
List list = new ArrayList<Number>(); List<String> storeList = list;// unchecked warning list.add(0, new Integer(10)); // another unchecked warning String s = storeList .get(0); // ClassCastException is thrown
在jdk7之前,当你调用一个含有非具体化参数的可变参数方法,你必须自行保证不会发生“heappollution”。
Heappollution 指一个变量被指向另外一个不是相同类型的变量。
这有一个问题,如果调用者对方法不熟悉,他根本无法判断。
JDK7对此做了改进,在可变参数方法中传递非具体化参数(Non-Reifiable Formal Parameters)时,在该方法被定义时就发出警告。
将警告从call转移到了方法声明(methord-declaration)的过程中。这样API设计者就可以使用vararg,因为警告的数量大大减少了。
例如,当你定义下面的函数时
public static <T> void addElementToList (List<T> list, T... elements) { for (T element : elements) { list.add( element ); } }
你会得到一个warning
warning: [varargs] Possible heap pollution from parameterized vararg type
要消除警告,可以有三种方式
- 加 annotation @SafeVarargs
- 加 annotation @SuppressWarnings({“unchecked”, “varargs”})
- 使用编译器参数 –Xlint:varargs
- 新特性总结-JDK1.7
- JDK1.7新特性总结
- JDK1.5 JDK1.6 JDK1.7新特性总结分析
- jdk1.5新特性总结
- JDK1.5新特性总结
- JDK1.5新特性总结
- JDK1.5新特性总结
- 新特性总结-JDK1.4
- 新特性总结-JDK1.5
- 新特性总结-JDK1.6
- 新特性总结-JDK1.0
- 新特性总结-JDK1.1
- 新特性总结-JDK1.2
- 新特性总结-JDK1.3
- 新特性总结-JDK1.8
- 新特性总结-JDK1.9
- JDK1.5新特性总结
- jdk1.7新特性
- NYOJ44
- 机器学习利器:Graphlab Create安装
- Retrofit2与RxJava的使用
- ASP.NET 使用LinkButton做登录按钮时,回车无法提交解决方案
- Git和SVN的区别
- 新特性总结-JDK1.7
- 面试复习----多线程编程
- SharedPreferences commit跟apply的区别
- Ueditor富文本编辑器替换去除自动追加p标签
- 递归实现快速排序
- Ubuntu配置TFTP
- Js 怎么遍历json对象所有key及根据动态key获取值
- JS实现无限层级的树状的算法
- python read file(f,csv)