JDK5的一些新特性
一、泛型
* 為什么要使用泛型?
- 一般使用在集合上
** 比如現(xiàn)在把一個字符串類型的值放入到集合里面,這個時候,這個值放入到集合之后,失去本事的類型,只能是object類型,
這個時候,比如想要對這個值進(jìn)行類型轉(zhuǎn)換,很容易出現(xiàn)類型轉(zhuǎn)換錯誤,怎么解決這個問題,可以使用泛型來解決。
* 在集合上如何使用泛型
- 常用集合 list ?set ?map
- 泛型語法 集合<String> ?比如 List<String>
* 在泛型里面寫是一個對象,String 不能寫基本的數(shù)據(jù)類型 比如int (****)
** 寫基本的數(shù)據(jù)類型對應(yīng)包裝類
short -- Short
int -- Integer
long -- Long
float -- Float
double -- Double
char ? -- Character
boolean -- Boolean
* 在List上使用泛型
List:有序,存入和取出的順序一致,元素都有索引,元素可以重復(fù)
????????????????????ArrayList :內(nèi)部是數(shù)組數(shù)據(jù)結(jié)構(gòu),不同步。替代了Vector。查詢速度快。
????????????????????linkedList: 內(nèi)部是鏈表數(shù)據(jù)結(jié)構(gòu),不同步。增刪快。
????????????????????Vector:內(nèi)部是數(shù)組數(shù)據(jù)結(jié)構(gòu),是同步的。
//遍歷list集合 有三種方式
//普通for循環(huán) ?迭代器 ?增強(qiáng)for
Set:元素不能重復(fù),無序?
????????????????????HashSet:內(nèi)部數(shù)據(jù)結(jié)構(gòu)是哈希表,不同步
????????????????????TreeSet:可以對Set集合中的元素進(jìn)行排序,通過Comparable接口或覆蓋comPareTo方法。
//遍歷set 有兩種方式
//迭代器 ?增強(qiáng)for
Set<String> set = new HashSet<String>();set.add("hello");set.add("world");set.add("java");// 增強(qiáng)forfor (String string : set) {System.out.println(string);}System.out.println("-------------");// 迭代器迭代Iterator<String> it = set.iterator();while (it.hasNext()) {System.out.println(it.next());}結(jié)果為: ? ? ?(內(nèi)部哈希算法排序,無序) hello java world ------------- hello java world * 在map上面使用泛型- map結(jié)構(gòu):key-value形式
????????????????? ? Hashtable:內(nèi)部結(jié)構(gòu)是哈希表,同步。不允許null作為鍵和值。
????????????????? ? HashMap:內(nèi)部結(jié)構(gòu)是哈希表,不同步。允許null作為鍵和值。
????????????????? ? TreeSet:內(nèi)部結(jié)構(gòu)是二叉樹,不同步。可以對Map集合中的鍵進(jìn)行排序。
//遍歷map有兩種方式
//1、獲取所有的key,通過key得到value 使用get方法
//2、獲取key和value的關(guān)系
二、泛型定義在方法上
????? ? public <T> void show(T str){ ? ? ? ?}
???????? * 寫在返回值之前 ?void之前 <T>
????????*?表示定義了一個類型 這個類型是 T
????????* 在下面就可以使用這個類型了 ?T
* 定義一個數(shù)組,實(shí)現(xiàn)指定位置上數(shù)組元素的交換
????????public static <T> void swap1(T[] arr ,int a,int b) {
????????T temp = arr[a];
????????arr[a] = arr[b];
????????arr[b] = temp;
????????}
練習(xí):實(shí)現(xiàn)一個泛型方法,接受任意一個數(shù)組,顛倒數(shù)組中所有元素
public static void main(String[] args) {Integer[] integers = { 1, 2, 3, 4, 5, 6, 9, 15 };reverseArr(integers);String[] strings = { "hello", "world", "java" };reverseArr(strings);}public static <T> void reverseArr(T[] arr) {for (int i = 0; i < arr.length / 2; i++) {T t = arr[i];arr[i] = arr[arr.length - 1 - i];arr[arr.length - 1 - i] = t;}System.out.println(Arrays.toString(arr));}三、泛型在類上的使用
* 在一個類上定義一個類型,這個類型可以在類里面直接使用* public class TestDemo04<T> {
//在類里面可以直接使用T的類型
T aa;
public void test11(T bb) {}
//寫一個靜態(tài)方法 在類上面定義的泛型,不能再靜態(tài)方法里面使用
public static <A> void test12(A cc) {}
}
四、泛型的通配符
? ??? ? ? ?:可以對類型進(jìn)行限定
????????????? ? ? extends E:接收E類型或者E類型的子類型對象 ? ? ? ?上限
????????????? ? ? super E:接收E類型或者E類型的父類型 ? ? ? ? ? ? ? ? ?下限
????? ? 一般存儲元素的時候使用上限,因?yàn)檫@樣取出都是按照上限類型來運(yùn)算的。不會出現(xiàn)安全隱患。
????? ? 對集合中的元素進(jìn)行取出操作時,用下限。
五、枚舉的簡介
* 什么是枚舉?** 需要在一定的范圍內(nèi)取值,這個值只能是這個范圍內(nèi)中的任意一個。
** 現(xiàn)實(shí)場景:交通信號燈,有三種顏色,但是每次只能亮三種顏色里面的任意一個
* 使用一個關(guān)鍵字 enum
** enum Color{
RED,GREEN,YELLOW;
}
* 枚舉的構(gòu)造方法也是私有的
* 特殊枚舉的操作(了解)
** 在枚舉類里面有構(gòu)造方法
** 構(gòu)造方法里面有參數(shù),需要在每個實(shí)例上面都寫參數(shù)
** 在枚舉類里面有抽象方法
** 在枚舉的每個實(shí)例里面都重寫這個抽象方法
六、枚舉的API操作
** name() :返回枚舉的名稱** ordinal() :枚舉的下標(biāo),下標(biāo)從0開始
** valueOf(Class<T> enumType, String name) :得到枚舉的對象
** 還有兩個方法,但是這兩個方法不在api里面,編譯的時候生成兩個方法
*** valueof(String name) ?轉(zhuǎn)換枚舉對象
*** values() ?獲得所有枚舉對象數(shù)組
* 練習(xí):枚舉對象、枚舉對象下標(biāo)、枚舉對象名稱表示之間的轉(zhuǎn)換
- //知道枚舉的對象,得到枚舉名稱和下標(biāo)
@Test
public void test1() {
//得到枚舉對象
Color col = Color.RED;
//枚舉名稱
String name = col.name();
//枚舉的下標(biāo)
int idx = col.ordinal();
System.out.println(name+" "+idx);
}
- //知道枚舉的名稱,得到枚舉的對象和下標(biāo)
@Test
public void test2() {
String name1 = "GREEN";
//得到對象
Color col = Color.valueOf(name1);
//枚舉下標(biāo)
int idx1 = col.ordinal();
System.out.println(idx1);
}
- //知道枚舉的下標(biāo),得到枚舉的對象和名稱
@Test
public void test3() {
int idx2 = 2;
//得到枚舉的對象
Color[] cols = Color.values();
//根據(jù)下標(biāo)得到對象
Color col = cols[idx2];
//得到枚舉的名稱
String name = col.name();
System.out.println(name);
}
七、靜態(tài)導(dǎo)入(了解)
* 可以在代碼里面,直接使用靜態(tài)導(dǎo)入方式,導(dǎo)入靜態(tài)方法或者常量* import static XX.XX.xxx
import static java.lang.System.out; import static java.util.Arrays.sort; import static java.util.Arrays.toString; public class TestDemo1 {public static void main(String[] args) {out.println("hello");int[] arr1 = {10,1,3,20,15};sort(arr1);//System.out.println(toString(arr1));} }
八、自動拆裝箱
* 裝箱** 把基本的數(shù)據(jù)類型轉(zhuǎn)換成包裝類
* 拆箱
** 把包裝類轉(zhuǎn)換成基本的數(shù)據(jù)類型
** //自動裝箱
Integer i = 10;
//自動拆箱
int m = i;
** 在jdk1.4里面如何實(shí)現(xiàn)裝箱和拆箱
- //在jdk1.4里面實(shí)現(xiàn)拆裝箱
public void test1() {
//裝箱
Integer m = new Integer(10);
//拆箱
int a = m.intValue();
}
** jdk是會向下兼容
- 比如 jdk1.4里面寫的代碼,這個時候到5.0里面也可以運(yùn)行
** 練習(xí):向下兼容
== 執(zhí)行的結(jié)果是會調(diào)用 ?doSomething(double m)
== 首先在jdk1.4里面肯定調(diào)用這個方法,如果調(diào)用下面的方法,需要類型轉(zhuǎn)換,但是jdk1.4不能實(shí)現(xiàn)自動拆裝箱
== 由于jdk是向下兼容,所以,在jdk1.4調(diào)用這個方法,在jdk5.0里面還是會調(diào)用這個方法
public static void main(String[] args) {
doSomething(10); ? ?//double......
}
public static void doSomething(double m) {
System.out.println("double......");
}
public static void doSomething(Integer a){
System.out.println("integer.....");
}?
九、增強(qiáng)for循環(huán)
* 語法 for(變量類型 ?變量名: 要迭代的數(shù)組或集合) {}- for(String s : list) {
System.out.println(s);
}
* 使用場景: 數(shù)組;實(shí)現(xiàn)Iterable接口的集合 可以使用增強(qiáng)for循環(huán)
* 在集合上使用增強(qiáng)for循環(huán)遍歷
list ?set 實(shí)現(xiàn)了Iterator接口,所以可以使用增強(qiáng)for循環(huán)
map不能使用增強(qiáng)for循環(huán),沒有實(shí)現(xiàn)Iterator接口,所以不能使用增強(qiáng)for循環(huán)
????????????????????? ? 可以通過Map的entrSet方法或者KeySet方法現(xiàn)獲取到Set集合在使用增強(qiáng)for
* 增強(qiáng)for循環(huán)出現(xiàn)目的:為了替代迭代器
** 增強(qiáng)for底層就是迭代器實(shí)現(xiàn)的
十、可變參數(shù)
* 可變參數(shù)可以應(yīng)用在什么場景:** 實(shí)現(xiàn)兩個數(shù)的相加,實(shí)現(xiàn)三個數(shù)的相加 四個數(shù)的相加
-- 如果實(shí)現(xiàn)的多個方法,這些方法里面邏輯基本相同,唯一不同的是傳遞的參數(shù)的個數(shù),可以使用可變參數(shù)
* 可變參數(shù)的定義方法:數(shù)據(jù)類型...數(shù)組的名稱
* 理解為一個數(shù)組,這個數(shù)組存儲傳遞過來的參數(shù)
- 代碼
public static void add1(int...nums) {
//nums理解為一個數(shù)組,這個數(shù)組存儲傳遞過來的參數(shù)
//System.out.println(nums.length);
int sum = 0;
//遍歷數(shù)組
for(int i=0;i<nums.length;i++) {
sum += nums[i];
}
System.out.println( sum);
}
* 注意的地方
(1)可變參數(shù)需要寫在方法的參數(shù)列表中,不能單獨(dú)定義
(2)在方法的參數(shù)列表中只能有一個可變參數(shù)
(3)方法的參數(shù)列表中的可變參數(shù),必須放在參數(shù)最后
- add1(int a,int...nums)
總結(jié)
以上是生活随笔為你收集整理的JDK5的一些新特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xml解析案例:一个简单的学生管理系统
- 下一篇: java反射机制和junit的使用