公司網(wǎng)站建設(shè)應(yīng)注意深圳推廣公司推薦
?
目錄
泛型
? ? ? ? 泛型的定義:
? ? ? ? 泛型的實(shí)例化:
?????????泛型的使用:
????????順序表ArrayList
? ? ? ? 順序表ArrayList的兩種實(shí)例化方法:
? ? ? ? ArrayList常用的方法:
? ? ? ?1. add 方法
? ? ? ? 2. size ( ) 方法
? ? ? ? 3. get 方法
? ? ? ? 4. set 方法
? ? ? ? 5. 順序表的三種遍歷元素的方法。
? ? ? ? for循環(huán):
? ? ? ? for each :
? ? ? ? 迭代器:
? ? ? ? 6. add ()在指定位置添加元素
? ? ? ? 7.刪除元素:
? ? ? ? 根據(jù)下標(biāo)刪除元素:
? ? ? ? 根據(jù)元素內(nèi)容刪除元素:
? ? ? ? 注意:
? ? ? ? 8. contains 方法
? ? ? ? 9. indexOf 方法
? ? ? ? 10. subList 方法
? ? ? ? 11. clear()方法
泛型
? ? ? ? ?泛型也就是適用于許多其他的類型。
????????泛型可以提高代碼的復(fù)用性。
? ? ? ? 在我們之前學(xué)習(xí)的方法的重載后,發(fā)現(xiàn)其也不是那么的方便,因?yàn)橐逊椒ǖ慕邮盏膮?shù)重新設(shè)置,而且要是重載的方法多了,代碼會(huì)變的“丑”,java所以引入了泛型來解決這一情況。所以為什么說泛型可以提高代碼的復(fù)用性。
????????
? ? ? ? 那么,泛型怎么定義,怎么實(shí)例化,怎么使用?
????????
? ? ? ? 泛型的定義:
????????
?????????這里我們就創(chuàng)建了一個(gè)泛型類。
? ? ? ? 注意:
? ? ? ? 1.要在類名后加上 " < > " ,而其里面名字 " T " 是代表到時(shí)候?qū)嵗瘋鬟^來的數(shù)據(jù)類型。?
? ? ? ? 2.在new 一個(gè)數(shù)組對象時(shí),因?yàn)樵趎ew 這個(gè)對象的時(shí)候,可能會(huì)涉及到調(diào)用該類的構(gòu)造方法,T 是什么類型還不知道,構(gòu)造方法實(shí)現(xiàn)不了。所以,要先通過 Object 類型來開辟空間,再通過強(qiáng)制類型轉(zhuǎn)換成 T[ ]?數(shù)組類型。
????????
? ? ? ? 泛型的實(shí)例化:
????????
?????????這樣,我們就實(shí)例化了一個(gè)泛型。
? ? ? ? 注意:
? ? ? ? 在實(shí)例化中,"< >" 里面的書寫。
? ? ? ? 1.如果是基本數(shù)據(jù)類型,要使用到其對應(yīng)的包裝類。
? ? ? ? 2.如果是引用類型,可以直接寫,比如 String ,int [ ] ,double [ ] 。
????????
????????包裝類是 Java 為每個(gè)基本數(shù)據(jù)類型提供的對應(yīng)的引用類型。基本數(shù)據(jù)類型不是對象,不具備對象的特性,如不能調(diào)用方法等。而包裝類使得基本數(shù)據(jù)類型可以像對象一樣被操作,基本數(shù)據(jù)類型也能夠參與其中。
????????
? ? ? ? 基本數(shù)據(jù)類型對應(yīng)的包裝類如圖:
????????
????????
?????????泛型的使用:
????????
?????????上面的 set 方法設(shè)置和 get 提取數(shù)據(jù)打印時(shí)沒問題的,但是下面的 arr.set(1,10) 這一行代碼就有問題了,這里需要的是 String 類型的數(shù)據(jù),而這里傳入了一個(gè)整數(shù)類型,觸發(fā)了類型檢查,所以,使用泛型能更好的讓我們發(fā)現(xiàn)錯(cuò)誤。
????????
????????順序表ArrayList
?????????順序表 與 數(shù)組 其實(shí)很相似,但順序表 實(shí)現(xiàn)了 List 接口 ,List是一個(gè)接口,它定義了一系列操作順序表的方法,例如添加元素、刪除元素、獲取元素、查詢元素位置等。?ArrayList
是List
接口的一個(gè)具體實(shí)現(xiàn)類。它實(shí)現(xiàn)了List
接口中定義的所有方法。能更好的對數(shù)據(jù)進(jìn)行處理,總的來說 順序表 比 數(shù)組 好用。
????????
? ? ? ? 順序表ArrayList的兩種實(shí)例化方法:
????????
????????
? ?要注意,使用順序表ArrayList要導(dǎo)入對應(yīng)的包。
? ?第一種實(shí)例化我們都會(huì),但第二種實(shí)例化,使用了 List 的引用來進(jìn)行接收?ArrayList 對象的示例,這也是“向上轉(zhuǎn)型”。
?????????
?我們前面知道:
?
把子類實(shí)例轉(zhuǎn)成父類引用 稱為“向上轉(zhuǎn)型”。
? ? ? 把父類實(shí)例轉(zhuǎn)成子類引用稱為“向下轉(zhuǎn)型”。
????????
? ? ? ? 使用上面的第二種實(shí)例化,后續(xù)針對 List 進(jìn)行各種方法的調(diào)用,就會(huì)觸發(fā)多態(tài),調(diào)用到子類ArrayList的方法。
????????
? ? ? ? 另外,再看下面的:? ? ? ??
? ? ? ? 這里的實(shí)例化的同時(shí),指定初始化容量是元素個(gè)數(shù),并且,順序表是可以動(dòng)態(tài)擴(kuò)容的(后面也會(huì)講到),只要機(jī)器的內(nèi)存足夠用,就能一直持續(xù)擴(kuò)容,保證元素都能被容納進(jìn)去。(順序表的一個(gè)核心功能)。
????????
? ? ? ? ArrayList常用的方法:
? ? ? ?1. add 方法
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");System.out.println(arr1);
? ? ? ? 打印結(jié)果:
????????
?????????這是一個(gè)尾插的方法,先調(diào)用的add方法在前面存放,后調(diào)用的add方法繼續(xù)在后面逐個(gè)插入數(shù)據(jù)。
? ? ? ? add方法就涉及到動(dòng)態(tài)擴(kuò)容了。因?yàn)殚_始創(chuàng)建順序表的時(shí)候并沒有指定容量。在使用add方法后就會(huì)動(dòng)態(tài)擴(kuò)容了。
????????
? ? ? ? 2. size ( ) 方法
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");System.out.println(arr1.size());
? ? ? ? 運(yùn)行結(jié)果:
????????
?????????size ( ) 方法是獲取順序表的元素個(gè)數(shù)。
????????
? ? ? ? 3. get 方法
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");System.out.println(arr1.get(0));System.out.println(arr1.get(1));System.out.println(arr1.get(2));System.out.println(arr1.get(3));
? ? ? ? 打印結(jié)果:
????????
? ? ? ? get?方法 可以獲取 順序表 當(dāng)中對應(yīng)下標(biāo)的元素。
? ? ? ? 注意:
? ? ? ? 使用 get 方法 獲取的下標(biāo)不能越界。
????????
? ? ? ? 4. set 方法
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");// System.out.println(arr1.get(0));
// System.out.println(arr1.get(1));
// System.out.println(arr1.get(2));
// System.out.println(arr1.get(3));arr1.set(1,"kkk");System.out.println(arr1);
? ? ? ? 打印結(jié)果:
????????
?????????set 方法是將順序表對應(yīng)下標(biāo)的元素進(jìn)行改變。
? ? ? ? 注意:
? ? ? ? set 方法 設(shè)置元素的下標(biāo)不能越界。
????????
? ? ? ? 5. 順序表的三種遍歷元素的方法。
? ? ? ? for循環(huán):
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");for (int i = 0; i < arr1.size(); i++) {System.out.println(arr1.get(i));}
? ? ? ? for each :
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");for(String s : arr1 ) {System.out.println(s);}
? ? ? ? 迭代器:
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");Iterator<String> sss = arr1.iterator();while(sss.hasNext()) {System.out.println(sss.next());}
? ? ? ? 這個(gè)類似于之前學(xué)習(xí)的 Scanner 輸入的例子。
? ? ? ?獲取一個(gè)迭代器(Iterator
),并將這個(gè)迭代器賦值給名為sss
的變量。通過這個(gè)迭代器,可以方便地遍歷?arr1?
集合中的元素。
????????
? ? ? ? 6. add ()在指定位置添加元素
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add(2,"man");System.out.println(arr1);
? ? ? ? 打印結(jié)果:
????????
?????????這里插入元素是 插入后的 元素的位置下標(biāo)。
? ? ? ? 在上述里例子中,如果插入的下標(biāo)是 4 ,那么就相當(dāng)于尾插了。
????????
? ? ? ? 7.刪除元素:
? ? ? ? 根據(jù)下標(biāo)刪除元素:
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.remove(2);System.out.println(arr1);
? ? ? ? 打印結(jié)果:
????????
?????????這里是刪除了 2 下標(biāo)的元素 “ccc” 。
????????
? ? ? ? 根據(jù)元素內(nèi)容刪除元素:
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("ccc");arr1.add("eee");arr1.remove("ccc");System.out.println(arr1);
? ? ? ? 打印結(jié)果:
????????
? ? ? ? 可以看到, remove 根據(jù)內(nèi)容刪除元素方法 用于從列表中刪除指定元素的第一個(gè)匹配項(xiàng),如果要?jiǎng)h除所有的 “ccc”,可以通過循環(huán)檢查每個(gè)元素,然后在匹配時(shí)刪除來實(shí)現(xiàn)刪除所有指定元素。(這里不做演示)
????????
????????
? ? ? ? 注意:
List<Integer> arr2 = new ArrayList<>();arr2.add(1);arr2.add(2);arr2.add(3);arr2.add(4);arr2.remove(2);System.out.println(arr2);
? ? ? ? 打印結(jié)果:
?????????
?????????這里根據(jù)的是下標(biāo)來刪除元素的,如果想要?jiǎng)h除元素2 應(yīng)該怎么做?
? ? ? ? 可以這樣:
List<Integer> arr2 = new ArrayList<>();arr2.add(1);arr2.add(2);arr2.add(3);arr2.add(4);Integer a = 2;arr2.remove(a);System.out.println(arr2);
? ? ? ? 打印結(jié)果:
????????
?????????這里借助了不同類型的 兩種數(shù)據(jù) 觸發(fā)了不同的重載方法,實(shí)現(xiàn)了兩種刪除方式。
????????基本數(shù)據(jù)類型int
的值(這里的1
、2
、3
、4
)會(huì)自動(dòng)轉(zhuǎn)換為Integer
對象并添加到列表中。自動(dòng)裝箱機(jī)制使得代碼編寫更加方便,程序員不需要顯式地將int
轉(zhuǎn)換為Integer
。
????????
? ? ? ? 8. contains 方法
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("ccc");arr1.add("eee");System.out.println( arr1.contains("eee"));
? ? ? ? 運(yùn)行結(jié)果:
????????
? ? ? ? 這個(gè)方法用來判斷順序表中當(dāng)前元素存不存在。
? ? ? ? 存在返回 true,否則返回 false?。
????????
? ? ? ? 9. indexOf 方法
????????
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("ccc");arr1.add("eee");//返回元素第一次出現(xiàn)的下標(biāo)位置System.out.println(arr1.indexOf("ccc"));// //返回元素最后一次出現(xiàn)的下標(biāo)位置System.out.println(arr1.lastIndexOf("ccc"));
? ? ? ? 打印結(jié)果:
????????
?????????如果元素不存在,則返回 -1?
????????
????????
? ? ? ? 10. subList 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("eee");//獲取子列表 arr2List<String> arr2 = arr1.subList(1,3);//打印子列表 arr2System.out.println(arr2);//修改子列表arr2arr2.set(0,"111");//打印arr1System.out.println(arr1);
? ? ? ? 打印結(jié)果:
????????
?????????可以看到。
????????對子列表操作,不是創(chuàng)建“副本”列表,而是直接取原始列表一部分進(jìn)行構(gòu)造的,修改子列表,就會(huì)影響到原始的列表。
????????
????????
? ? ? ? 11. clear()方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("eee");//清空前System.out.println(arr1);arr1.clear();//清空后System.out.println(arr1);
? ? ? ? 打印如果:
????????
? ? ? ? clear 可以清空順序表當(dāng)中的元素。?