先看再点赞,给自己一点思考的时间,微信搜索【沉默王二】关注这个有颜值却假装靠才华苟且的程序员。
本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题。

之前我写了一篇《老师,你确定Java注释不会被执行吗》,结果文章在知乎小火了一把,将近 10 万人阅读。有爱装逼的同行批评说,标题夸大了; 同时,也有很多初学者表示,涨见识了,之前从来不知道这个知识点,这下学到了。

必须得承认一点,我写的大多数技术文章都是针对初学者的,因为我觉得他们最需要帮助,这也是我一直坚持分享的初衷。

我也不喜欢写那些高深的文章,费时间耗精力,受众也小。就拿我们学过的古诗来说吧,“鹅鹅鹅,曲项向天歌”,“一去二三里,烟村四五家”,我就觉得挺好的。没必要都去搞阳春白雪,最后搞得曲高和寡,对吧?

那这次来分享一个新的知识点,我敢赌一包卫龙辣条(打钱来),很多同学不一定知道。

在 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) 方法,基数 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() 方法判断了 null 的情况,认为格式不正确。

2)然后判断了基数 radix 的情况,不能小于 2,不能大于 36。

3)if (len > 0) 判断了字符串长度的情况,如果为空“”,也认为格式不正确。

4)再然后判断首个字符 s.charAt(0),如果是负号“-”则认为当前字符串是一个负数;如果不是正号“+”,则认为格式不正确;如果只有一个负号或者正号,也认为格式不正确。

总之,就是比我们的自定义方法 string2int() 更严谨。

5)使用 while 循环,配合更专业的 Character.digit(s.charAt(i++), radix) 计算出每个位置上字符对应的数值,然后和基数 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。

我就问一句,造轮子的感觉是不是很爽?反正我已经爽过了。


我是沉默王二,一枚有颜值却假装靠才华苟且的程序员。关注即可提升学习效率,别忘了三连啊,点赞、收藏、留言,我不挑,奥利给

注:如果文章有任何问题,欢迎毫不留情地指正。

如果你觉得文章对你有些帮助,欢迎微信搜索「沉默王二」第一时间阅读,回复关键字「小白」可以免费获取我肝了 4 万+字的 《Java 小白从入门到放肆》2.0 版;本文 GitHub github.com/itwanger 已收录,欢迎 star。

涨见识!Java String转int还有这种写法的更多相关文章

  1. java string和int之间的相互转化

    java 中string和int之间的相互转化 1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); ...

  2. java String转int int转化为String

    String转int String str = "123"; int a = Integer.parseInt(str); System.out.println(a); Integ ...

  3. 编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试Stud

    package zuoye; public class student { int age; String name; int stuNO; void outPut() { System.out.pr ...

  4. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  5. java中string和int互相转化

    1 怎样将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  6. java在string和int相互转化

    1 如何串 String 转换成整数 int? A. 有两种方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([St ...

  7. Java string和各种格式互转 string转int int转string

    Java string和各种格式互转 string转int int转string 简单收集记录下 其他类型转String String s = String.valueOf( value); // 其 ...

  8. java - Integer、int 、String相互转换总结

    一下子还真记不清这三种数据类型之间的转换方法,所以做个小笔记. public class Test03 { public static void main(String[] args) { //int ...

  9. java和python中的string和int数据类型的转换

    未经允许,禁止转载!!! 在平时写代码的时候经常会用到string和int数据类型的转换 由于java和python在string和int数据类型转换的时候是不一样的 下面总结了java和python ...

随机推荐

  1. 如果你还不知道如何控制springboot中bean的加载顺序,那你一定要看此篇

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功 ...

  2. AI面试之SVM推导

    SVM现在主流的有两个方法.一个是传统的推导,计算支持向量求解的方法,一个是近几年兴起的梯度下降的方法. 梯度下降方法的核心是使用了hinge loss作为损失函数,所以最近也有人提出的深度SVM其实 ...

  3. leetcode题库练习_数组中重复的数字

    题目:数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次 ...

  4. Vue、Nuxt服务端渲染,NodeJS全栈项目,面试小白的博客系统~~

    Holle,大家好,我是李白!! 一时兴起的开源项目,到这儿就告一段落了. 这是一个入门全栈之路的小项目,从设计.前端.后端.服务端,一路狂飙的学习,发量正在欣喜若狂~~ 接触过WordPress,H ...

  5. paramiko上传文件到Linux

    一.传输单个文件到Linux服务器 import paramiko transport = paramiko.Transport(('host',22)) transport.connect(user ...

  6. kafka笔记——入门介绍

    中文文档 目录 kafka的优势 首先几个概念 kafka的四大核心API kafka的基本术语 主题和日志(Topic和Log) 每个分区都是一个顺序的,不可变的队列,并且可以持续的添加,分区中的每 ...

  7. 使用 expect 重启失败的 git pull/push 操作

    问题的提出 最近使用 github 上传.下载项目代码时,经常会卡很久,有时候在命令行打了 git push 然后就去上厕所了,结果等我回来的时候,发现 push 早已经失败了,还得重新提交一下.如果 ...

  8. Java Web(5)-Servlet详解(下)

    一.HttpServletRequest 类 1. HttpServletRequest 类作用? 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解 ...

  9. 删除GIT中的.DS_Store

    转载自:https://www.jianshu.com/p/fdaa8be7f6c3 .DS_Store 是什么 使用 Mac 的用户可能会注意到,系统经常会自动在每个目录生成一个隐藏的 .DS_St ...

  10. __slots__属性

    使用__slots__时,子类不受影响 class Person(object): __slots__ = ("name","age") def __str__ ...