簡體   English   中英

有關Integer.parseInt()和強制轉換的Java初學者問題

[英]Beginner Java Question about Integer.parseInt() and casting

因此,當像下面的語句中那樣進行鑄造時:

int randomNumber=(int) (Math.random()*5)

它會導致隨機編號。 生成以將其轉換為一個整數。

還有就是我剛遇到Integer.parseInt()的這種方法!

即返回一個整數

為什么用兩種不同的方法將值變成int?

我也進行了搜索,它說parseInt()將string作為參數。.這是否意味着parseInt()僅將String轉換為整數?

那么這個(int)轉換呢? 我們也可以使用它來將字符串轉換為int嗎?

抱歉,如果聽起來像是一個愚蠢的問題。.我只是感到困惑並試圖理解

救命 ?

Integer.parseInt與演員表的功能不同。

讓我們看一下您的第一個示例:

int randomNumber=(int) (Math.random()*5)

Math.random返回一個雙精度數,當您將一個雙精度數乘以一個int時,Java會將結果視為一個雙精度數。 因此,表達式Math.random()* 5具有double類型。 您想要做的就是將該值分配給int類型的變量。 默認情況下,如果您未明確告知編譯器可以這樣做,則Java不允許您將double值分配給int類型的變量。 基本上,您可以考慮將一個double轉換為一個int,告訴編譯器,“我知道這個int變量不能容納這個double值的小數部分,但是沒關系,只需截斷它即可。”

現在看一下String到int的轉換:

int value = Integer.parseInt("5");

字符串“ 5”不能立即轉換為整數。 與雙精度字符不同,雙精度字符可以定義為可以通過刪除小數部分將其轉換為整數,而字符串則不能輕易或始終如一地轉換為int。 “ 5”,“ 042”和“ 1,000”都具有整數表示形式,但是類似“ Hello,World!”之類的東西。 才不是。 因此,沒有用於將String轉換為int的一階語言功能。 而是使用一種方法來解析String並返回值。

因此,回答所有問題:

為什么用兩種不同的方法將值變成int?

您必須考慮要轉換的值的類型。 如果要將基元轉換為int,則可以使用強制轉換;如果要轉換Object,則需要使用特定於該類型的某種轉換方法。

我也進行了搜索,它說parseInt()將string作為參數。.這是否意味着parseInt()僅將String轉換為整數?

正確。 您不能將任何其他類型傳遞給parseInt方法,否則會出現編譯器錯誤。

那么這個(int)轉換呢? 我們也可以使用它來將字符串轉換為int嗎?

不,強制轉換為int僅適用於原始值,在Java中,String不是原始值。

在您的示例中,您正在將浮點數強制轉換為int。 但是,Integer.parseInt()從字符串讀取一個整數值。

您只能在兼容的類型之間進行轉換(我會鏈接到JLS,但對於初學者來說可能太多了)。

基本上,轉換只是取一個值,然后說:“嘿,這是雙重的東西?現在是整數。所以就在那里。”

您不能使用字符串來執行此操作,因為它與int不同。 相反,您必須從中解析出一個int,這實際上比聽起來要難得多。 幸運的是,它已經為您實現了,因此您不必擔心它如何工作。

強制轉換只能從一種數字類型轉換為另一種數字類型。 解釋字符串(也稱為解析)需要通過方法調用來完成。

讓我們從頭開始。

int randomNumber=(int) (Math.random()*5);

是的,這確實的確給出了0到4之間的隨機整數,但這不是正確的方法。 您會發現,如果忘記了括號,即鍵入

int notSoRandomNumber=(int) Math.random()*5;

您總是會得到0,因為強制轉換的優先級高於乘法。 也就是說Math.random()的結果首先被強制轉換為整數,該整數將始終為0,然后將其乘以5(仍為0)。

我希望使用java.util.Random生成隨機整數。 qv http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextInt(int)

只能在“兼容類型”之間進行轉換。 對於原始類型及其包裝器(即int,Integer,long,Long等),您始終可以在它們之間進行轉換,但要注意,某些轉換會丟失信息。 例如,將long轉換為int時,long可能包含一個大於Integer.MAX_VALUE]的數字。 這種類型的Java基本上是從C ++獲得的,而C ++又是從C獲得的。

至於投射對象,實際上更簡單。 只需問“這是X,不是嗎?” 如果是這樣,則(X)o是有意義的,並且具有靜態類型X。如果o不是X,並且無論如何嘗試進行強制轉換,則將收到ClassCastException,表明o的動態(運行時)類型與X不兼容。這將當您獲得靜態和動態(運行時)類型的對象之間的區別之后,可能更有意義。

以下代碼無需任何方法即可將String轉換為int

public class MyStringToNumber {

    public static int convert_String_To_Number(String numStr){

        char ch[] = numStr.toCharArray();
        int sum = 0;
        //get ascii value for zero
        int zeroAscii = (int)'0'; // '0'=48 zeroAscii=48
        for(int i=0;i<ch.length;i++){
            int tmpAscii = (int)ch[i]; // for 0  ch[i]=3,3=51, tempAscii=51
                                       //         (0*10)+(51-48)
                                       //         0     +3
                                       //         3
                                       //      sum=3
                                       // for 1  ch[i]=2,2=50, tempAscii=50            
            sum = (sum*10)+(tmpAscii-zeroAscii);  // 0 +(51-48)=3 sum=3
                                                  // (3*10)=30+(50-48)
                                                  //           30  +  2
                                                  //   sum=32
                                       // for 2  ch[i]=5, 5=53 tempAscii=53
                                       //         (32*10)+(53-48)
                                       //          320   + 5
                                       //          325     
                                       //  sum=325
                                      // for 3   ch[i]=6,6=54, tempAscii=54
                                      //         (325*10)+(54-48)
                                      //         3250 +6
                                     //         3256
                                     //    sum=3256
        }
        return sum;
    }

    public static void main(String a[]){

        System.out.println("\"3256\" == "+convert_String_To_Number("3256"));
    }
}

輸出“ 3256”-> 3256

  1. Parse()方法有多種格式,Integer類具有靜態方法ParseInt(),我們通過Integer.ParseInt()調用此方法。

  2. 同樣,Double類具有ParseDouble(),我們將其稱為Double.ParseDouble()。

  3. 更通用的方式是XXXX.ParseXXXX()

  4. 此方法的主要用途是將任何Object轉換為Primitive。

  5. 在這里您可以提出一個問題,為什么我們需要轉換為原始體? 答案是,我們知道基元存儲在堆棧區域中,而對象存儲在堆區域中,並且您不想浪費堆內存,可以將對象轉換為基元。

  6. 另一方面,在訪問任何對象時可能會有開銷。 最好用作原始體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM