1. 程式人生 > >java [33] jdk5新特性

java [33] jdk5新特性

Jdk5新特性:

  1. 靜態匯入
  2. 自動裝箱/拆箱
  3. 增強for迴圈
  4. 可變引數
  5. 列舉 反射型別
  6. 泛型
  7. 元資料

 

一、靜態匯入

匯入靜態方法,使用起來更加簡潔,不好用;

目錄

一、靜態匯入

二、自動裝箱/拆箱

三、增強for迴圈

四、可變引數

五、列舉

六、反射

七、內省(xing)操作javabean的屬性

八、泛型


import static java.lang.System.out;

public class demo1 {

         public static void main(String[] args) {

                   out.println("靜態匯入");

                  

         }

}

 

二、自動裝箱/拆箱

自動裝箱:開發人員可以把一個基本的資料型別直接賦值給對應的包裝類。

自動拆箱:開發人員可以把一個包裝類物件直接賦值給物件的基本資料型別。

典型應用:

List list = new ArrayList();

List.add(1);

Int j = (integer) list.get(0);

import java.util.ArrayList;

import java.util.List;



public class demo1 {

    public static void main(String[] args) {

        //1.5 jvm

        Integer i =1;  //裝箱

        int j = i;     //拆箱

       

        //典型應用

        List list = new ArrayList();

        list.add(new Integer(1));  //1.5以前

        list.add(2);

        list.add(3);

    }

}

 

三、增強for迴圈

增強for迴圈只能應用在陣列或者實現Iterable介面的集合類上。比如set list.使用map時需要轉換

語法格式:

for (變數型別 變數 : 需要迭代的陣列或者集合){

 

}

package demo;



import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;



import org.junit.Test;



public class demo2 {

    @Test

    public void test1() {

        int arr[] = {1,2,3};

        for (int i:arr){

           

            System.out.println(i);

        }

    }

    @Test

    public void test2(){

        List list = new ArrayList();

        list.add(1);

        list.add(2);

        list.add(3);

        for (Object obj:list){

            int i = (Integer)obj;

            System.out.println(i);

        }  

    }

   

    @Test

    public void test3(){

        //結果是無序的

        Map map = new HashMap();

        map.put("1", "apple");

        map.put("2", "banana");

        map.put("3", "orange");

       

        //傳統方式一

        Set set = map.keySet();

        Iterator it = set.iterator();

        while(it.hasNext()){

            String key=(String) it.next();

            String value = (String) map.get(key);

            System.out.println(key + "=" + value);

        }

        //傳統方式2

        Set set1 = map.entrySet();//entrySet() 返回此對映中包含的對映關係的 Set 檢視。

        Iterator it1 = set1.iterator();

        while (it1.hasNext()){

            Map.Entry entry = (Entry) it1.next();

            String key = (String) entry.getKey();

            String value = (String) entry.getValue();

            System.out.println(key + "=" + value);

           

        }

    }

   

    @Test

    public void test4(){

        //結果是有序的

        Map map = new LinkedHashMap();

        map.put("1", "apple");

        map.put("2", "banana");

        map.put("3", "orange");

       

        //傳統方式一

        //Iterator<E> iterator()

        //返回此對映中包含的鍵的 Set 檢視

        Set set = map.keySet();

       

        // 返回在此 set 中的元素上進行迭代的迭代器。

        Iterator it = set.iterator();

        //hasNext() 如果仍有元素可以迭代,則返回 true。

        while(it.hasNext()){

            String key=(String) it.next(); //next() 返回迭代的下一個元素。

            String value = (String) map.get(key);

            System.out.println(key + "=" + value);

        }

    }

    @Test

    public void test5(){

        //結果是無序的

        Map map = new HashMap();

        map.put("1", "apple");

        map.put("2", "banana");

        map.put("3", "orange");

       

        //增強for取map的第一種方式

        for (Object obj:map.keySet()){

            String key = (String) obj;

            String value = (String) map.get(obj);

            System.out.println(key + "=" + value);

        }

        //增強for取map的第2種方式

        for (Object obj : map.entrySet()){

            Map.Entry entry = (Entry) obj;

            String key = (String) entry.getKey();

            String value = (String) entry.getValue();

            System.out.println(key + "=" + value);

        }

    }

   

    //使用增強for迴圈注意事項:增強for 適合取數值,不適合做更改。

    @Test

    public void test6(){

        int arr[] = {1,2,3};

        for (int i:arr){

            i=10;

        }

        System.out.println(arr[0]);

        System.out.println(arr[1]);

        System.out.println(arr[2]);

       

       

    }

}

例項:

四、可變引數

 格式:

    public void sum(int ...nums){

        //可變引數可看成陣列

    }

 

例項

package demo;



import java.util.Arrays;

import java.util.List;



import org.junit.Test;



public class demo3 {



    @Test

    public void testsum(){

        sum(1,2,3,4,5,6);

       

    }

    public void sum(int ...nums){

        //可變引數可看成陣列

        int sum =0;

        for (int i:nums){

            sum+=i;

        }

        System.out.println(sum);

       

    }

   

    //可變引數需要注意事項

    public void aa(int x,int ...nums){

       

    }

    @Test

    public void bb(){

        List list = Arrays.asList("1","2","3");

        System.out.println(list);

       

        String arrs[] ={"1","2","3","4"};

        list = Arrays.asList(arrs);

        System.out.println(list);

       

        int nums[] = {1,2,3,5};  //返回記憶體

        list = Arrays.asList(nums);

        System.out.println(list);

       

        Integer sums[] = {1,2,3,6};

        list = Arrays.asList(sums);

        System.out.println(list);

       

       

    }

}

 

五、列舉

https://blog.csdn.net/qq_38125626/article/details/81873547

 

六、反射

https://blog.csdn.net/qq_38125626/article/details/81741980

 

七、內省(xing)操作javabean的屬性

package test1;



public class People {   //javabean

    public String name;   //欄位 ,只有欄位提供了get和set方法才有了屬性

    private String passwd;

    public int age;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getPasswd() {

        return passwd;

    }

    public void setPasswd(String passwd) {

        this.passwd = passwd;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getab(){

        return null;

       

    }



}

 

     

package test1;



import java.beans.BeanInfo;

import java.beans.IntrospectionException;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;



import org.junit.Test;



//類 Introspector

//Introspector 類為通過工具學習有關受目標 Java Bean 支援的屬性、事件和方法的知識提供了一個標準方法。



//public static BeanInfo getBeanInfo(Class<?> beanClass) throws IntrospectionException

//在 Java Bean 上進行內省,瞭解其所有屬性、公開的方法和事件。





//使用內省api操作bean屬性

public class Demo4 {
     //得到bean的所有屬性

         @Test

         public void test1() throws IntrospectionException{

                  

                   //內省 瞭解其內省、公開的方法和事件(包含從父類繼承的屬性)

                   BeanInfo info = Introspector.getBeanInfo(People.class);

                  

                   //不獲取父類的屬性

                   //BeanInfo info = Introspector.getBeanInfo(People.class,Object.class);

                  

                   //返回描述受此 bean 支援的可編輯屬性的 PropertyDescriptor 陣列。

                   PropertyDescriptor[] pds= info.getPropertyDescriptors();

                   for (PropertyDescriptor pd:pds){

                            System.out.println(pd.getName());

                   }

         }

        

         //操縱bean的指定屬性

         @Test

         public void test2() throws Exception{

                   People obj = new People();

                   PropertyDescriptor pd = new PropertyDescriptor("age", People.class);

                   Method md = pd.getWriteMethod();

                   md.invoke(obj, 15);

                   System.out.println(obj.getAge());

                  

                   md = pd.getReadMethod();

                   System.out.println(md.invoke(obj, null));

                  

         }



}

 

使用beanUtils操縱bean的屬性

package test1;



import java.lang.reflect.InvocationTargetException;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;



import org.apache.commons.beanutils.BeanUtils;

import org.apache.commons.beanutils.ConversionException;

import org.apache.commons.beanutils.ConvertUtils;

import org.apache.commons.beanutils.Converter;

import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

import org.junit.Test;





//使用beanUtils操縱bean的屬性

public class Demo5 {

   

    @Test

    public void test1() throws IllegalAccessException, InvocationTargetException{

        People p = new People();

        BeanUtils.setProperty(p, "name", "xxf");

       

        System.out.println(p.getName());

    }

   

    @Test

    public void test2() throws IllegalAccessException, InvocationTargetException{

        People p = new People();

        String name = "aaa";

        String passwd = "1234";

        String age = "15";

        BeanUtils.setProperty(p, "name", name);

        BeanUtils.setProperty(p, "passwd", passwd);

        BeanUtils.setProperty(p, "age", age);

       

        System.out.println(p.getName());

        System.out.println(p.getAge());

        System.out.println(p.getPasswd());

    }

   

    @Test

    public void test3() throws IllegalAccessException, InvocationTargetException{

       

        People p = new People();

        String birthday = "1989-08-28";

        //beanUtils只支援基本資料型別的資料轉換。

        //為了將日期賦值到bean的birthday屬性上,給beanUtils註冊一個日期轉換器

        ConvertUtils.register(new Converter() {

           

            public <T> T convert(Class<T> type, Object value) {

                if (value ==null){

                    return null;

                }

                if (!(value instanceof String)){

                    throw new ConversionException("只支援string型別的轉換");

                }

                String str = (String) value;

                if (str.trim().equals("")){

                    return null;

                }

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

                try {

                    return (T) sdf.parse(str);

                } catch (ParseException e) {

                    // TODO Auto-generated catch block

                    throw new RuntimeException(e);

                }

            }

        },Date.class);

       

        BeanUtils.setProperty(p, "birthday", birthday);

        System.out.println(p.getBirthday());

        Date date = p.getBirthday();

        System.out.println(date.toString());

        System.out.println(date.toLocaleString());

        }

   

    //在實際開發過程中beanutils自己已經寫好了轉換器

    @Test

    public void test4() throws IllegalAccessException, InvocationTargetException{

        People p = new People();

        String birthday = "1989-08-28";

        ConvertUtils.register(new DateLocaleConverter(), Date.class);

        BeanUtils.setProperty(p, "birthday", birthday);

        Date date = p.getBirthday();

        System.out.println(date.toLocaleString());

       

    }





    @Test

    public void test5(){

        Map map = new HashMap();

        map.put("name", "aaa");

        map.put("passwd", "123");

        map.put("age", "15");

        map.put("birthday", "1989-08-28");

        ConvertUtils.register(new DateLocaleConverter(), Date.class);

       

       

        People p = new People();

        try {

            BeanUtils.populate(p, map);  //用map集合中的值,填充bean屬性

        } catch (IllegalAccessException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (InvocationTargetException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        System.out.println(p.getName());

        System.out.println(p.getAge());

        System.out.println(p.getPasswd());

        Date date = p.getBirthday();

        System.out.println(date.toLocaleString()); 

    }  

}

八、泛型

使用泛型的注意事項:

使用泛型時,泛型型別須為引用型別,不能是基本資料型別 可以是interger 不能是int

泛型時提供給javac編譯器使用的,他用於限定集合的輸入型別,讓編譯器在原始碼級別上,即擋入向集合中插入非法資料,當編譯器編譯帶有泛型的java程式後,生成的class檔案將不再帶有泛型資訊,依次使程式的執行效率不收影響,這個過程稱之為擦除。

泛型的基本術語,以ArreyList<E>為例,<> type of

ArreyList<E>中的E稱為型別引數變數

ArreyList<Interger> 中的interger稱為實際型別引數

ArreyList<E>  泛型型別

ArreyList<Interger>稱為引數化的型別parameterizedtype

package cn.generic;



import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;



import org.junit.Test;



public class demo1 {

    public static void main(String[] args) {

        /*List list = new ArrayList();

        list.add("aaa");

        Integer i = (Integer) list.get(0);*/  //java.lang.String cannot be cast to java.lang.Integer

       

       

        List<String> list2 = new ArrayList<String>();

        list2.add("123");

        list2.get(0);

    }

    @Test

    public void test1(){

        List<String> list = new ArrayList<String>();

        list.add("aa");

        list.add("bb");

        list.add("cc");

        //返回一個迭代器

        Iterator<String> it = list.iterator();

        while(it.hasNext()){

            String value =it.next();

            System.out.println(value);

        }

       

       

    }

    @Test

    public void test2(){

        List<String> list = new ArrayList<String>();

        list.add("aa");

        list.add("bb");

        list.add("cc");

        for (String s :list){

            System.out.println(s);

        }

       

       

    }

    @Test

    public void test3(){

        Map<Integer, String> map = new HashMap<Integer,String>();

        map.put(1,"aa");

        map.put(2, "bb");

        map.put(3, "cc");

       

        //傳統keyset entryset

        Set<Map.Entry<Integer, String>> set = map.entrySet();

        Iterator<Map.Entry<Integer, String>> it = set.iterator();

        while (it.hasNext()){

            Map.Entry<Integer, String> entry= it.next();

            int key = entry.getKey();

            String value = entry.getValue();

            System.out.println(key  + ":" + value);

        }

       

        //增強for

        for (Map.Entry<Integer, String> entry:map.entrySet()){

            int key = entry.getKey();

            String value = entry.getValue();

            System.out.println(key  + ":" + value);

        }

       

       

    }



}

自定義泛型方法

Java程式中的普通方法,構造方法和靜態方法,都可以使用泛型,方法使用泛型前,必須對泛型進行宣告,語法<T>,T可以是任意字母,但通常必須要大寫。<T>通常需要放在方法的返回值宣告之前。例如:

Public static <T> void doxx(T t);

package cn.generic;





//自定義帶反省的方法

public class Demo2<T> {

    public void testa(){

        //a("aaa");

    }

    public T a(T t){

        return null;

       

    }

   

    public <E,K> void b(T t,E e,K k){

       

    }

   

   

    //靜態方法需要宣告型別

    public static <T> void c(T t){

       

       

    }



}





package cn.generic;



public class Demo3 {



   

    //編寫一個泛型方法,實現指定位置上的陣列元素的交換。

    public <T> void swap(T arr[],int pos1,int pos2){

        T temp =arr[pos1];

        arr[pos1] = arr[pos2];

        arr[pos2] = temp;

       

       

    }

    //編寫一個泛型方法,接收任意一個數組,並且顛倒陣列中的所有元素

    public <T> void reverse(T arr[]){

        int start = 0;

        int end = arr.length-1;

        while (true){

            if (start>=end){

                break;

            }

            T temp = arr[start];

            arr[start] = arr[end];

            arr[end] = temp;

           

            start++;

            end--;

           

        }

       

       

    }

}