Java是強類型語言,但仍可在不同類型的原始變數之間傳遞值。例如,我可以將 int 的值指派給 double ,沒有任何問題,只要接收該值的類型的儲存容量可以處理它。
請參閱下面每個原始類型的大小:
將值轉移到具有更大儲存容量的類型有一個技術名稱:「擴大轉換」。該術語在葡萄牙語中通常被翻譯為“放大轉換”或“加寬轉換”。它是指將較小或較受限制的資料類型的值轉換為較大或較全面的類型而不遺失資訊的過程。
但是如果我想將值轉移到儲存容量較小的類型怎麼辦? Java 編譯器不喜歡這樣,但如果您強制轉換它,它會允許這樣做,如下例所示。
double decimal = 65.9; int i = (int) decimal; //aqui ele perde a casa decimal e vira 65 char c = (char) i; //aqui ele vira a letra A (que corresponde a 65)
如果傳遞給新類型的值的大小超出了該類型的限制,則可能會發生更戲劇性的事情。 int i = 10 適合位元組變量,因為它包含 -128 到 127 範圍內的 8 位元。但是,如果我想將 int i = 128 放入 byte 類型的變數中該怎麼辦...將會有資訊遺失。
public class Main { public static void main(String[] args) { int i = 128; byte b = (byte) i; System.out.println(b); // o valor de b agora é -128 :S } }
在上一篇文章[在這裡閱讀]中,我談論了一些關於包裝類的內容。作為一個例子,我寫了 Integer.parse(i) = 想像 i 是一個類型
原始整數。
目前,不再鼓勵使用 Wrapper 解析方法,因為它已被棄用。要將原語轉換為包裝類別並以這種方式使用內建方法,建議進行“自動裝箱”,如範例所示:
Character ch = 'a'; Integer i = 10;
請注意,這是一種更直接的方法。您只需一次指派所有值即可。
要執行相反的操作並將資料作為原始類型傳回,您可以使用 valueOf:
方法進行“拆箱”
Integer i = 10; int j = Integer.valueOf(i);
正如我在上一篇文章中所說,製作原語的包裝器具有允許您使用類別的方法並使處理資料時變得更輕鬆的優點。
原語的包裝版本乍看之下可能很像,但是 JVM 不會以相同的方式處理物件和原語,請不要忘記。請記住,基元進入堆疊,物件進入堆[記住這裡]。
就效能而言,很明顯,從原語檢索資料對於電腦來說成本較低,因為值是直接儲存的,而不是透過引用儲存的。取得現成的資料比將個別資料片段放在記憶體中快得多。
但在某些情況下,使用包裝器是必不可少的。例如,當您想要使用 ArrayList 類別時。它只接受物件作為參數,而不接受原始值。
這種從原始到物件的轉換帶來的靈活性,反之亦然,這種語言真的很酷。但我們需要意識到這裡討論的這些陷阱以及許多其他陷阱。
為了震驚社會(笑),我將舉一個有問題的案例的例子,涉及重載時代碼的意外行為(我還沒有發表關於重載的文章,但我會的。基本上,當方法具有不同的簽名時就會發生重載)。
Joshua Bloch 所著的《Effective Java》一書中提到了這個案例。
public class SetListTest { public static void main(String[] args) { Setset = new TreeSet(); List list = new ArrayList(); for (int i = -3; i 在此程式中,目標是將 -3 到 2 [-3, -2, -1, 0, 1, 2] 的整數值加到集合和清單中。然後刪除正值[0,1和2]。但是,如果執行此程式碼,您會注意到集合和清單沒有呈現相同的結果。正如預期的那樣,該集合返回 [-3, -2, -1]。清單返回 [-2, 0, 2].
發生這種情況是因為對 List 類別的內建 remove(i) 方法的呼叫將 i 視為基本型別 int,而不是其他型別。此方法依序刪除位置 i 處的元素。
對Set類別的remove(i)方法的呼叫呼叫了一個重載,該重載接收一個Integer物件作為參數,自動將原本是int的i轉換為Integer。反過來,此方法的行為會從集合中排除值等於 i(而不是等於 i 的索引)的元素 - 請注意,集合和列表的預期類型都是 Integer。 (設定設定/清單清單)。這就是為什麼為 Set 類別的 remove 方法選擇重載,將其轉換為 Integer。
List中的remove行為是依索引刪除,而Set中的remove是依值刪除。所有這些都是由於接收 Integer.
的remove 超載造成的
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3