关于Integer.parseInt()和转换的初学者Java问题

时间:2010-05-20 15:57:17

标签: java casting parseint

所以当在下面的陈述中进行投射时: -

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

它导致随机编号。生成以转换为int ..

还有这种方法我刚刚遇到Integer.parseInt()也是这样做的!

即返回一个整数

为什么有两种不同的方法可以使值成为int?

我也进行了搜索,它说parseInt()将字符串作为参数。所以这是否意味着parseInt()只能将String转换为整数?

然后(int)怎么样?我们可以使用它将字符串转换为int吗?

抱歉,如果这听起来像一个愚蠢的问题......我只是困惑并试图理解

帮助?

7 个答案:

答案 0 :(得分:16)

Integer.parseInt与演员表的作用不同。

让我们来看看你的第一个例子:

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

Math.random返回一个double,当你将double乘以int时,Java认为结果是double。因此,表达式Math.random()* 5的类型为double。您要做的是将该值赋给int类型的变量。默认情况下,Java不允许您为int类型的变量分配double值,而不明确告诉编译器可以这样做。基本上你可以考虑将一个double转换为int来告诉编译器,“我知道这个int变量不能保存这个double值的小数部分,但是没关系,只是截断它。”

现在看看将String转换为int:

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

字符串“5”不能立即转换为整数。与双精度不同,根据定义,可以通过删除小数部分将其转换为整数,但不能轻易地或一致地将字符串转换为int。 “5”,“042”和“1,000”都有整数表示,但类似“Hello,World!”才不是。因此,没有用于将String转换为int的一阶语言功能。相反,您使用方法来解析String并返回值。

所以回答你的所有问题:

  

为什么有两种不同的方法可以使值成为int?

您必须考虑要转换的值的类型。如果要将基元转换为int,则可以使用转换,如果要转换对象,则需要使用某种特定于该类型的转换方法。

  

我也进行了搜索,它说parseInt()将字符串作为参数。所以这是否意味着parseInt()只能将String转换为整数?

正确。您不能将任何其他类型传递给parseInt方法,否则您将收到编译器错误。

  

然后(int)怎么样?我们可以使用它将字符串转换为int吗?

不,转换为int仅适用于原始值,而在Java中,String不是原始值。

答案 1 :(得分:4)

在您的示例中,您将一个浮点数转换为int。但是,Integer.parseInt()从String中读取整数值。

答案 2 :(得分:3)

你只能在兼容类型之间进行转换(我链接到JLS但对于初学者问题可能太多了。)

施放基本上只是取一个值并且说,“嘿,这个东西是双重的?现在它是一个整数。所以那里。”

你不能用字符串来做,因为它不像int。你必须改为解析一个int,这实际上比听起来要困难得多。幸运的是,它已经为您实现,因此您不必担心它是如何工作的。

答案 3 :(得分:1)

转换只能从一种数字类型转换为另一种数字类型。解释字符串(也就是解析)需要通过方法调用来完成。

答案 4 :(得分:1)

让我们从顶部开始。

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

是的,确实提供了0到4之间的随机整数,但这不是正确的方法。你看,如果你忘了一个括号,即你输入

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

你总是得到0,因为施法的优先级高于乘法。也就是说,Math.random()的结果首先被强制转换为一个整数,它总是为0然后再乘以5,它仍然是0。

我赞成使用java.util.Random生成随机整数。剂适量http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextInt(int)

只能在“兼容类型”之间进行投射。对于原始类型及其包装器(即int,Integer,long,Long和& c。),您可以始终在它们之间进行转换,并注意某些转换会丢失信息。例如当将long转换为int时,long可能包含大于Integer.MAX_VALUE的数字。这种类型的Java基本上来自C ++,它又来自C。

至于铸造物体,它实际上更简单。简单地问“这个对象是o,是X吗?”如果是这样那么(X)o是有意义的并且具有静态类型X.如果o不是X并且你仍尝试强制转换,你将得到一个ClassCastException,表示o的动态(运行时)类型与X不兼容。这将当你得到静态和动态(运行时)类型的对象之间的差异时,可能会更有意义。

答案 5 :(得分:0)

以下代码将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” - &gt; 3256

答案 6 :(得分:0)

  1. Parse()方法有多种格式,Integer类有方法ParseInt()这是一个静态方法,我们通过Integer.ParseInt()来调用这个方法

  2. 类似于具有ParseDouble()的Double类,我们将其称为Double.ParseDouble()。

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

  4. 此方法的主要用途是将任何对象转换为基元。

  5. 在这里你可以提出一个问题,为什么我们需要转换为基元? 答案是,我们知道原语存储在堆栈区域中,对象存储在堆区域中,您不想浪费堆内存,也可以将对象转换为基元。

  6. 另一方面,访问任何对象时可能会有Overhead。 最好用作原语。