亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

黑馬程序員——【Java基礎】——泛型、Utilities工具類、其他對象API

2019-11-14 21:15:48
字體:
來源:轉載
供稿:網友
黑馬程序員——【java基礎】——泛型、Utilities工具類、其他對象API

---------- android培訓、java培訓、期待與您交流! ----------

一、泛型

 ?。ㄒ唬┓盒透攀?/strong>

  1、泛型:JDK1.5版本以后出現的新特性,用于解決安全問題,是一個類型安全機制。

  2、泛型技術是給編譯器使用的技術,用于編譯時期,確保類型的安全。

  3、泛型的擦除:運行時,會將泛型去掉,生成class文件中的是不帶泛型的,這個稱為“泛型的擦除”。擦除泛型的原因是為了兼容運行時的類加載器。

  4、泛型的好處:(1)將運行時期出現的問題ClassCastException,轉移到了編譯時期。方便于程序員解決問題,讓運行時期問題減少、安全。(2)避免了強制轉換的麻煩。

  5、泛型的格式:通過<>來定義要操作的引用數據類型,例如:ArrayList<String>表示存入ArrayList集合中的元素必須為String類型

  6、泛型補償:在運行時,通過反射通過獲取元素的類型(如Class clazz = “aa”.getClass(); clazz.getName();),不用使用再強制轉換類型了。

  7、在使用Java提供的對象時,什么時候寫泛型呢?

  通常在集合框架中很常見,只要見到<>就要定義泛型。其實<>是用來接收引用類型的,但使用集合時,將集合中要存儲的數據類型作為參數傳遞到<>中即可。

  8、關于參數化類型的幾點說明:

 ?。?)參數化類型與原始類型的兼容性

  * 參數化類型可引用一個原始類型的對象,編譯只是報警告。如:Collection<String>coll = new Vector();

  * 原始類型可引用一個參數化類型的對象,編譯報告警告。如:Collectioncoll = new Vector<String>(); 原來的方法接受一個集合參數,新類型也要能傳進去。

 ?。?)參數的類型不考慮類型參數的繼承關系:

  Vector<String> v = newVector<Objec>();//錯誤的。不寫Object沒錯,寫了就是明知故犯

  Vector<Objec> v = newVector<String>();//錯誤的

 ?。?)編譯器不允許創建泛型變量的數組。即在創建數組實例時,數組的元素不能使用參數化的類型。如:Vector<Integer>vectorList[] = newVector<Integer>[10];//錯誤的

  (二)泛型限定

  1、通配符“?

  當傳入的類型不確定時,可以使用通配符“?”,也可以理解為占位符。使用通配符可以不用明確傳入的類型,這樣在使用泛型類或泛型方法時,提高了擴展性。

  2、泛型限定

  對于一個范圍內的一類事物,可以通過泛型限定的方式定義,有兩種方式:

  (1)? extends E:可接收E類型或E類型的子類型,稱為上限界定。如:ArrayList<? extends Number> x = new ArrayList<Integer>();

 ?。?)? super E:可接收E類型或E類型的父類型;稱為下限界定。如:ArrayList<? super Integer> x = new ArrayList<Number>();

  3、泛型限定代碼示例:

 1 //人  父類 2 class Person{ 3     PRivate String name; 4     Person(String name){ 5         this.name = name; 6     } 7     public String getName(){ 8         return name; 9     }10 }11 //學生  繼承父類12 class Student extends Person{13     Student(String name){14         super(name);15     }16 }17 class  Demo{18     public static void main(String[] args){19         ArrayList<Person> al = new ArrayList<Person>();20         al.add(new Person("abc1"));21         al.add(new Person("abc2"));22         al.add(new Person("abc3"));23         printColl(al);//父類對象的元素集合可以調用24         ArrayList<Student> al1 = new ArrayList<Student>();25         al1.add(new Student("abc--1"));26 al1.add(new Student("abc--2"));27         al1.add(new Student("abc--3"));28         printColl(al1);  //子類對象的元素集合也可以調用29     }30 //定義一個上限的泛型方法31 public static void printColl(Collection<? extends Person> al){32         Iterator<? extends Person> it = al.iterator();33         while(it.hasNext()){34             System.out.println(it.next().getName());35         }36     }37 }

 ?。ㄈ┓盒皖?/strong>

  1、什么時候定義泛型類來完成擴展?

  當類中要操作的引用數據類型不確定的時候,早期(1.4version)之前定義Object類來完成擴展?,F在(version1.5)開始通過定義泛型來完成擴展。

  2、泛型類定義的泛型,在整個類中有效。如果被方法使用,那么泛型類的對象明確要操作的具體類型后,所有要操作的類型就已經固定了。

  3、類級別的泛型是根據引用該類名時指定的類型信息來參數化類型變量的。

  4、泛型類示例代碼:

 1 //定義工具泛型類Utils 2 class Utils<QQ>{ 3     private QQ q; 4     public void setObject(QQ q){ 5     this.q == q; 6 } 7 Public QQ getObject(){ 8     Return q; 9 }10 }11 public class GenericClassDemo{12     public static void main(String[] args) {13         Utils<Worker> u = new Utils<Worker>();14         u.setObject(new Worker());15         Worker w = u.getObject();16     }17 }18 class Worker extends Person {19     public Worker() {20         super();21 }22 public Worker(String name, int age) {23         super(name, age);24     }25     @Override26     public String toString() {27     return "Worker:"+getName()+":"+getAge();28     }29 }

  (四)泛型方法

  1、一般泛型方法

  (1)為了讓不同方法可以操作不同類型,而且類型還不確定,那么可以將泛型定義在方法上。

 ?。?)方法中上定義的泛型可以不和類泛型相同。

 ?。?)泛型方法示例:

1 class Demo{2     public <T> void show( T t){3     System.out.println(t);4     }5     Public <Q> void print( Q q){6     System.out.println(q);7     }8 }

  2、靜態方法泛型

 ?。?)特殊之處:Static方法不可以訪問類上定義的泛型。

 ?。?)如果靜態方法操作的應用數據類型不確定,可以將方法泛型定義在方法上。

 ?。?)如果靜態方法使用泛型,只能將泛型定義在方法上。

 ?。?)泛型代碼示例:

1 public static <W> void method( W t){ 2        System.out.println( “method” + t ); 3 }

  3、泛型方法的特點

  (1)位置:用于放置泛型的類型參數的<>應出現在方法的其他所有修飾符之后和在方法的返回類型之前,也就是緊鄰返回值之前,按照慣例,類型參數通常用單個大寫字母表示。

 ?。?)只有引用類型才能作為泛型方法的實際參數。

 ?。?)除了在應用泛型時可以使用extends限定符,在定義泛型時也可以使用extends限定符。

  (4)普通方法、構造函數和靜態方法中都可以使用泛型。

 ?。?)可以用類型變量表示異常,稱之為參數化的異常,可用于方法的throws列表中,但是不能用于catch子句中。

 ?。?)在泛型中可同時有多個類型參數,在定義它們的<>中用逗號分開。

二、Utilities工具類

 ?。ㄒ唬└攀?/strong>

  Utilites工具類包括:類Collections和類Arrays。它們包含的方法都是靜態方法,不要創建對象,直接可以用類名調用。

  (二)Collections

  1、Collections是用于對“集合”進行操作的工具類。它里邊的方法都是靜態的,不需要創建對象。

  2、Collections常見方法

 ?。?)查找

  max(Collection<? extends T> coll):根據集合的自然順序,獲取coll集合中的最大元素

  max(Collection<? extends T> coll,Comparator<? super T> comp):根據指定比較器comp的順序,獲取coll集合中的最大元素

  int binarySearch(Lsit<? extends Comparable<? super T>> list,Tkey):二分法搜索list集合中的指定對象

 ?。?)替換

  void fill(List<? super T> list, T obj):將list集合中的全部元素替換成指定對象obj

  boolean replaceAll(List<T> lsit,T oldVal,T newVal):用newVal替換集合中的oldVal值

  void swap(Listlist,int i,int j);/在指定列表的指定位置處交換元素

  (3)排序:

  void shuffle(List<?> list):使用默認隨機源對list集合中的元素進行隨機排序

  void sort(Lsit<T> list):根據自然順序對list集合中的元素進行排序

  void sort(List<T> lsit,Comparator<? super T> c):根據指定比較器c的排序方式對list集合進行排序

 ?。?)反轉

  reverse(List<?> list):反轉list集合中元素的順序

  Comparator reverSEOrder():返回一個比較器,強行逆轉了實現Comparable接口的對象的自然順序

  Comparator reverseOrder(Comparator<T> cmp):返回一個比較器,強行逆轉了指定比較器的順序

 ?。?)同步的集合

  synchronizedList(List<T> list):返回支持的同步(線程安全的)List集合

  synchronizedList(Map<K,V> m):返回支持的同步(線程安全的)Map集合

 ?。ㄈ〢rrays

  1、Arrays是用于操作數組的工具類,它包括的方法也全是靜態的,不需要創建對象。

  2、Arrays常見方法

 ?。?)數組轉成集合

  Lsit<T> asList(T... a):將數組轉換為集合。

  注意:① 將數組轉換成集合,不可使用集合的增刪方法,因為數組的長度是固定的。如果進行增刪操作,則會產生UnsupportedOperationException的編譯異常。② 如果數組中的元素都是對象,則轉成集合時,直接將數組中的元素作為集合中的元素進行存儲。③ 如果數組中的元素都是基本數據類型,那么會將該數組作為集合中的元素進行存儲。

 ?。?)查找、替換和排序

  binarySearch():二分查找方法。

  fill():替換方法。

  sort():排序方法

 ?。?)Arrays.toString():可以接收各種數組類型參數,并返回指定數組內容的字符串表現形式。

  3、數組轉成集合,代碼示例:

 1 class  ArraysDemo{ 2     public static void main(String[] args){ 3         int[] arr = {2,4,5}; 4         System.out.println(Arrays.toString(arr));//轉換為字符串形式 5         String[] arr = {"abc","cc","kkkk"};//字符串數組 6         List<String> list = Arrays.asList(arr); 7         sop("contains:"+list.contains("cc"));//判斷是否存在"cc"這個元素 8         Integer[] nums = {2,4,5}; 9         List<Integer> li = Arrays.asList(nums);10         sop("asList--Integer[]轉集合:" + li);11     }12   //打印方法13     public static void sop(Object obj) {14         System.out.println(obj);15     }16 }

 ?。ㄋ模┘限D數組

  1、集合轉數組:使用的是Cellction接口中的toArray方法。定義格式:<T> T[] toArray(T[] a);

  2、集合轉數組:可以對集合中的元素操作的方法進行限定,不允許對其進行增刪。

  3、toArray方法需要傳入一個指定類型的數組,長度如何定義呢?

  (1)如果數組長度小于了集合的size,方法會創建一個同類型并和集合相同size的數組。

 ?。?)如果數組長度大于了集合的size,那么該方法會使用指定的數組存儲集合中的元素,其他默認為null。

  4、代碼示例:

 1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 public class ToArray { 5     public static void main(String[] args) { 6         List<String> list = new ArrayList<String>(); 7         list.add("abc1"); 8         list.add("abc2"); 9         list.add("abc3");10         String[] arr = list.toArray(new String[list.size()]);    11         System.out.println(Arrays.toString(arr));12     }13 }

三、JDK1.5新特性

  (一)增強型for循環

  1、格式:

  for( 數據類型 變量名 : Collection集合或者數組) {

  執行語句

  }

  2、說明

  (1)對集合進行遍歷。只能獲取集合元素。但是不能對集合進行操作??梢钥醋魇堑鞯暮唽懶问健?/p>

 ?。?)迭代器除了遍歷,還可以進行remove集合中元素的動作。如果使用ListIterator,還可以在遍歷過程中對集合進行增、刪、改、查的操作。

  3、傳統for和高級for的區別:

  (1)傳統for循環可以完成對語句的多次操作,因為可以控制循環增量條件。

 ?。?)高級for循環是一種簡化形式,它必須有遍歷目標,該目標要么是array或Collection單列集合,不可以直接遍歷Map集合,但可以將Map集合轉化為單列的Set集合,就可以使用。例如:

1 for( Map.Entry<Integer , String>) me : map.entrySet()){2     Integer key = me.getKey();3     String value = me.getValue();4     System.out.println(key + “::” +value);5 }

 ?。ǘ┖瘮悼勺儏?/strong>

  1、在JDK1.5版本后,就提供了一個新特性:可變參數。用來解決一個方法在參數列表中傳入多個參數,個數不確定而每次都要復寫該方法的問題。

  2、可變參數其實就是數組參數的簡寫形式。只要將要操作的元素作為參數傳遞,就可以隱式將這些參數封裝成了數組。

  3、注意:可變參數一定要定義在參數列表的最后面。

  4、示例代碼如下

1 public static int newAdd(int a , int&hellip; arr){2     int sum = 0;3     for( int i = 0 ; i < arr.length ; i ++){4         sum + = arr[i];5 }6 return sum;7 }

 ?。ㄈ╈o態導入

  1、寫法示例:import static java.util.Collections.*;

  加上static導入的是某一個類中所有的靜態成員。這樣寫在調用該類的靜態方法時可以不用再寫類名。如Collections.max(list)可以簡寫為max(list)。

  2、注意:

  (1)當導入的兩個類中有同名成員時,需要在成員前加上相應的類名。

 ?。?)當類名重名時,需要指定具體包名。當方法重名時,指定具體所屬的對象或者類。

  3、靜態導入示例:

 1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.List; 4 import static java.util.Collections.*;//靜態導入,其實到入的是類中的靜態成員。 5 import static java.lang.System.*; 6 public class StaticImportDemo { 7     public static void main(String[] args) { 8         List<String> list = new ArrayList<String>();     9         list.add("abc3");10         list.add("abc7");11         list.add("abc1");12         out.println(list);13         sort(list);    14         System.out.println(list);15         String max = max(list);16         System.out.println("max="+max);    17     }18 }

三、其他對象API

  (一)System

  1、概述:System是描述系統一些信息的類,類中的屬性和方法都是static的。

  2、字段摘要

    out:標準輸出流。默認是控制臺。

    in:標準輸入流。默認是鍵盤。

  3、static方法

 ?。?)Properties getProperties():獲取系統的屬性信息。

  (2)String getProperty(String key):獲取指定屬性信息

 ?。?)String setProperty(String key , String value):在系統內定義特有信息。

 ?。?)Long currentTimeMillis():獲取當前時間毫秒值。

 ?。ǘ㏑untime

  1、概述

 ?。?)沒有構造函數摘要,說明該類不可以創建對象。

  (2)發現還有非靜態方法,說明該類應該提供靜態的返回該類對象的方法。

 ?。?)只有一個,說明Runtime類是單例設計模式。

  2、方法

  (1)static Runtime.getRuntime():獲取本類對象。

  (2)Process exec(String command):在單獨的進程中執行指定字符串命令。

  3、示例代碼:Runtime r = Runtime.getRuntime(); r.exec(“xxx.exe”);

 ?。ㄈ㎝ath

  1、概述:Math 類包含用于執行基本數學運算的方法,該類全為靜態方法。

  2、常用方法

  (1)double ceil(double d):返回大于指定數據的最小整數。

 ?。?)double floor(double d):返回小于指定數據的最大整數。

 ?。?)double pow(doublea , double b):返回a的b次方。

 ?。?)long round(doubleb):返回b四舍五入的值。

 ?。?)double random():返回正號的double值,是一個大于等于0.0且小于1.0的隨機數。

  3、Random類

  此類的實例用于生成偽隨機數流,有自身的方法,可以將相應的隨機數強轉為指定基本數據類型。例如:Random r = new Random(); r.nextInt();

 ?。ㄋ模〥ate

  1、概述:Date類表示特定的瞬間,精確到毫秒。

  2、創建日期對象的步驟:

 ?。?)創建Date對象。

 ?。?)創建日期對象格式,將時間模式封裝到Simple DateFormat對象中。

  (3)調用format方法對指定Date對象進行日期格式化。

  (五)Calendar

  1、概述:Calendar是一個抽象類,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH等日歷字段之間的轉換提供了一些方法??梢詫δ暝氯盏葧r間進行獲取,并提供了相應的子段值。

  2、方法:

 ?。?)基本獲取時間

  ① 獲取年份:Calendar.YEAR

  ② 獲取月份:Calendar.MONTH

 ?、?獲取日期:Calendar.DAY_OF_MONTH

 ?、?獲取星期:Calendar.DAY_OF_WEEK

  ⑦ 獲取秒數:Calendar.SECOND

 ?。?)設置時間:可以通過YEAR、MONTH和DAY_OF_MONTH設置日歷字段的值

 ?、?void add(int field , int amount):根據日歷的規則,為給定的日歷字段添加或減去指定的時間量。

 ?、?int get(int field):獲取指定的日歷字段對應的時間值。

 ?、?void set(int field , int value):將給定日歷字段對應的時間值設置為給定值。

---------- android培訓、java培訓、期待與您交流! ----------


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久www成人免费精品张筱雨| 亚洲成人激情在线| 岛国av一区二区| 国产免费观看久久黄| 少妇高潮久久久久久潘金莲| 国产精品入口日韩视频大尺度| 精品日韩视频在线观看| 久久91亚洲精品中文字幕| 日本精品一区二区三区在线播放视频| 欧美性资源免费| 久久久久久久国产| 国产精品福利网站| 韩国视频理论视频久久| 国产精品麻豆va在线播放| 国产精品极品美女粉嫩高清在线| 国产91ⅴ在线精品免费观看| 久久精品在线播放| 久久精品国产精品亚洲| 亚洲精品视频免费在线观看| 久久99青青精品免费观看| 精品国产一区二区三区久久| 日韩黄色高清视频| 欧美精品videosex极品1| 日韩欧美成人网| 一区二区三区高清国产| 日韩**中文字幕毛片| 亚洲情综合五月天| 久久久久久久999精品视频| 成人精品久久一区二区三区| 亚洲国产精品嫩草影院久久| 国产成人免费91av在线| 日本亚洲精品在线观看| 亚洲精品不卡在线| 在线亚洲欧美视频| 精品亚洲一区二区三区四区五区| 成人福利视频在线观看| 91久久久久久久久久| 一区二区三区美女xx视频| 亚洲一区二区三区在线免费观看| 欧美日韩国产精品一区二区三区四区| 日本亚洲欧美三级| 亚洲精品成人久久久| www.日韩.com| 97国产精品视频人人做人人爱| 亚洲区bt下载| 日韩一区二区久久久| 久久久精品久久久久| 久久99精品久久久久久噜噜| 国内免费精品永久在线视频| 亚洲电影免费观看高清完整版| 欧美性xxxx极品hd满灌| 中文字幕日韩电影| 欧美日韩精品国产| 欧洲亚洲妇女av| 富二代精品短视频| 久久免费视频观看| 中文.日本.精品| 日本久久久久久久| 国产成人精品免高潮费视频| 91久久久久久久一区二区| 欧美日韩黄色大片| 久久综合亚洲社区| 成人激情视频免费在线| 日本久久久久久久久久久| 国产精品入口福利| 欧美日韩亚洲视频| 亚洲永久在线观看| 久久影院资源站| 久久精品成人欧美大片| 国产精品都在这里| 欧美裸体xxxx极品少妇软件| 亚洲第一在线视频| 亚洲成人精品视频在线观看| 久久精品福利视频| 亚洲图中文字幕| 欧美黄色片在线观看| 精品成人国产在线观看男人呻吟| 亚洲精品大尺度| 日韩亚洲综合在线| 欧美一区三区三区高中清蜜桃| 国产精品一区二区久久| 亚洲欧美一区二区精品久久久| 欧美日韩国产精品一区二区不卡中文| 欧美精品午夜视频| 日产精品久久久一区二区福利| 国产精品亚洲美女av网站| 久久青草精品视频免费观看| 欧美日本黄视频| 91九色国产视频| 亚洲乱码一区av黑人高潮| 欧美电影免费在线观看| 久久久视频精品| 日韩最新中文字幕电影免费看| 91香蕉国产在线观看| 在线观看中文字幕亚洲| 8090成年在线看片午夜| 亚洲美女自拍视频| 久久激情五月丁香伊人| 日韩视频免费大全中文字幕| 欧美激情国内偷拍| 国产精品爽爽爽爽爽爽在线观看| 亚洲精品久久久久久久久久久久久| 2024亚洲男人天堂| 欧美高清自拍一区| 在线激情影院一区| 国产成人精品一区二区| 亚洲最新av在线网站| 欧美大片在线看| 日韩欧美国产中文字幕| 日韩av电影国产| 国产精品偷伦视频免费观看国产| 亚洲国产91色在线| 韩曰欧美视频免费观看| 97在线看免费观看视频在线观看| 欧美性视频在线| 国产日韩中文字幕| 欧美怡红院视频一区二区三区| 亚洲一区二区精品| 97激碰免费视频| 亚洲精品中文字幕有码专区| 久久久久久久久亚洲| 久久精品国产一区| 欧美激情第1页| 日韩欧美一区二区三区久久| 国产精品免费一区豆花| 成人午夜高潮视频| 国产精品免费观看在线| 人体精品一二三区| 色综合久久天天综线观看| 久久97精品久久久久久久不卡| 国产精品第8页| 久久久在线免费观看| 日韩最新在线视频| 午夜精品99久久免费| 久久久久久亚洲| 国产精品老牛影院在线观看| 色悠悠国产精品| 丰满岳妇乱一区二区三区| 在线播放日韩专区| 精品视频在线播放色网色视频| 亚洲成年网站在线观看| 国产精品wwww| 国产日韩欧美影视| 7777免费精品视频| 国产精品久久久久久久久男| 精品视频在线播放免| 国产成人在线一区| 国产成人精品优优av| 国产三级精品网站| 国产91精品久久久久久久| 国产欧美一区二区| 91精品国产777在线观看| 夜色77av精品影院| 国产精品偷伦一区二区| 亚洲欧美日本另类| 久久亚洲精品成人| 亚洲国产成人精品一区二区| 欧美日韩高清在线观看| 久久久久久久国产精品| 日韩av手机在线观看| 日韩免费在线电影| 国产亚洲成av人片在线观看桃| 亚洲春色另类小说| 国产精品久久久久久久久久东京|