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