Java 5
Java5 开发代号为 Tiger(老虎),于 2004-09-30 发行
特性列表
1.泛型
2.枚举
3.自动拆箱装箱
4.可变参数
5.注解
6.foreach循环(增强for for/in)
7.静态导入
8.格式化(System.out.println 支持 %s %d)等格式化的输出
9.线程框架 / 数据结构 JUC
10.Arrays 工具类/StringBuilder/instrument
1.泛型
所谓类型擦除指的就是 Java 源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中范型类型的类型参数则会被替换为 Object 类型,并在实际使用时强制转换为指定的目标数据类型。而 C++中的模板则会在编译时将模板类型中的类型参数根据所传递的指定数据类型生成相对应的目标代码。
Map squares = new HashMap();
通配符类型:避免 unchecked 警告,问号表示任何类型都可以接受
public class Jdk5 {
public static void main(String[] args) {
//1.泛型
List list = new ArrayList<>();
list.add("string1");
list.add("string2");
list.add("string3");
PrintStream ps = System.out;
try {
printList(list,ps);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void printList(List> list, PrintStream out) throws IOException {
for (Iterator> i = list.iterator(); i.hasNext(); ) {
out.println(i.next().toString());
}
}
}
限制类型 可以限制最高类型 extends E>:向下限定,只能是E及其子类
public static Object doObj(Person p){
return new Object();
}
限制类型 限制最低类型 super E>:向上限定,只能是E及其父类
List super String> list = new ArrayList
2.枚举
EnumMap
public enum Day {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
public class TestEnumMap {
public static void main(String[] args) {
Day today = Day.FRIDAY;
//对应Day类的EnumMap
EnumMap enummap = new EnumMap(Day.class);
//第一个值为key不能为null,第二个值为values可以为null
enummap.put(Day.MONDAY, "work work");
//第一个值填入枚举实例,第二个值为该枚举实例的记录信息
enummap.put(Day.TUESDAY, "work work");
enummap.put(Day.WEDNESDAY, "work work");
enummap.put(Day.THURSDAY, "work work");
enummap.put(Day.FRIDAY, "work work");
enummap.put(Day.SATURDAY, "have fun");
enummap.put(Day.SUNDAY, "have fun");
System.out.println(enummap);
//用get方法输入key值获得今天的工作信息
String job = (String) enummap.get(today);
System.out.println("job is:" + job);
}
}
打印
{MONDAY=work work, TUESDAY=work work, WEDNESDAY=work work, THURSDAY=work work, FRIDAY=work work, SATURDAY=have fun, SUNDAY=have fun}
job is:work work
EnumSet 枚举Set 其中的值不可以重复
public class JDK5TestEnum {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(Day.FRIDAY);
list.add(Day.SUNDAY);
list.add(Day.MONDAY);
list.add(Day.MONDAY);
System.out.println(list);
EnumSet set = EnumSet.copyOf(list);
System.out.println(set);
}
}
打印
[FRIDAY, SUNDAY, MONDAY, MONDAY]
[MONDAY, FRIDAY, SUNDAY]
switch枚举
public class JDK5TestEnum {
public static void main(String[] args) {
Day data = Day.MONDAY;
// String data = "MONDAY";
switch (data) {
case MONDAY:
System.out.println(data);
break;
case FRIDAY:
System.out.println(data);
break;
case SATURDAY:
System.out.println(data);
break;
default :
break;
}
}
}
3.自动拆箱装箱
将 primitive 类型转换成对应的 wrapper 类型:Boolean、Byte、Short、
Character、Integer、Long、Float、Double
以Integer为例
public class JDK5Integer {
public static void main(String[] args) {
Integer i = new Integer(129);
int j = 129;
System.out.println(i == j);
System.out.println(i.equals(j));
}
}
equals会自动装箱拆箱
4.可变参数
public class JDK5Integer {
public static void main(String[] args) {
print("hahah","aafasf","asdasdas","greger");
}
public static void print(String str1,String ... strings) {
System.out.println(str1);
for (int i =0; i < strings.length; i++) {
System.out.println(strings[i]);
}
}
}
注意,可变参数只能出现在最后一个元素,同时同一个方法参数最多只有两个可变参数 而且在继承重写实现方法的时候,要统一为统一参数写法
5.注解
Inherited 表示该注解是否对类的子类继承的方法等起作用
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }
Target 类型
Rentation 表示 annotation 是否保留在编译过的 class 文件中还是在运行时可读
6.增强for循环 for/in
for/in 循环办不到的事情:
(1)遍历同时获取 index
(2)集合逗号拼接时去掉最后一个
(3)遍历的同时删除元素
public class JDK5Integer {
public static void main(String[] args) {
print("hahah","aafasf","asdasdas","greger");
}
public static void print(String str1,String ... strings) {
System.out.println(str1);
for(String str : strings){
System.out.println(str);
}
}
}
7.静态导入
何为静态导入 也就是说静态导入之后,就可以直接写这个常量而不用使用类名去调用
import static java.lang.Math.PI;
public class JDK5Integer {
public static void main(String[] args) {
System.out.println(PI);
}
}
但是一般不使用静态导入
8.print输出格式化
C语言中可以格式化输出,限制Java自从JDK5.0也有了,但是使用的不多
格式化规定符
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
9.并发支持(JUC)
更多会在 多线程篇详细讲解
10.Arrays 、Queue 、线程安全 StringBuilder
Arrays 工具类
Arrays.sort(myArray);
Arrays.toString(myArray)
Arrays.binarySearch(myArray, 98)
Arrays.deepToString(ticTacToe)
Arrays.deepEquals(ticTacToe, ticTacToe3)
Queue
避开集合的 add/remove 操作,使用 offer、poll 操作(不抛异常)
Queue 接口与 List、Set 同一级别,都是继承了 Collection 接口。LinkedList
实现了 Deque 接口。
public class QueueTest {
public static void main(String[] args) {
//采用它来实现 queue
Queue q = new LinkedList();
q.add("213");
q.add(1233);
System.out.println(q.poll());
}
}
StringBuilder
线程安全的字符串操作类
StringBuilder
线程不安全的字符串操作类