Java8虽然提出了很多新特性,但是在日常写项目和编程实践的使用还不是特别熟悉,写这个专栏记录一下Java8的学习之路。
JDK5 自动装、拆箱从JDK5开始为所有基本数据类型都提供了与之对应的包装类,使基本数据类型也能够以OOP的方式来操作。
int -->Integer double --> Double long --> Long char --> Character float --> Float boolean --> Boolean short --> Short byte -- > Byte如下代码演示了基本数据类型和包装类的相互转换:
public class AutoBox { public static void main(String[] args) { int a = new Integer(66); Integer b = 18; Boolean flag = true; boolean isBug = Boolean.FALSE; } }自动装箱:将基本数据类型转换为对象:int --> Integer
自动拆箱:将对象转换为基本数据类型:Integer --> int
对于JDK1.5之前集合不能存储基本数据类型的问题,可使用自动装、拆箱来解决。
枚举枚举是 JDK1.5 推出的一个比较重要的特性。其关键字为 enum 例如:定义代表交通灯的枚举。常用于代表某些状态值、标识符或一些特定的类型。
public enum MyEnum{ RED,GREEN,YELLOW } for-each遍历常用于遍历集合,可以简化代码,逻辑更加清晰:
for(String s : strs){ System.out.println(s); }注意:使用for-each遍历集合时,要遍历的集合必须实现了Iterator接口
泛型“泛型” 意味着编写的代码可以被不同类型的对象所重用。 可见泛型的提出是为了编写重用性更好的代码。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
//给集合指定存入类型,上面这个集合在存入数据的时候必须存入String类型的数据,否则编译器会报错 List<String> strs = new ArrayList<String>(); 静态导入可以将类中的一些变量、方法以import static的方式将其导入,使被导入类的静态变量和方法于当前类可见,使用无需再给出全类名。
优点:代码简洁;
缺点:过度使用会降低代码的可读性,若某个方法重名时,会带来歧义;
import static java.lang.System.out; public class StaticImport { public static void main(String[] args) { out.println("Hi, Let's use the java 8!"); } } 变长参数在JDK1.5以前,当我们要为一个方法传递多个类型相同的参数时, 我们有两种方法解决
直接传递一个数组过去
有多少个参数就传递多少个参数。
例如:
public void printColor(String red,String green,String yellow){ // do something }或者:
public void printColor(String[] colors){ // do something }这样编写方法参数虽然能够实现我们想要的效果,但是,这样是不是有点麻烦呢? 再者,如果参数个数不确定,我们怎么办呢?Java JDK1.5为我们提供的可变参数就能够完美的解决这个问题.
例如:
public void printColor(String... colors){ // do something }如果参数的类型相同,那么可以使用 类型+三个点 ,后面跟一个参数名称的形式。 这样的好处就是,只要参数类型相同,无论传递几个参数都没有限制 注意:可变参数必须是参数列表的最后一项(该特性对对象和基本数据类型都适用)。
线程并发库线程并发库是 Java1.5 提出的关于多线程处理的高级功能,所在包:java.util.concurrent 包括
线程互斥工具类:Lock,ReadWriteLock
线程通信:Condition
线程池:ExecutorService
同步队列:ArrayBlockingQueue
同步集合:ConcurrentHashMap,CopyOnWriteArrayList
线程同步工具:Semaphore
JDK6 Compiler API我们可以用JDK1.6 的Compiler API(JSR 199)去动态编译Java源文件, Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。
这个特性对于某些需要用到动态编译的应用程序相当有用,比如JSP Web Server,当我们手动修改JSP后, 是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件。 当然,现在的JSP Web Server也是支持JSP热部署的,现在的JSP Web Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码, 这种方式需要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统; Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。
ConsoleJDK1.6 中提供了 java.io.Console 类专用来访问基于字符的控制台设备。 你的程序如果要与 Windows 下的 cmd 或者 Linux 下的 Terminal 交互,就可以用 Console 类代劳。 但我们不总是能得到可用的 Console,一个JVM是否有可用的 Console 依赖于底层平台和 JVM 如何被调用。 如果JVM是在交互式命令行(比如 Windows 的 cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的 Console 实例。
Desktop类和SystemTray类