`

JDK5.0 新特性

    博客分类:
  • java
 
阅读更多
1.AutoBoxing
原来int是非Object,在JDK5.0终于提供了autoboxing功能。

如: int i=0;

Integer j = i+1;

2. 范型
泛型(Generic):
//类型安全,不用转型
List<String> list = new ArrayList<String>();

//说明class A是范型类,T可以是任意类型
//多个类型参数的时候,用逗号分开 <T,V>
//接口用法一样
class A<T>{
    private T t;
    public void setT(T t){
        this.t = t;
    }
}

public class Test{
    public static void main(String[] args){
        A<String> a = new A<String>();
        a.setT("str")    //规范了class A里的T类型,所以只能传递String进去
    }
}
受限范型
public class Limited<T extends Number> {
    public static void main(String[] args) {
        Limited<Integer> number;   //正确
        Limited<String> str;       //编译错误
    }
}



通配符
public void print(List<?> list){ // 如写成 List<T> 编译就会报错
    // ..
}
public void draw2All(List<? extends Shape> shapes){ //可以是任何Shape的子类
    // ..
}
范型方法:
public class Test {
    public static void main(String[] args) throws Exception {
//         可换成Integer[] a = {1,2,3},但List的类型也必须由String换成Integer: List<Integer> ..
        String[] a = {"1","2","3"};
        List<String> list = new ArrayList<String>();
        System.out.println(list.size());
        fromArrayToCollection(a,list); // fromArrayToCollection方法强制了参数的类型
        System.out.println(list.size());
    }

    public static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
        for (T o : a)
            c.add(o);
    }
}



For-Each循环:
Object[] os = new Object[5];
for(Object o : os){
    // ..
}
//和"泛型"配合的话:
List<String> list = new ArrayList<String>();
for(String s : list){ // 可以直接告诉程序,遍历后的类型是 String
    // ..
}

自动装包/拆包(Autoboxing/unboxing):
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
//一般,jdk1.5降级到1.4,多少会产生点"自动装包/拆包问题"

枚举(Enums):
public enum Color
{
Red,
White,
Blue
}
// Color myColor = Color.Red;
// 提供了两个有用的静态方法values()和valueOf()
for (Color c : Color.values())
    System.out.println(c);

3.可变参数
可变参数(Varargs):
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);
// 为了解决此类问题(如多态问题),可用"可变参数"
public void write(Object...objs){
    // ..
}
// 注:传入的参数(如果有)会被当作一个数组处理,如要知道参数的数量,可取length

比如:

public List find(String hql, Object... values),避免了以前的大量重复定义

4.三种内置Annotation
  JDK5.0 有SuppressWarnings,Deprecated和Override 三种内置的annotation:

  @Override

   此标签一方面提醒用户这是个重载函数,另一方面保证了父类函数的参数或者名字改变时,子类如果没有跟着变化,就会编译不过。

   虽然有点占地方,但用处的确很大,不会哪天子类被人卖了都不知道。

  所以我设置了让IDEA6检查所有重载函数必须加上@Override标识。

  @SuppressWarnings("unchecked")

    此标签可以让编译器忽略某种warning信息,比如减少JDK5.0的集合操作引入范型后无处不在的warning。

    因为有些非JDK5.0的开源库如hibernate, 函数返回的一定是List,而不会是List<User>,这时候IDE就会爆出很多warning。用SuppressWarning("unchecked")可以取消掉它。

  @Deprecated
   此标签以前写在JavaDoc里,现在提为annotation,注释已废弃的函数。用户使用该函数的话,编译时会得到"你用了废柴"的提示。

5.静态导入
// "静态导入"会降低程序可读性,如无特殊需求,不建议使用
import static java.lang.Math.*; //是Math.* 不是Math
double d = sin(PI * 2); //无需再写 Math.sin(Math.PI * 2);

6.java.util.Scanner(扫描器)
//读取Console的内容
Scanner sc = new Scanner(System.in);
int i = sc.nextInt(); //可以是 nextXX()
//正则分割(类似Strint.split(xx))
String input = "a xx b xx c xx d xx";
Scanner sc = new Scanner(input).useDelimiter("//s*xx
s*");
while(sc.hasNext()){
    System.out.println(sc.next());
}

7.printf 和 java.util.Formatter:
//类似C里面的printf,喜欢的人可以用
//printf(Locale l, String format, Object... args)
//printf(String format, Object... args)
System.out.printf("%08d %s /n",5,"ss"); // 00000005 ss (换行)
//和 out.format(format, args) 效果相同

//还可以用 Formatter
String s = new Formatter().format("%08d %s /n", 5,"ss").toString();
System.out.println(s);

另外:
BigDecimal 多了很多实用方法,算钱方便多了~
Double 和 Float 提供了toHexString()方法(以前Integer/Long有)
Interger 位操作的扩充函数
System.clearProperty(String key) 清除一个属性(从前有getProperty()有setProperty(),但没有remove)
Double/Float/Long/Integer/Short/Byte等,都加入了一个静态常量 SIZE ,如Double.SIZE = 64

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics