[英]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
Parse()方法有多種格式,Integer類具有靜態方法ParseInt(),我們通過Integer.ParseInt()調用此方法。
同樣,Double類具有ParseDouble(),我們將其稱為Double.ParseDouble()。
更通用的方式是XXXX.ParseXXXX()
此方法的主要用途是將任何Object轉換為Primitive。
在這里您可以提出一個問題,為什么我們需要轉換為原始體? 答案是,我們知道基元存儲在堆棧區域中,而對象存儲在堆區域中,並且您不想浪費堆內存,可以將對象轉換為基元。
另一方面,在訪問任何對象時可能會有開銷。 最好用作原始體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.