Получите знания! Java String to int также имеет такой способ записи

Java
Получите знания! Java String to int также имеет такой способ записи

Сначала посмотрите, а потом лайкните, дайте себе время подумать, поиск в WeChat [Тихий король 2] Обратите внимание на этого красивого программиста, который делает вид, что полагается на талант. Эта статья GitHub github.com/itwangerОн был включен, а также есть вопросы для интервью, которые я тщательно подготовил для вас.

Я ранее написалСэр, вы уверены, что аннотации Java не будут выполняться?, и статья стала популярной на Zhihu, ее прочитали почти 100 000 человек. Коллеги, которые любят притворяться, ругаются за то, что название преувеличено, в то же время есть и много новичков, которые говорят, что они получили свои знания.Они никогда не знали этого пункта знаний раньше, но они усвоили его сейчас.

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

Я также не люблю писать эти продвинутые статьи, которые требуют времени и энергии и имеют небольшую аудиторию. Возьмем, например, древние стихотворения, которые мы выучили: «Гусь, гусь, гусь, песня Цюй Сян Сянтянь», «От одной до двух или трех миль, четыре или пять домов в Яньцуне», я думаю, что это очень хорошо. Нет необходимости изо всех сил делать весну и снег, чтобы в итоге получить максимум и минимум, верно?

Тогда на этот раз я поделюсь новым пунктом знаний, Держу пари, что пачка острых палочек Weilong (чтобы заработать деньги), многие студенты могут этого не знать.

В Java String (строка) и int (формирование) — это два разных типа данных.Строки могут объединять множество строк, и их формирование — это формирование.

(Студенты могут задаться вопросом: я не знаю этого знания, не обманывайте меня, хорошо? Продолжайте читать. Прежде чем плотно поесть, можете ли вы заказать закуски или холодные блюда?)

Иногда строки могут содержать просто числа, например «123». Все должны были видеть, что когда для некоторых операций требуется ввести код подтверждения мобильного телефона, большая часть требуемого ввода представляет собой 6-значные или 4-значные случайные числа.Когда они передаются на сервер, исходная форма представляет собой строковый тип, а затем может быть преобразован в форму для некоторой обработки.

Для Java невозможно добавить два числа строкового типа напрямую через оператор «+», см. следующий пример.

String a = "100";
String b = "50";
String c = a+b;
System.out.println(c);

Вывод программы 10050, а не 150. Для строк оператор «+» используется для конкатенации, а не для сложения.

(Студенты могут еще раз настаивать, я тоже знаю эту точку знаний! Сразу, скоро придет ключевая точка.)

Затем необходимо преобразовать строку в целое число перед выполнением операции.Существует два распространенных метода:

Во-первых, используйтеInteger.valueOf(), он вернет тип оболочки Integer, конечно, его можно преобразовать в тип int путем автоматической распаковки.

String a = "100";
String b= "50";
int A = Integer.valueOf(a);
int B = Integer.valueOf(b);

int c = A+B;
System.out.println(c);

Вывод программы следующий:

150

Во-вторых, используйтеInteger.parseInt(), который возвращает примитивный тип данных int.

String a = "100";
String b= "50";
int A = Integer.parseInt(a);
int B = Integer.parseInt(b);

int c = A+B;
System.out.println(c);

Вывод программы следующий:

150

Из этих двух методов второй метод предпочтительнее, поскольку он не требует автоматической распаковки и обеспечивает лучшую производительность.

(Студенты могут быть нетерпеливы, вот и все? Ну, теперь дело действительно здесь)

В дополнение к двум вышеупомянутым методам, могут ли учащиеся придумать третий метод? Преобразование строки в целое число. Вы вдруг чувствуете небольшую пустоту в голове?

Пусто правильно, когда эта статья самая проницательная, она здесь! Пришел спотыкаясь!

/**
 * @author 沉默王二,一枚有趣的程序员
 */
public class String2IntDemo {
    public static void main(String[] args) {
        String a = "100";
        String b = "50";
        int A = string2int(a);
        int B = string2int(b);
        int c = A + B;
        System.out.println(c);
    }

    public static int string2int(String s) {
        int num = 0;
        int pos = 1;
        for (int i = s.length() - 1; i >= 0; i--) {
            num += (s.charAt(i) - '0') * pos;
            pos *= 10;

        }
        return num;

    }
}

Результат этой программы также равен 150. Острый одноклассник, возможно, узнал,string2int()Что это за магический метод, и эффект от преобразования струны в фигуру?

В первую очередь необходимо популяризировать немного здравого смысла.Учащиеся должны немного понимать код ASCII, то есть все символы имеют коды для их идентификации - этот код и есть код ASCII.

Исходя из этого, все числовые символы за вычетом символа «0» получат абсолютное значение этого символа, которое является целым числом.

String s = "520";
System.out.println(s.charAt(2) - '0');
System.out.println(s.charAt(1) - '0');
System.out.println(s.charAt(0) - '0');

Результат выглядит следующим образом:

0
2
5

Длина строки «520» равна 3, то есть позиция нижнего индекса 2 соответствует символу «0» — однозначному разряду числа 520; позиция нижнего индекса 1 соответствует символу «2» — числу 520 – цифра десятков, где нижний индекс 0 – символ "5" – цифра сотен числа 520.

Некоторые сообразительные ученики, возможно, додумались до этого: с помощью цикла for проход по строке, а затем вычисление целочисленного значения в текущей позиции, умножение одной цифры на 1, умножение цифры десятков на 10 и умножение цифры сотен на 100. , а затем сложите его, это целочисленное значение, соответствующее строке.

Это правильно, это правильно,string2int()Это то, что делает метод. Если параметром является строка "520", возвращаемым результатом является целое число 520, если параметром является строка "100", возвращаемым результатом является целое число 100, если параметром является строка " 50", то возвращается целое число 50.

Если вы начинающий программист, то дляInteger.valueOf()а такжеInteger.parseInt()Ни один из них не будет очень доволен, потому что это просто использование чужого колеса. И пользовательский методstring2int()Он принадлежит колесному строительству от начала до конца. Думая об этом, вы чувствуете, что начинаете становиться высокомерным?

На самом деле, если вы готовы вытащить исходный код, вы внезапно это поймете.

Первый взглядInteger.valueOf()метод:

public static Integer valueOf(String s) throws NumberFormatException {
    return Integer.valueOf(parseInt(s, 10));
}

Внутренний вызов на самом делеint parseInt(String s, int radix)метод.

увидеть сноваInteger.parseInt()метод:

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
}

Также называется внутреннимint parseInt(String s, int radix)метод, базовый параметр системы счисления равен всем 10 — учащиеся что-то угадали?

Да, ваша догадка близка к десяти, давайте посмотримint parseInt(String s, int radix)Исходный код метода:

public static int parseInt(String s, int radix)
        throws NumberFormatException
{
    /*
     * WARNING: This method may be invoked early during VM initialization
     * before IntegerCache is initialized. Care must be taken to not use
     * the valueOf method.
     */

    if (s == null) {
        throw new NumberFormatException("null");
    }

    if (radix < Character.MIN_RADIX) {
        throw new NumberFormatException("radix " + radix +
                " less than Character.MIN_RADIX");
    }

    if (radix > Character.MAX_RADIX) {
        throw new NumberFormatException("radix " + radix +
                " greater than Character.MAX_RADIX");
    }

    boolean negative = false;
    int i = 0, len = s.length();
    int limit = -Integer.MAX_VALUE;

    if (len > 0) {
        char firstChar = s.charAt(0);
        if (firstChar < '0') { // Possible leading "+" or "-"
            if (firstChar == '-') {
                negative = true;
                limit = Integer.MIN_VALUE;
            } else if (firstChar != '+') {
                throw NumberFormatException.forInputString(s, radix);
            }

            if (len == 1) { // Cannot have lone "+" or "-"
                throw NumberFormatException.forInputString(s, radix);
            }
            i++;
        }
        int multmin = limit / radix;
        int result = 0;
        while (i < len) {
            // Accumulating negatively avoids surprises near MAX_VALUE
            int digit = Character.digit(s.charAt(i++), radix);
            if (digit < 0 || result < multmin) {
                throw NumberFormatException.forInputString(s, radix);
            }
            result *= radix;
            if (result < limit + digit) {
                throw NumberFormatException.forInputString(s, radix);
            }
            result -= digit;
        }
        return negative ? result : -result;
    } else {
        throw NumberFormatException.forInputString(s, radix);
    }
}

1)parseInt()Метод оценивает нулевой регистр и считает, что формат неверен.

2) Затем оценивается основание основания, которое не может быть меньше 2 и не может быть больше 36.

3)if (len > 0)Судя по длине строки, если она пустая "", то формат тоже считается неверным.

4) Затем оцените первого персонажаs.charAt(0), если это отрицательный знак "-", текущая строка считается отрицательным числом, если это не положительный знак "+", считается, что формат неверен, если есть только один отрицательный знак или положительный знак, также считается, что формат неверен.

Короче говоря, это лучше, чем наш собственный методstring2int()более строгий.

5) Используйте цикл while с более профессиональнымCharacter.digit(s.charAt(i++), radix)Вычислите значение, соответствующее символу в каждой позиции, затем умножьте его на основание счисления и используйте метод кумулятивного вычитания для вычисления окончательного значения.

а такжеstring2int()Немного другой, но общая идея та же.

мы также можемstring2int()Метод снова совершенствуется, чтобы он удовлетворял случаю отрицательных чисел:

public class S2IDemo {
    public static void main(String[] args) {
        String a = "-100";
        String b = "50";
        int A = string2int(a);
        int B = string2int(b);
        int c = A + B;
        System.out.println(c);
    }

    public static int string2int(String s) {
        boolean negative = false;
        char firstChar = s.charAt(0);
        if (firstChar == '-') {
            negative = true;
            s = s.substring(1);
        }
        int num = 0;
        int pos = 1;
        for (int i = s.length() - 1; i >= 0; i--) {
            num += (s.charAt(i) - '0') * pos;
            pos *= 10;

        }
        return negative ? -num : num;
    }
}

Если первым символом является знак минус '-', результат возвращает отрицательное число, а первый символ усекается из исходной строки. Другие вещи остаются неизменными.В настоящее время, когда a равно «-100», а b равно «50», результат a + b равен -50.

Я просто спрашиваю, приятно ли строить колесо? Во всяком случае, я был взрыв.


Я Тихий Король Эр, красивый программист, который делает вид, что полагается на свой талант.Подпишитесь, чтобы повысить эффективность обучения, не забудьте три раза подряд ах, лайк, избранное, оставить сообщение, я не выбираю, Олли дает 🌹.

Примечание. Если в статье есть какие-либо проблемы, пожалуйста, исправьте их.

Если вы считаете, что статья полезна для вас, добро пожаловать в поиск WeChat »Тихий король 2"Прочтите в первый раз, ответьте на ключевое слово"нуб«Вы можете бесплатно получить версию 2.0 «Java Xiaobai от новичка до самонадеянного» с более чем 40 000 слов моей печени; эта статьяGitHub github.com/itwangerОн был записан, добро пожаловать в звезду.