"JDK1.5"的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。
1>可以约束集合中元素的类型
2>可以自动完成强制类型转换
3>集合<类型> Collection表示集合中只能存储String类型数据,其他类型不存储
Collection c = new ArrayList();
//泛型 存放整型数据
Collection<Integer> c = new ArrayList<Integer>();
For-Each循环的加入简化了集合的遍历。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
1>自动"装箱"和"拆箱"是依靠JDK1.5的编译器在编译期的"预处理"工作
代码:
Integer a = 100 ; //装箱
Integer b = 200 ; //装箱
Integer c = a + b ; //拆箱再装箱
double d = c ; //拆箱
2>装箱和拆箱是"编译器"认可的,而不是虚拟机。编译器在生成类的字节码时插入必要的方法调用。
代码:
Integer a = 100 => Integer a = Integer.valueOf(100);
Integer b = 200 => Integer b = Integer.valueOf(200);
Integer c = a + b => Integer c = Integer.valueOf(a.intValue()+b.intValue());
Integer d = c => int d = c.intValue();
1>JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。
代码:
public enum Color
{
Red,White,Blue
}
2>枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
代码:
for (Color c : Color.values())
System.out.println(c);
1>可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。
代码:
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);
2>在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了
代码:
public void write(Object... objs) {
for (Object obj: objs)
System.out.println(obj);
}
要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
增强for循环也可以遍历集合
代码如下:
for(元素 : 集合) {}
Collection<Double> r = new ArrayList<>();
r.add(3.35);
r.add(6.36);
r.add(null);
r.add(9.36);
r.add(9.365);
Iterator<Double> q = r.iterator();
for(Iterator<Double> q1 = r.iterator();q1.hasNext();){
Double s = q1.next();
if(s == null) continue ;
System.out.println(s);
}
for(Double e : r) {
//会将q1中的每个元素赋值到变量e
System.out.println(e);
}
上述for(Double e : r)的工作原理:
Java SE 6中对内存泄漏增强了分析以及诊断能力。当遇到java.lang.OutOfMemory异常的时候,可以得到一个完整的堆栈信息,
并且当堆已经满了的时候,会产生一个Log文件来记录这个致命错误。另外,JVM还添加了一个选项,允许你在堆满的时候运行脚本。
插入式注解处理API(JSR 269)提供一套标准API来处理Annotations
前者用于调度操作系统中的一些功能,例如:
1> 可以打开系统默认浏览器指定的URL地址;
2> 打开系统默认邮件客户端给指定的邮箱发信息;
3> 用默认程序打开或编辑文件;
4>用系统默认的打印机打印文档。
后者可用来在系统托盘区创建一个托盘程序。
JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。我们把对象与关系数据库之间的映射称为ORM, 其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping). 原来JAXB是Java EE的一部分,在JDK6中,SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK6中自带的这个JAXB版本是2.0, 比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。
StAX是JDK1.6中除了DOM和SAX之外的又一种处理XML文档的API。
StAX是The Streaming API for XML的缩写。由于JDK6.0中的JAXB2和JAX-WS 2.0都会用到StAX,所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4.
JDK6里面JAXP的版本就是1.4。JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。
现在我们可以用JDK1.6 的Compiler API动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。
这个特性对于某些需要用到动态编译的应用程序相当有用, 比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件。
JDK6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在 这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给 HttpHandler实现类的回调方法。
JSR (JSR是Java Specification Requests的缩写,意思是Java 规范请求)用Annotation Processor在编译期间而不是运行期间处理Annotation, Annotation Processor相当于编译器的一个插件,所以称为插入式注解处理。
JDK6中提供了java.io.Console 类专用来访问基于字符的控制台设备. 你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳。
JDK6增加了对脚本语言的支持(JSR 223),原理上是将脚本语言编译成bytecode,这样脚本语言也能享用Java平台的诸多优势,包括可移植性,安全等,另外,由于现在是编译成bytecode后再执行,所以比原来边解释边执行效率要高很多。加入对脚本语言的支持后,对Java语言也提供了以下好处。
1、许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。现在Java语言也可以通过对脚本语言的支持间接获得这种灵活性。
2、 可以用脚本语言快速开发产品原型,因为现在可以Edit-Run,而无需Edit-Compile-Run,当然,因为Java有非常好的IDE支持,我 们完全可以在IDE里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。
3、通过引入脚本语言可以轻松实现Java应用程序的扩展和自定义,我们可以把原来分布在在Java应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用JavaScript来处理。
Common annotations原本是Java EE 5.0规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中. 随着Annotation元数据功能加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数,保证Java SE和Java EE 各种技术的一致性.。
在1.6的版本switch的参数中只支持byte、short、char、int、long以及他们的包装类(自动拆箱和自动装箱的支持下),然后在jdk1.7支持了String作为参数。
String str = "1";
switch (str){
case "1":
System.out.println("NO.1");
break;
case "2":
System.out.println("NO.2");
break;
case "3":
System.out.println("NO.3");
break;
default:
System.out.println("fail");
}
实现java.long.AutoCloseable接口的资源都可以放到try中
跟final里面的关闭资源类似;
按照声明逆序关闭资源;
Try块抛出的异常Throwable.getSuppressed获取。
如果try代码块和try-with-resources语句同时抛出异常,这个方法将会最终抛出try代码块里面的异常,try-with-resources语句里面抛出的异常被压抑了。
public static void writeToFileZipFileContents(String zipFileName,
String outputFileName)
throws java.io.IOException {
java.nio.charset.Charset charset =
java.nio.charset.StandardCharsets.US_ASCII;
java.nio.file.Path outputFilePath =
java.nio.file.Paths.get(outputFileName);
// Open zip file and create output file with
// try-with-resources statement
try (
java.util.zip.ZipFile zf =
new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer =
java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
// Enumerate each entry
for (java.util.Enumeration entries =
zf.entries(); entries.hasMoreElements();) {
// Get the entry name and write it to the output file
String newLine = System.getProperty("line.separator");
String zipEntryName =
((java.util.zip.ZipEntry)entries.nextElement()).getName() +
newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
}```
在这个例子中,try-with-resources语句包含了两个用分号隔开的声明:ZipFile和BufferedWriter。当代码块中代码终止,不管是正常还是异常,BufferedWriter和ZipFile对象的close方法都会自动按声明的相反顺序调用。
下面的例子用try-with-resources语句自动关闭一个java.sql.Statement对象:
```java
public static void viewTable(Connection con) throws SQLException {
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
try (Statement stmt = con.createStatement()) {
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " +
price + ", " + sales + ", " + total);
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
public static void main(String[] args) throws Exception {
try {
testthrows();
} catch (IOException | SQLException ex) {
throw ex;
}
}
public static void testthrows() throws IOException, SQLException {
}
可以去掉后面new部分的泛型类型,只用<>就可以了。
新特性之前:
List strList = new ArrayList();
List<String> strList = new ArrayList<String>();
List<Map<String, List<String>>> strList5 = new ArrayList<Map<String, List<String>>>();
新特性:
List<String> strList2 = new ArrayList<>();
List<Map<String, List<String>>> strList3 = new ArrayList<>();
List<String> list = new ArrayList<>();
Heap pollution 指一个变量被指向另外一个不是相同类型的变量。例如
List l = new ArrayList<Number>();
List<String> ls = l; // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0); // ClassCastException is thrown
Jdk7:
public static <T> void addToList (List<T> listArg, T... elements) {
for (T x : elements) {
listArg.add(x);
}
}
所有整数int、short、long、byte都可以用二进制表示,表示的方法就是在二进制数字前面加上0b.
byte num1 = 0b00001001; //1个字节8位
short num2 = 0b0010000101000101; //2个字节16位
int num3 = 0b10100001010001011010000101000101;; //4个字节32位
long num4 = 0b0010000101000101101000010100010110100001010001011010000101000101L;//8个字节64位
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
System.out.println(num4);
输出结果:
9
8517
-1589272251
2397499697075167557
不过要注意下划线添加的一些标准,下划线不允许出现在开头和结尾。
它提供了一些方法来操作对象,这些方法大多数是“空指针”安全的,比如 Objects.toString(obj);如果obj是null,,则输出是null。
否则如果你自己用obj.toString(),如果obj是null,则会抛出NullPointerException
10.调用泛型类的构造方法时,可以省去泛型参数,编译器会自动判断。
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
默认方法就是一个在接口里面有了一个实现的方法。
新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
加强对日期与时间的处理。
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
在Java 8中,Base64编码已经成为Java类库的标准。
Java 8 内置了 Base64 编码的编码器和解码器。
Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:
基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。
Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。
资料随时更新,小范给各位猿友们提供一个网址,希望能够帮到你们!
Java教程