網站的充值是怎么做的怎么可以讓百度快速收錄視頻
看到這句話的時候證明:此刻你我都在努力
加油陌生人
br />個人主頁:Gu Gu Study
專欄:Java版數(shù)據(jù)結構
喜歡的一句話: 常常會回顧努力的自己,所以要為自己的努力留下足跡
喜歡的話可以點個贊謝謝了。
作者:小閉
前言
好久沒有更新文章了,大概斷更了20天,想著今天就寫一下文章吧!最近也是又溫習了一下數(shù)據(jù)結構,其實之前我寫過關于數(shù)據(jù)結構的一個專欄那個專欄是寫了順序表,鏈表,棧和隊列,但是那時是用C語言實現(xiàn)的,雖然數(shù)據(jù)結構不局限于語言,但是總歸在語言的使用上有所不同,畢竟面向不同,一個是面向過程的C語言,一個是面向對象的Java。所以這次我打算起一個數(shù)據(jù)結構的Java專欄,當然由于之前已經寫過有些地方會寫得簡潔一點,模糊的話大家可以去看一下前面得文章哦。今天是關于泛型的哦!只是簡單的認識一下基礎,為了更好的理解后面Java使用數(shù)據(jù)結構的代碼。
認識包裝類
Java中,包裝類(Wrapper Classes)是用來包裝原始數(shù)據(jù)類型的類。Java是一種面向對象的語言,所有的對象都是類的實例,包括基本數(shù)據(jù)類型。但是基本數(shù)據(jù)類型并不是對象,它們是Java語言的一部分,而不是Java類。為了將基本數(shù)據(jù)類型當作對象來處理,Java提供了對應的包裝類。
以下是Java中的基本數(shù)據(jù)類型及其對應的包裝類:
**boolean**
** - ****Boolean**
**byte**
** - ****Byte**
**short**
** - ****Short**
**int**
** - ****Integer**
**long**
** - ****Long**
**float**
** - ****Float**
**double**
** - ****Double**
**char**
** - ****Character**
很容易看出來除了int和char的包裝類有些特殊其它基本數(shù)據(jù)的包裝類就是大寫其第一個字幕。
包裝類的主要作用包括:
- 自動裝箱和拆箱:Java 5 引入了自動裝箱(Autoboxing)和拆箱(Unboxing)的概念,允許自動將基本數(shù)據(jù)類型轉換為對應的包裝類對象,反之亦然。
- 使用對象的方法:包裝類提供了一些有用的方法,比如
toString()
、equals()
、hashCode()
等,這些在基本數(shù)據(jù)類型中是不可用的。 - 集合框架:Java的集合框架只能存儲對象,不能直接存儲基本數(shù)據(jù)類型。通過包裝類,可以將基本數(shù)據(jù)類型作為對象存儲在集合中。
- 方法參數(shù):在定義方法時,如果需要一個可變參數(shù),可以使用包裝類,因為基本數(shù)據(jù)類型是不可變的。
在數(shù)據(jù)結構中我們主要運用第三點集合框架,集合框架,后面的文章會給大家講到。
自動裝箱和拆箱的使用
以下就是自動裝箱和拆箱的使用方法:
如果將num1和num2打印出來,都是一樣的值----5。
public class Test {public static void main(String[] args) {Integer num1 = 5; // 自動裝箱int num2 = num1; // 自動拆箱System.out.println(num1);System.out.println(num2);}
}
包裝類還提供了一些靜態(tài)方法,比如Integer.valueOf(int i)
用于將基本類型轉換為包裝類對象,
Integer.parseInt(String s)
用于將字符串轉換為基本類型。這些方法在處理數(shù)值與字符串之間的轉換時非常有用。將字符串轉化為整形其實我們前面在講字符串時也是講過的。
了解完包裝類接下來就是我們的泛型學習了。
泛型的概念
泛型是Java中一種強大的特性,它允許程序員在編寫代碼時指定類型參數(shù),從而使得代碼更加靈活和可重用。泛型提供了一種方式,使得編譯器可以在編譯時檢查類型安全,避免了類型轉換的錯誤和運行時的類型檢查。
當當看概念可能比較抽象,下面我們引出一個情境:
- 我們以前學過的數(shù)組,只能存放指定類型的元素,例如:int[] array = new int[10]; String[] strs = new
String[10];
那么如果我想要一個什么類型都能儲存的數(shù)組可以嗎?
其實這是可以實現(xiàn)的,那么我們這里就要提到object類了。
所有類的父類,默認為Object類。數(shù)組是否可以創(chuàng)建為Object?
答案是可以的,如下代碼,在自己定義了一個MyArray后,我們就可以在里面儲存各種類型的數(shù)據(jù)了。
class MyArray {Object[] array = new Object[10];public void setVal(int pos, Object val) {array[pos] = val;}public Object getVal(int pos) {return array[pos];}}public class Test {public static void main(String[] args) {MyArray myArray=new MyArray();myArray.setVal(0,2);myArray.setVal(1,"hello world");int ret1=(int)myArray.getVal(0); //注意這里必須進行強制類型轉換String ret2=(String)myArray.getVal(1); //注意這里必須進行強制類型轉換System.out.println(ret1);System.out.println(ret2);}}
但是數(shù)組的定義本來就是用來儲存同種類型數(shù)據(jù)的一種集合。像上面這種卻又不像是數(shù)組呢。
下面我們在引入一個情境:
我在定義一個容器時暫時不知道用什么數(shù)據(jù)類型怎么辦,我在用到時才知道這個容器要用什么類型的數(shù)據(jù),這時我們該怎么辦呢?這時我們的主角泛型就該出場了。
泛型的主要目的:就是指定當前的容器,要持有什么類型的對象。讓編譯 器去做檢查。此時,就需要把類型,作為參數(shù)傳遞。需要什么類型,就傳入什么類型。
那么下面就來細看泛型的使用
語法:
** class 泛型類名稱<類型形參列表> { **
**// 這里可以使用類型參數(shù) **
}
那么類型參數(shù)列表是什么呢?
** 其實我們可以理解為一個占位符,我們用一個字母來代表他是一個類型的數(shù)據(jù),至于這具體是什么我們定義這個類時是不知道的,但是這時我們可以在這個類中先使用這個未知的類型進行一系列操作,當我們在實例化new一個對象出來時才可以傳入自己想要使用的參數(shù)類型。**
泛型的使用如下代碼:
class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}
}public class Test {public static void main(String[] args) {Box<Integer> box=new Box<>();box.set(6);System.out.println(box.get());}}
在上面代碼中我們定義一個泛型類Box,在實例化時我們需要如上 Box box=new Box<>();那么這個類中的T,那么全部轉化為Integer了,所以在傳入類型實參時通常是一個類,即:這里的Integer不能是int,這就是我們?yōu)槭裁匆葘W習包裝類。
這個泛型類就是我們數(shù)據(jù)結構最常用的泛型知識點。
泛型的上界
首先我們先了解什么是泛型上界
泛型上界是泛型編程中的一個重要概念,它用于指定泛型參數(shù)可以繼承或實現(xiàn)的類或接口的類型范圍。在Java等支持泛型的語言中,上界允許你限制泛型參數(shù)必須是某個類或接口的子類或實現(xiàn)。
其語法為:
** class 泛型類名稱<類型形參 extends 類型邊界> { **
······
**} **
代碼例子
public class MyArray<E extends Number> {
...
}
**那么這時我們的傳入的類型變量就必須為Number的子類 **
MyArray n1; // 正常,因為 Integer 是 Number 的子類型
MyArray n2; // 編譯錯誤,因為 String 不是 Number 的子類型
泛型方法
語法形式:
**方法限定符 <類型形參列表> 返回值類型 方法名稱(形參列表) { **
**… **
**} **
代碼示例:
public class Util {
//靜態(tài)的泛型方法 需要在static后用<>聲明泛型類型參數(shù)
public static<E> void swap(E[] array, int i, int j) {
E t = array[i];array[i] = array[j];
array[j] = t;}
}
** 那么這時我們使用泛型方法時通常有兩種方式:**
** 一、可以自動進行類型推導: **
Integer[] a = { ... };
swap(a, 0, 9); String[] b = { ... };swap(b, 0, 9);
** 二、 不使用類型推導 **
Integer[] a = { ... };
Util.swap(a, 0, 9); String[] b = { ... };
Util.swap(b, 0, 9)
以上就是泛型的簡單介紹,泛型的知識還有很多,但是我們這次只學習一些基礎唔。主要是為了后面數(shù)據(jù)類型的打基礎鋪墊。