包裝類, 泛型---java

目錄

一. 包裝類

1.1 基本數據類型和對應的包裝類

1.2 裝箱和拆箱

?二. 泛型

2.1什么是泛型

2.2泛型的引入

?2.3 泛型類語法?

?2.4 泛型類的使用

?2.5?裸類型(Raw Type)(了解)

?2.6 泛型是如何編譯的?

2.7 泛型的上界

2.8 泛型方法?


一. 包裝類

Java 中,由于基本類型不是繼承自 Object ,為了在泛型代碼中可以支持基本類型, Java 給每個基本類型都對應了一個包裝類型。

1.1 基本數據類型和對應的包裝類

包裝類在之前我們就使用過, 使我們寫代碼更加的方便?

1.2 裝箱和拆箱

裝箱(裝包): 把一個基本數據類型轉變為包裝類型

拆箱(拆包): 把一個包裝類型轉變為基本數據類型

int i = 10 ;
Integer ii = i ; // 自動裝箱
Integer ii = Integer . valueOf ( i ); //顯示裝箱 ---類名.valueOf 說明該方法時用static修飾的
Integer jj = new Integer(10) ;
int j = jj ; // 自動拆箱
int j = jj . intValue (); //顯示拆箱

注:拆箱時, 我們可以將數據拆成我們想要的類型?

Integer jj = new Integer(10);

double d = jj.doubleValue();//拆成double類型

System.out.println(d);

//輸出結果

10.0

?下面看一道面試題:

思考 : 為什么上述代碼只是將100改成200, 輸出的結果卻不同呢?? ?

上述我們唯一做的動作就是裝箱, 那么裝箱時, 調用的方法是Integer.valueOf(), 按住Ctrl點進去查看valueOf的源碼, 我們發現:

?我們傳入的參數, 如果在一個low和high之間, 那么就返回一個數組某下標的值, 如果不在這個范圍內, 那么就new一個對象, 此時即使傳入一樣的參數, 返回的值肯定是不同的.? 那么我們猜測, 200就不在low和high之間, 而100在low和high之間.?

那么我們點進去low和high的源碼, 發現low = -128 , high = 127, 我們的猜測是正確的, 那么cache數組是怎么回事呢?

我們計算一下這個數組:

?二. 泛型

2.1什么是泛型

一般的類和方法,只能使用具體的類型 : 要么是基本類型,要么是自定義的類。如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。
----- 來源《 Java 編程思想》對泛型的介紹。
泛型是在 JDK1.5 引入的新的語法,通俗講,泛型: 就是適用于許多許多類型 。從代碼上講,就是對類型實現了參數化。

2.2泛型的引入

實現一個類,類中包含一個數組成員,使得數組中可以存放任何類型的數據,也可以根據成員方法返回數組中某個下標的值.
思路:
1. 我們以前學過的數組,只能存放指定類型的元素,例如: int[] array = new int[10]; String[] strs = new String[10];
2. 所有類的父類,默認為 Object 類。數組是否可以創建為 Object?

代碼示例:

問題:
以上代碼實現后 發現
1. 任何類型數據都可以存放
2. 1 號下標本身就是字符串,但是確編譯報錯。getPos返回值是Object, 用String接收, 必須進行強制類型轉換
雖然在這種情況下,當前數組任何數據都可以存放,但是,更多情況下,我們還是希望他只能夠持有一種數據類型。而不是同時持有這么多類型。所以,泛型的主要目的:就是指定當前的容器,要持有什么類型的對象。讓編譯 器去做檢查。 此時,就需要把類型,作為參數傳遞。需要什么類型,就傳入什么類型。
那么我們對上述代碼進行改寫:

?①?MyArray<T>? -----??類名后的 <T> 代表占位符,表示當前類是一個泛型類

了解: 【規范】類型形參一般使用一個大寫字母表示,常用的名稱有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四個類型

T[] array = (T[])new Object[10] ----??創建泛型類數組

T[] array = (T[])new Object[10], 并不是一個最好的寫法, 最好的寫法是:

Object[] array = new Object[10];

不能new泛型類型的數組?
T [] ts = new T [ 5 ]; // 是不對的

MyArray<Integer> myArray = new MyArray<>()? -----? ?創建泛型類對象,?類型后加入 <Integer> 指定當前類型?后面的<>中的內容可以省略

④??myArray.setVal(2,"bit")? -----? ?代碼編譯報錯,此時因為在③處指定類當前的類型,此時編譯器會在存放元素的時候幫助我們進行類型檢查。

泛型, 是編譯時期的機制, 在運行時, 沒有泛型的概念

注:<>中的內容不能是基本數據類型, 只能是引用類型/包裝類

想要存放String類型的數據:

?2.3 泛型類語法?

class 泛型類名稱 < 類型形參列表 > {
????????// 這里可以使用類型參數
}
class ClassName < T1 , T2 , ..., Tn > {
}
class 泛型類名稱 < 類型形參列表 > extends 繼承類 /* 這里可以使用類型參數 */ {
????????// 這里可以使用類型參數
}
class ClassName < T1 , T2 , ..., Tn > extends ParentClass < T1 > {
????????// 可以只使用部分類型參數
}

?2.4 泛型類的使用

泛型類 < 類型實參 > 變量名 ; // 定義一個泛型類引用
new 泛型類 < 類型實參 > ( 構造方法實參 ); // 實例化一個泛型類對象
MyArray < Integer > list = new MyArray < Integer > ();
//當編譯器可以根據上下文推導出類型實參時,可以省略類型實參的填寫
MyArray < Integer > list = new MyArray <> (); // 可以推導出實例化需要的類型實參為 Integer
注意:泛型只能接受類,所有的基本數據類型必須使用包裝類!

?2.5?裸類型(Raw Type)(了解)

裸類型是一個泛型類但沒有帶著類型實參,例如 MyArrayList 就是一個裸類型

MyArray list = new MyArray(); ?

小結:
1. 泛型是將數據類型參數化,進行傳遞
2. 使用 <T> 表示當前類是一個泛型類。
3. 泛型目前為止的優點:數據類型參數化,編譯時自動進行類型檢查和轉換

?2.6 泛型是如何編譯的?

那么,泛型到底是怎么編譯的?這個問題,也是曾經的一個面試問題。泛型本質是一個非常難的語法,要理解好他還是需要一定的時間打磨。
通過命令: javap -c 查看字節碼文件,所有的 T 都是 Object
在編譯的過程當中,將所有的 T替換為Object 這種機制,我們稱為: 擦除機制
Java 的泛型機制是在編譯級別實現的。編譯器生成的字節碼在運行期間并不包含泛型的類型信息。

2.7 泛型的上界

?在定義泛型類時,有時需要對傳入的類型變量做一定的約束,可以通過類型邊界來約束。

語法:

class 泛型類名稱 < 類型形參 extends 類型邊界 > {
...
}

例:

public class MyArray < E extends Number > {
...
}

表示: 只接受 Number 或 Number的子類型 作為 E 的類型實參?

MyArray < Integer > l1 ; // 正常,因為 Integer Number 的子類型
MyArray < String > l2 ; // 編譯錯誤,因為 String 不是 Number 的子類型

了解:

1.? 沒有指定類型邊界 E,可以視為 E extends Object ?

2. 泛型沒有下界

例: 寫一個泛型類, 求一個數組中的最大值

?顯然這樣是錯誤的, 因為擦除機制將T替換成Object類, 而引用類型是不能直接比較大小的, 需要使用compareTo方法, 并實現Comparable接口,? 我們點進去Object的源碼看發現:?

Object類并沒有實現Comparable接口?

正確的寫法應該是:

意味著, 傳入的參數必須是繼承了Comparable接口的類, 那么Integer我們點進去查看:

?Integer是繼承了Comparable接口的.?

如果我們重新定義一個類當參數:

是不被允許的, 因為沒有Person沒有實現Comparable接口

正確寫法:

2.8 泛型方法?

語法:

方法限定符 < 類型形參列表 > 返回值類型 方法名稱 ( 形參列表 ) { ... }

上述代碼可以寫成 泛型方法:

?

當這個泛型方法是靜態的時,??我們就不用實例化對象, 直接通過類來調用泛型方法?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209614.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp實戰 —— 豎排多級分類展示

效果預覽 完整范例代碼 頁面 src\pages\category\category.vue <script setup lang"ts"> import { getCategoryTopAPI } from /apis/category import type { CategoryTopItem } from /types/category import { onLoad } from dcloudio/uni-app import { compu…

vue指令

v-text 更新元素的 textContent。如果要更新部分的 textContent&#xff0c;需要使用 {{ Mustache }} 插值。 <span v-text"msg"></span> <!-- 和下面的一樣 --> <span>{{msg}}</span>v-html 更新元素的 innerHTML。注意&#xff1a;內…

基于高通MSM8953平臺android9.0的GPIO驅動開發

2.1、注冊設備&#xff1a; 2.1.1、添加編譯選項&#xff1a; 1&#xff09;、修改kernel/msm-4.9/drivers/leds下Makefile文件&#xff1a; obj-$(CONFIG_LED_GPIO) led_gpio.o 2&#xff09;、修改kernel/msm-4.9/drivers/leds下Kconfig文件&#xff1a; config LED_GPIO…

Java實現歸并排序算法

歸并排序算法 &#xff08;1&#xff09;基本思想&#xff1a;歸并&#xff08;Merge&#xff09;排序法是將兩個&#xff08;或兩個以上&#xff09;有序表合并成一個新的有序表&#xff0c;即把待排序序列分為若干個子序列&#xff0c;每個子序列是有序的。然后再把有序子序…

蛋白質序列FeatureDict轉化為TensorDict

主要轉化語句為 tensor_dict {k: tf.constant(v) for k, v in np_example.items() if k in features_metadata}。 增加了特征名稱的選擇&#xff0c;不同特征維度&#xff0c;特征數的判斷等。 from typing import Dict, Tuple, Sequence, Union, Mapping, Optional #import …

postgresql_conf中常用配置項

在 PostgreSQL 的 postgresql.conf 配置文件中&#xff0c;有許多常用的配置項&#xff0c;這些配置項可以根據特定需求和性能優化進行調整。以下是一些常用的配置項及其作用&#xff1a; 1. shared_buffers 用于設置 PostgreSQL 實例使用的共享內存緩沖區大小。增加此值可以…

游戲被攻擊該怎么辦?游戲盾該如何使用,游戲盾如何防護攻擊

隨著Internet互聯網絡帶寬的增加和多種DDOS黑客工具的不斷發布&#xff0c;DDOS拒絕服務攻擊的實施越來越容易&#xff0c;DDOS攻擊事件正在成上升趨勢。出于商業競爭、打擊報復和網絡敲詐等多種因素&#xff0c;導致很多商業站點、游戲服務器、聊天網絡等網絡服務商長期以來一…

Nacos 配置加密功能也太雞肋了吧,有種更好的方式

大家好&#xff0c;我是風箏&#xff0c;微信搜「古時的風箏」&#xff0c;更多干貨 當項目中用了 Nacos 做配置中心&#xff0c;是不是所有的配置都放到里面呢&#xff0c;大部分時候為了省事和統一&#xff0c;系統所有的配置都直接放在里面了&#xff0c;有時候&#xff0c…

什么是自動化測試框架?常用的自動化測試框架有哪些?

無論是在自動化測試實踐&#xff0c;還是日常交流中&#xff0c;經常聽到一個詞&#xff1a;框架。之前學習自動化測試的過程中&#xff0c;一直對“框架”這個詞知其然不知其所以然。 最近看了很多自動化相關的資料&#xff0c;加上自己的一些實踐&#xff0c;算是對“框架”…

Redis相關知識

yum安裝redis 使用以下命令&#xff1a;直接將redis安裝到Linux服務器&#xff08;Xshell&#xff09;中 yum -y install redis 啟動redis 使用以下命令&#xff0c;以后臺運行方式啟動redis redis-server /etc/redis.conf & 操作redis 使用以下命令啟動redis客戶端 redis-…

RFID在新能源工廠大放異彩

RFID在新能源工廠大放異彩 我國在十四五規劃中提出了建設綠色低碳發展的目標&#xff0c;新能源產業成為了國家發展的重點領域之一&#xff0c;開始大力支持各種新能源廠商發展。各個廠商之間不僅比產品、比技術。也比生產想要降本增效&#xff0c;為了實現這一目標&#xff0…

MBD Introduction

介紹 MATLAB是MathWorks公司的商業數學軟件&#xff0c;應用于科學計算、可視化以及交互式程序設計等高科技計算環境。Simulink是MATLAB中的一種可視化仿真工具。 Simulink是一個模塊圖環境&#xff0c;用于多域仿真以及基于模型的設計。它支持系統設計、仿真、自動代碼生成以…

Spring基于xml半注解開發

目錄 Component的使用 依賴注解的使用 非自定義Bean的注解開發 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>標簽及其標簽屬性的配置&#xff0c;使用Component注解替代<bean>標簽中的id以及class屬性&#xff0c;而對…

算法Day26 數位統計

數位統計 Description 給你一個整數n&#xff0c;統計并返回各位數字都不同的數字x的個數&#xff0c;其中0 ≤ x < 10^n。 Input 輸入整數n 0≤n≤13 Output 輸出整數個數 Sample 代碼 import java.util.Scanner;public class Main {public static void main(String[] ar…

一個Oracle Application Container的實例

本例基本涵蓋了Oracle Multitenant功能中application container的以下內容&#xff1a; 創建application container/root創建application PDB創建application SEED在application root中安裝application在application root中升級application同步application 整個過程如下 創建…

Epoll服務器(ET工作模式)

目錄 Epoll ET服務器設計思路Connection類TcpServer類 回調函數Accepter函數Recever函數Sender函數Excepter函數 事件處理套接字相關接口封裝運行Epoll服務器 Epoll ET服務器 設計思路 在epoll ET服務器中&#xff0c;我們需要處理如下幾種事件&#xff1a; 讀事件&#xff…

基于javeweb實現的圖書借閱管理系統

一、系統架構 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;servlet | jdbc 環境&#xff1a;jdk1.7 | mysql | tocmat 二、代碼及數據庫 三、功能介紹 01. 登錄頁 02. 首頁 03. 圖書管理 04. 讀者管理 05. 圖書分類管理 06. 圖書借閱信息 07. 圖書歸還信…

CDN加速技術:降低服務器與網站成本的智慧選擇

隨著互聯網的飛速發展&#xff0c;網站的訪問量不斷攀升&#xff0c;服務器負載壓力逐漸增大。為了提高用戶體驗、降低服務器成本&#xff0c;并確保網站的高可用性&#xff0c;CDN&#xff08;內容分發網絡&#xff09;加速技術應運而生。本文將從服務器與網站成本的角度分析C…

NLP項目實戰01--電影評論分類

介紹&#xff1a; 歡迎來到本篇文章&#xff01;在這里&#xff0c;我們將探討一個常見而重要的自然語言處理任務——文本分類。具體而言&#xff0c;我們將關注情感分析任務&#xff0c;即通過分析電影評論的情感來判斷評論是正面的、負面的。 展示&#xff1a; 訓練展示如下…

比較不同聚類方法的評估指標

歸一化互信息&#xff08;NMI&#xff09; 要求&#xff1a;需要每個序列的真實標簽&#xff08;分類信息&#xff09;