Начинающий Java вопрос о Integer.parseInt() и литье

поэтому при кастинге, как в приведенном ниже заявлении: -

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

это вызывает случайное нет. генерируется для преобразования в int..

также есть этот метод, с которым я только что столкнулся Integer.parseInt () который делает то же самое !

i.e возвращает целое число

почему два разных способа сделать значение int ?

также я сделал поиск, и он говорит, что parseInt () принимает строку в качестве аргумента.. Значит ли это, что parseInt () только для преобразовать строку в целое число ?

Как насчет этого кастинга тогда (int)?? Можем ли мы использовать это для преобразования строки в int?

извините, если это звучит как глупый вопрос..Я просто запутался и пытаюсь понять

помочь ?

7 ответов


целое число.parseInt не делает то же самое, что и cast.

давайте посмотрим на ваш первый пример:

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

математика.random возвращает double, и при умножении double на int Java считает результат двойным. Таким образом, математическое выражение.random ()*5 имеет тип double. Вы пытаетесь присвоить это значение переменной типа int. По умолчанию Java не позволит вам присвоить удвоенное значение переменной типа int без вашего явно говоря компилятору, что это нормально. В принципе, вы можете подумать о приведении double к int как о сообщении компилятору: "я знаю, что эта переменная int не может содержать десятичную часть этого двойного значения, но это нормально, просто усеките ее."

теперь взгляните на преобразование строки в int:

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

строка "5" не сразу преобразуется в целое число. В отличие от двойников, которые по определению могут быть преобразованы в целое число путем отбрасывания дробной часть, строки не могут быть легко или последовательно преобразованы в int. "5", "042" и "1,000" имеют целочисленные представления, но что-то вроде " Привет, Мир!- вовсе нет. Из-за этого нет функции языка первого порядка для преобразования строки в int. Вместо этого используется метод для анализа строки и возврата значения.

чтобы ответить на все ваши вопросы:

почему два разных способа сделать значение int ?

вы должны примите во внимание, какой тип значения вы конвертируете. Если вы преобразуете примитив в int, вы можете использовать приведение, если вы преобразуете объект, вам нужно будет использовать какой-то метод преобразования, специфичный для этого типа.

также я сделал поиск, и он говорит, что parseInt () принимает строку в качестве аргумента.. Значит ли это, что parseInt () предназначен только для преобразования строки в целое число ?

правильно. Вы не можете передать какой-либо другой тип в parseInt метода или вы получите ошибку компилятора.

Как насчет этого кастинга тогда (int)?? Можем ли мы использовать это для преобразования строки в int?

нет, приведение к int будет работать только для примитивных значений, а в Java строка не является примитивом.


в вашем примере вы бросаете число с плавающей запятой в int. Целое число.parseInt (), однако, считывает целочисленное значение из строки.


вы можете использовать только совместимые типы (я бы связался с JLS, но это может быть слишком много для вопроса новичка).

кастинг в основном просто принимает значение и говорит: "Эй, эта вещь, которая была двойной? Теперь это int. Вот так."

вы не можете сделать это со строкой, потому что это не что-то вроде int. Вы должны вместо анализировать int из него, что на самом деле намного сложнее, чем кажется. К счастью, он уже реализован для чтобы тебе не пришлось беспокоиться о том, как это работает.


кастинг может преобразовываться только из одного числового типа в другой. Интерпретация строки (aka parsing) должна выполняться с помощью вызова метода.


давайте сверху.

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

Да, это действительно дает случайное целое число между 0 и 4, но это очень не правильный способ сделать это. Видите ли, если вы забыли скобку, то есть вы вводите

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

вы всегда получите 0, потому что кастинг имеет более высокий приоритет, чем умножение. То есть результат математики.random() сначала принуждается к целому числу, которое всегда будет 0, а затем умножается на 5, что по-прежнему 0.

Я бы предпочел использовать java.утиль.Random для генерации случайных целых чисел. q.v.http://java.sun.com/javase/6/docs/api/java/util/Random.html#nextInt (int).

кастинг может выполняться только между "совместимыми типами". Для примитивных типов и их оболочек (т. е. int, Integer, long, Long, &c.) ты можешь!--13-->всегда бросьте между ними с оговоркой, что некоторые преобразования теряют информацию. например, при приведении long к int long может содержать число больше целого.МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ.] Этот вид кастинга Java в основном получил от C++ , который он, в свою очередь, получил от C.

что касается кастинга объектов, это на самом деле проще. Просто спросите: "является ли этот объект, o, X?"Если это так, то (X) o имеет смысл и имеет статический тип X. Если o не является X, и вы все равно пытаетесь бросить, вы получите ClassCastException, означающее, что динамический (runtime) тип o не совместим с X. Это, вероятно, будет иметь гораздо больше смысла позже, когда вы получите разницу между статическим и динамическим (runtime) типами объектов.


следующий код преобразует строку в 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 () метод доступен во многих форматах, целочисленный класс, имеющий метод ParseInt () который является статическим методом, мы называем этот метод целочисленным.ParseInt()

  2. аналогично двойной класс, имеющий ParseDouble (), и мы называем его двойным.ParseDouble().

  3. более общий способ-XXXX.ParseXXXX ()

  4. основное использование этого метода заключается в преобразовании любого объекта в Примитивный.

  5. и здесь вы можете поставить вопрос, почему нам нужно конвертировать в примитивы? Ответ: мы знаем, что примитивы хранятся в области стека, а объекты хранятся в области кучи, и вы не хотите тратить память кучи, и Вы можете преобразовать объект в примитив.

  6. и другое, при доступе к любому объекту могут быть накладные расходы. Его лучше использовать как примитивный.