JDK1.5新特性
JDK1.5新特性
一、靜態匯入
靜態匯入:jdk1.5新特性
格式:
import static 包名.類名.靜態成員;
作用範圍:一個類的所有靜態成員
未使用靜態匯入:需要重複書寫多個Collections
import java.util.ArrayList; import java.util.Collections; public class Demo8 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(3); list.add(5); list.add(4); list.add(2); list.add(1); //排序 Collections.sort(list); System.out.println("集合的元素是:"+list);//集合的元素是:[1, 2, 3, 4, 5] //索引值 int binarySearch = Collections.binarySearch(list, 4); System.out.println("索引值:"+binarySearch);//索引值:3 } }
使用靜態匯入:
import java.util.ArrayList; import java.util.Collections; /*import static java.util.Collections.sort; import static java.util.Collections.binarySearch;*/ import static java.util.Collections.*; public class Demo8 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(3); list.add(5); list.add(4); list.add(2); list.add(1); //排序 sort(list); System.out.println("集合的元素是:"+list);//集合的元素是:[1, 2, 3, 4, 5] //索引值 int binarySearch = binarySearch(list, 4); System.out.println("索引值:"+binarySearch);//索引值:3 } }
當本類和靜態匯入的方法名相同時,使用的是本類的方法。
只要靜態匯入的成員和本類的成員有同名的情況,都是使用本類的成員。
import java.util.ArrayList; import java.util.Collections; /*import static java.util.Collections.sort; import static java.util.Collections.binarySearch;*/ import static java.util.Collections.*; import static java.lang.System.out; public class Demo8 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(3); list.add(5); list.add(4); list.add(2); list.add(1); //作用在方法上 //排序 //指定呼叫靜態匯入的成員:相當於靜態匯入不起作用了 Collections.sort(list);//本類的sort方法 out.println("集合的元素是:"+list);//集合的元素是:[1, 2, 3, 4, 5] //索引值 int binarySearch = binarySearch(list, 4); out.println("索引值:"+binarySearch);//索引值:3 //作用在屬性上 out.println("xxx"); } public static void sort(ArrayList<Integer> list) { System.out.println("本類的sort方法"); } }
注意:如果靜態匯入的成員與本類的成員存在同名的情況下,那麼預設使用本類的靜態成員,如果需要指定使用靜態匯入的成員,那麼需要在靜態成員前面加上類名。
二、增強for迴圈
作用:簡化迭代器的書寫格式
適用範圍: 實現了Iterable介面的物件或者是陣列物件
格式:
for(變數型別 變數名:遍歷的目標){ }
demo:
import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; public class Demo9 { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); //新增元素 set.add("1"); set.add("2"); set.add("3"); //使用迭代器遍歷 Iterator<String> it = set.iterator(); while(it.hasNext()) { String temp = it.next(); System.out.println("元素是:"+temp); it.remove(); } //使用增強for迴圈 for (String item : set) { System.out.println("元素是:"+item); //報錯:java.util.ConcurrentModificationException //在使用迭代器遍歷的過程中不準使用集合修改元素的個數 //set.remove("3"); } int[] arr = {1,2,3,4,5}; //普通for迴圈遍歷 for (int i = 0; i < arr.length; i++) { System.out.println("元素:"+arr[i]); } //使用增強for迴圈實現 for (int i : arr) { System.out.println("元素:"+i); } //遍歷map HashMap<String, String> map = new HashMap<String, String>(); map.put("1", "張三"); map.put("2", "李四"); map.put("3", "王五"); map.put("4", "趙六"); map.put("5", "陳七"); Set<Entry<String,String>> entrys = map.entrySet(); for (Entry<String, String> entry : entrys) { System.out.println("鍵:"+entry.getKey()+"值:"+entry.getValue()); } } }
注意:增強for迴圈的底層還是使用了迭代器遍歷。
增強for迴圈要注意的事項:
1.增強for迴圈底層也是使用了迭代器獲取的,只不過獲取迭代器由JVM完成,不需要我們獲取迭代器,所以在使用增強for迴圈遍歷元素的過程中不準使用集合物件對集合的元素個數進行修改。
2.迭代器遍歷元素與增強for迴圈遍歷元素的區別:使用迭代器遍歷集合的元素時可以刪除集合的元素,而增強for迴圈遍歷集合元素時,不能用迭代器的remove方法刪除元素。
3.普通for迴圈與增強for迴圈的區別:普通for迴圈可以沒有遍歷的目標,而增強for迴圈一定要有遍歷的目標。
注意:Map集合沒有實現Iterable介面,所以map集合不能直接使用增強for迴圈;需要使用增強for迴圈需要藉助Collection。
自定義類使用增強for迴圈
import java.util.Iterator; class MyList implements Iterable<String>{ Object[] arr = new Object[10]; int index = 0;//當前指標 public void add(Object o) { arr[index++] = 0; } public int size() { return index; } @Override public Iterator<String> iterator() { return new Iterator<String>() { int cursor = 0; @Override public boolean hasNext() { return cursor<index; } @Override public String next() { return (String) arr[cursor++]; } }; } } public class Demo10{ public static void main(String[] args) { MyList list = new MyList(); list.add("張三"); list.add("李四"); list.add("王五"); for (String item : list) { System.out.println(item); } } }
三、可變引數
格式:
資料型別... 變數名
要注意的事項:
1.如果一個函式的形參使用了可變引數後,那麼呼叫該方法的時候可以傳遞引數也可以不傳遞引數
2.可變引數實際上是一個數組物件
3.可變引數必須位於形參的最後一個
4.一個方法最多隻能有一個可變引數,因為可變引數要位於形參中最後一個位置
public class Demo11 { public static void main(String[] args) { add(); add(1); add(1,2); } public static void add(int... arr) { System.out.println("引數是:"+arr);//[I@15db9742 int result = 0; for (int i : arr) { result += i; } System.out.println("和是:"+result); } }
四、自動裝箱和自動拆箱
Java是面向物件的語言,任何事物都可以使用類來描述,sun使用一些類描述Java中八種資料型別
基本資料型別 | 包裝型別 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
自動裝箱: 自動把java的基本資料型別資料轉換成物件型別資料。
自動拆箱: 把引用型別的資料轉換成基本型別的資料
import java.util.ArrayList; public class Demo12 { public static void main(String[] args) { String str = "12"; //字串轉換成int型別資料。 可以把字串轉換成對應的數字 int i = Integer.parseInt(str); System.out.println(i+1); //把數字轉換成字串 System.out.println("把整數轉換成對應 的字串:"+Integer.toString(i)); //把整數轉換成對應的進位制形式 System.out.println("10的二進位制:"+ Integer.toBinaryString(10)); System.out.println("10的十六進位制:"+ Integer.toHexString(10)); //可以把字串當成對應的進行資料幫你轉換 String data = "10"; int a = Integer.parseInt(data, 2); System.out.println("a="+a); //集合: 集合是可以儲存任意物件型別資料的容器。 ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add(3); //自動裝箱: 自動把java的基本資料型別資料轉換成物件型別資料。 int temp = 10;//基本資料型別 Integer b =temp; //把a儲存的值賦予給b變數。 //自動拆箱: 把引用型別的資料轉換成基本型別的資料 Integer c = new Integer(13); int d = c; // System.out.println(d); //引用的資料型別 Integer e = 128; Integer f = 128; // Integer類內部維護 了緩衝陣列,該緩衝陣列儲存的-128~127 這些資料在一個數組中。 //如果你獲取的資料是落入到這個範圍之內的,那麼就直接從該緩衝區中獲取對應的資料。 System.out.println("同一個物件嗎?"+(e==f)); //false } }