zoukankan      html  css  js  c++  java
  • java5新特性简单介绍

    新特性介绍

    java5是2004年9月份发布的,主要特性有泛型,枚举,可变参数,注解等。

    泛型

    先看一下泛型的简单使用

    public class Client {
      public static void main(String[] args) {
        List<String> names = new ArrayList<String>();
        names.add("lisi");
        String name = names.get(0);
        System.out.println(name);
      }
    }
    

    在java5之前的使用形式为

    public class Client {
      public static void main(String[] args) {
        List names = new ArrayList();
        names.add("lisi");
        String name = (String) names.get(0);
        System.out.println(name);
      }
    }
    

    我们不能确定List集合中可以放什么类型的元素,在类型转换时就可能出错。
    我们看一下java5版本例子反编译的结果

    public class Client {
        public static void main(String[] args) {
            List names = new ArrayList();
            names.add("lisi");
            String name = (String)names.get(0);
            System.out.println(name);
        }
    }
    

    可以看到反编译之后就没有泛型了,这个就是类型擦除,泛型信息只会在编译期存在,编译后的字节码中不会保存。

    枚举

    public enum UserGenderEnum {
      MALE("0", "男"),
      FEMALE("1", "女"),
      NOT_KNOWN("2", "未知");
    
      private final String code;
      private final String info;
    
      UserGenderEnum(String code, String info) {
        this.code = code;
        this.info = info;
      }
    
      public String getCode() {
        return code;
      }
    
      public String getInfo() {
        return info;
      }
    }
    
    public class Client {
      public static void main(String[] args) {
        EnumMap<UserGenderEnum, String> enumMap = new EnumMap<>(UserGenderEnum.class);
        enumMap.put(UserGenderEnum.MALE, "male");
        System.out.println(enumMap.get(UserGenderEnum.MALE));
        UserGenderEnum male = UserGenderEnum.MALE;
        switch (male) {
          case MALE:
            System.out.println("male");
            break;
          case FEMALE:
            System.out.println("female");
            break;
          case NOT_KNOWN:
            System.out.println("not_known");
            break;
        }
      }
    }
    

    枚举的使用还是很简单的,Enum是所有枚举都会继承的抽象类,EnumMap,EnumSet是java提供的工具类,java也提供了对枚举的switch的支持,关于枚举的更多原理,请看枚举这篇博客。

    自动装箱和拆箱

    装箱就是primitive类型转成对应的wrapper类型,拆箱就是反过来,Boolean,Byte,Character,Integer,Short,Long,Double,Float
    下面以int和Integer来演示

    public class Client {
      public static void main(String[] args) {
        Integer score = 98;//自动装箱
        System.out.println(score);
        int newScore = score + 2;//自动拆箱
        System.out.println(newScore);
      }
    }
    

    看一下反编译结果

    public class Client {
        public static void main(String[] args) {
            Integer score = Integer.valueOf((int)98);
            System.out.println((Object)score);
            int newScore = score.intValue() + 2;
            System.out.println((int)newScore);
        }
    }
    

    可以看到自动装箱就是编译器帮我们调用了valueOf方法,拆箱就是调用了intValue方法。

    可变参数

    public class Client {
      public static void main(String[] args) {
        System.out.println(sum(1, 2, 3));
      }
    
      private static int sum(int... nums) {
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
          sum += nums[i];
        }
        return sum;
      }
    
    }
    

    反编译结果

    public class Client{
    
        public Client(){
        }
    
        public static void main(String args[]){
            System.out.println(sum(new int[] {
                1, 2, 3
            }));
        }
    
        private static transient int sum(int nums[]){
            int sum = 0;
            for(int i = 0; i < nums.length; i++)
                sum += nums[i];
    
            return sum;
        }
    }
    

    可以看到可变参数的本质就是数组。

    增强for循环

    public class Client {
      public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4};
        for (int num : nums) {
          System.out.println(num);
        }
        List<String> nameList = new ArrayList<>();
        nameList.add("lisi");
        nameList.add("zhangsan");
        nameList.add("wangwu");
        for (String name : nameList) {
          System.out.println(name);
        }
      }
    }
    

    反编译结果为

    public class Client{
    
        public Client(){
        }
    
        public static void main(String args[]){
            int nums[] = {
                1, 2, 3, 4
            };
            int ai[] = nums;
            int i = ai.length;
            for(int j = 0; j < i; j++){
                int num = ai[j];
                System.out.println(num);
            }
    
            List nameList = new ArrayList();
            nameList.add("lisi");
            nameList.add("zhangsan");
            nameList.add("wangwu");
            String name;
            for(Iterator iterator = nameList.iterator(); iterator.hasNext(); System.out.println(name))
                name = (String)iterator.next();
    
        }
    }
    

    可以看到增强for循环也是语法糖。

    注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Log {
      String value();
    }
    
    @Log("hello")
    public class User {
    }
    
    public class Client {
      public static void main(String[] args) {
        Log log = User.class.getAnnotation(Log.class);
        System.out.println(log.value());
      }
    }
    

    结果为

    hello
    

    静态导入

    import static java.lang.Math.PI;
    import static java.lang.Math.max;
    
    public class Client {
      public static void main(String[] args) {
    
        System.out.println(max(2, 5));
        System.out.println(PI);
      }
    }
    

    反编译结果为

    public class Client{
    
        public Client(){
        }
    
        public static void main(String args[]){
            System.out.println(Math.max(2, 5));
            System.out.println(3.1415926535897931D);
        }
    }
    

    还是语法糖。

    并发支持(JUC类库)

    提供了一些原子类如AtomicInteger,线程池工具Executors,线程安全的容器ConcurrentHashMap等。

    java.lang.instrument类库

    具体可以看这篇这篇

    StringBuilder

    非线程安全的字符串连接工具

  • 相关阅读:
    RapidJavaEE 项目 开发流程说明
    [转]Ext自定义vtype动态验证
    博客园cnblogs chrome右键插件 开发
    extjs 2.0 回车切换表单,支持chrome,firefox,ie
    简单备份策略
    搜狗室验室 Web开发相关技术报告下载
    <转>记录一些BCB6的使用心得
    (转)远程桌面3389多用户登陆补丁及端口修改(XP+WIN7)
    <转>Java调用C/C++编写的第三方dll动态链接库(非native API) JNI
    清理SVN目录中.SVN
  • 原文地址:https://www.cnblogs.com/strongmore/p/13282777.html
Copyright © 2011-2022 走看看