【问题标题】:Beginner Java Question about Integer.parseInt() and casting关于 Integer.parseInt() 和强制转换的 Java 初学者问题
【发布时间】:2011-02-21 23:08:02
【问题描述】:

所以当像下面的语句一样投射时:-

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

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

还有一个我刚刚遇到的 Integer.parseInt() 方法也一样!

即返回一个整数

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

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

那么这个转换呢(int)??我们也可以使用它来将字符串转换为 int 吗?

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

帮助?

【问题讨论】:

  • 这不会解决您的 ParseInt 问题,但请考虑使用 java.util.Random。你可以做Random rand = new Random() 和int dieRoll = rand.nextInt(6)+1; (注意,nextInt 返回 0 到 (n-1),这就是为什么上面有额外的 1)
  • @glowcoder:我也正要发表评论。令人惊讶的是,我们仍然经常看到这种Math.random() * N 废话。
  • 以您的方式质疑这一点做得很好,尤其是关于我们可以使用 (int) 将字符串转换为 int 的问题。

标签: java casting parseint


【解决方案1】:

Integer.parseInt 的作用与强制转换不同。

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

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

Math.random 返回一个双精度数,当您将双精度数乘以一个整数时,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 的一阶语言功能。相反,您使用一种方法来解析字符串并返回值。

所以回答你所有的问题:

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

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

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

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

那么这个转换呢(int)??我们也可以使用它来将字符串转换为 int 吗?

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

【讨论】:

  • 哇..谢谢大家!现在事情变得有意义了..我只是尝试将一个词传递给 parseInt() ..它显示了一个错误,说明线程中有一些异常
  • @happysoul 没错!查看该方法的 javadoc:java.sun.com/j2se/1.5.0/docs/api/java/lang/…,注意它说如果您传入的字符串不是可解析的 int,它将抛出 NumberFormatException。
【解决方案2】:

在您的示例中,您将浮点数转换为 int。然而,Integer.parseInt() 从字符串中读取整数值。

【讨论】:

  • 哦,Math.random() 不会生成双精度数吗?
【解决方案3】:

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

铸造基本上只是接受一个值并说,“嘿,这个东西是一个双精度数?现在它是一个整数。所以那里。”

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

【讨论】:

  • 啊好的..我现在明白了..谢谢,但是嘿,我实际上正在考虑看看这些方法的代码,即 parseInt() 和 random() 的代码......我只是想看看它们实际上是如何工作的(我知道我不会全部理解,但至少会有所了解)..我在哪里可以找到整数和数学类?它们存储在我的电脑上的什么位置?
  • @happysoul:根据您安装 JDK 的方式,您可能在 C:\Program Files\Java\(您的 JDK 文件夹)中有一个名为 src.zip 的 zip 文件。打开它并在 java\lang 中查找 Integer 和 Math。或者,如果您的 IDE 设置正确,您可能只需 ctrl+单击方法名称即可直接跳转到它。
  • @happysoul:安装一个。它可能会在第一天左右让您放慢速度,但您的其余学习体验会更加顺畅。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    让我们从头开始。

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

    是的,这确实给出了一个介于 0 和 4 之间的随机整数,但这不是正确的做法。你看,如果你忘记了一个括号,即你输入了

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

    您将始终得到 0,因为强制转换的优先级高于乘法。也就是说Math.random()的结果先被强制成一个整数,永远为0,再乘以5,还是0。

    我倾向于使用 java.util.Random 来生成随机整数。 q.v. 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 得到的。

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

    【讨论】:

      【解决方案6】:

      以下代码将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

      【讨论】:

        【解决方案7】:
        1. Parse() 方法有多种格式,Integer 类有 ParseInt() 方法是一个静态方法,我们通过 Integer.ParseInt() 调用该方法

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

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

        4. 该方法的主要用途是将任意Object转化为Primitive。

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

        6. 另外,在访问任何对象时,可能会有开销。 最好用作 Primitive。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 2019-09-01
          • 1970-01-01
          • 2011-01-12
          • 2018-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多