详解Java5、Java6、Java7的新特性
Java5:
1、泛型Generics:
引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。ParameterizedType作为参数和返回值,Generic是vararg、annotation、enumeration、collection的基石。
A、类型安全
抛弃List、Map,使用List、Map给它们添加元素或者使用Iterator遍历时,编译期就可以给你检查出类型错误
B、方法参数和返回值加上了Type
抛弃List、Map,使用List、Map
C、不需要类型转换
Listlist=newArrayList();
Stringstr=list.get(i);
D、类型通配符“?”
假设一个打印List中元素的方法printList,我们希望任何类型T的List都可以被打印:
代码:
publicvoidprintList(Listlist,PrintStreamout)throwsIOException{ for(Iteratori=list.iterator();i.hasNext();){ System.out.println(i.next.toString()); } }
如果通配符?让我们的参数类型过于广泛,我们可以把List、Iterator修改为
List、Iterator限制一下它。
2、枚举类型Enumeration:
3、自动装箱拆箱(自动类型包装和解包)autoboxing&unboxing:
简单的说是类型自动转换。
自动装包:基本类型自动转为包装类(int——Integer)
自动拆包:包装类自动转为基本类型(Integer——int)
4、可变参数varargs(varargsnumberofarguments)
参数类型相同时,把重载函数合并到一起了。
如:
publicvoidtest(object...objs){ for(Objectobj:objs){ System.out.println(obj); } }
5、Annotations它是java中的metadata
A、Tiger中预定义的三种标准annotation
a、Override
指出某个method覆盖了superclass的method当你要覆盖的方法名拼写错时编译不通过
b、Deprecated
指出某个method或element类型的使用是被阻止的,子类将不能覆盖该方法
c、SupressWarnings
关闭class、method、field、variable初始化的编译期警告,比如:List没有使用Generic,则@SuppressWarnings("unchecked")去掉编译期警告。
B、自定义annotation
public@interfaceMarked{}
C、meta-annotation
或者说annotation的annotation
四种标准的meta-annotation全部定义在java.lang.annotaion包中:
a,Target
指定所定义的annotation可以用在哪些程序单元上
如果Target没有指定,则表示该annotation可以使用在任意程序单元上
代码
@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE}) public@interfaceTODO{}
b,Retention
指出Java编译期如何对待annotation
annotation可以被编译期丢掉,或者保留在编译过的class文件中
在annotation被保留时,它也指定是否会在JVM加载class时读取该annotation
代码
@Retention(RetentionPolicy.SOURCE)//Annotation会被编译期丢弃 public@interfaceTODO1{} @Retention(RetentionPolicy.CLASS)//Annotation保留在class文件中,但会被JVM忽略 public@interfaceTODO2{} @Retention(RetentionPolicy.RUNTIME)//Annotation保留在class文件中且会被JVM读取 public@interfaceTODO3{}
c,Documented
指出被定义的annotation被视为所熟悉的程序单元的公开API之一
被@Documented标注的annotation会在javadoc中显示,这在annotation对它标注的元素被客户端使用时有影响时起作用
d,Inherited
该meta-annotation应用于目标为class的annotation类型上,被此annotattion标注的class会自动继承父类的annotation
D,Annotation的反射
我们发现java.lang.Class有许多与Annotation的反射相关的方法,如getAnnotations、isAnnotationpresent
我们可以利用Annotation反射来做许多事情,比如自定义Annotation来做Model对象验证
代码
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.METHOD}) public@interfaceRejectEmpty{ /**hinttitleusedinerrormessage*/ Stringvalue()default""; } @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.METHOD}) public@interfaceAcceptInt{ intmin()defaultInteger.MIN_VALUE; intmax()defaultInteger.MAX_VALUE; Stringhint()default""; }
使用@RejectEmpty和@AcceptInt标注我们的Model的field,然后利用反射来做Model验证
6、新的迭代语句(for(intn:numbers))
7、静态导入(importstatic)
8、新的格式化方法(java.util.Formatter)
formatter.format("Remainingaccountbalance:$%.2f",balance);
9、新的线程模型和并发库ThreadFramework
HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList
在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意BlockingQueue、Callable、Executor、Semaphore...
Java6:
1、引入了一个支持脚本引擎的新框架
2、UI的增强
3、对WebService支持的增强(JAX-WS2.0和JAXB2.0)
4、一系列新的安全相关的增强
5、JDBC4.0
6、CompilerAPI
7、通用的Annotations支持
Java7:
1,switch中可以使用字串了
Strings="test"; switch(s){ case"test": System.out.println("test"); case"test1": System.out.println("test1"); break; default: System.out.println("break"); break; }
2.运用ListtempList=newArrayList<>();即泛型实例化类型自动推断
3.语法上支持集合,而不一定是数组
finalListpiDigits=[1,2,3,4,5,8];
4.新增一些取环境信息的工具方法
FileSystem.getJavaIoTempDir()//IO临时文件夹 FileSystem.getJavaHomeDir()//JRE的安装目录 FileSystem.getUserHomeDir()//当前用户目录 FileSystem.getUserDir()//启动java进程时所在的目录5
5.Boolean类型反转,空指针安全,参与位运算
BooleanBooleans.negate(BooleanbooleanObj) True=>False,False=>True,Null=>Null booleanBooleans.and(boolean[]array) booleanBooleans.or(boolean[]array) booleanBooleans.xor(boolean[]array) booleanBooleans.and(Boolean[]array) booleanBooleans.or(Boolean[]array) booleanBooleans.xor(Boolean[]array)
6.两个char间的equals
booleanCharacter.equalsIgnoreCase(charch1,charch2)
7.安全的加减乘除
intMath.safeToInt(longvalue) intMath.safeNegate(intvalue) longMath.safeSubtract(longvalue1,intvalue2) longMath.safeSubtract(longvalue1,longvalue2) intMath.safeMultiply(intvalue1,intvalue2) longMath.safeMultiply(longvalue1,intvalue2) longMath.safeMultiply(longvalue1,longvalue2) longMath.safeNegate(longvalue) intMath.safeAdd(intvalue1,intvalue2) longMath.safeAdd(longvalue1,intvalue2) longMath.safeAdd(longvalue1,longvalue2) intMath.safeSubtract(intvalue1,intvalue2)
8.map集合支持并发请求,且可以写成Mapmap={name:"xxx",age:18};
希望本篇文章可以帮到需要的朋友