先看再点赞,给自己一点思考的时间,微信搜索【沉默王二】关注这个有颜值却假装靠才华苟且的程序员。
本文 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_VALUEint 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。

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


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

涨见识!Java String转int还有这种写法相关推荐

  1. Java String到int,Java int到String

    Today we will look at Java String to int conversion and then java int to String conversion. Java pro ...

  2. java string转int 异常_Java中String转int型的方法以及错误处理

    应要求,本周制作了一个判断一个年份是否是闰年的程序.逻辑很简单,这里就不贴代码了.可是,在这次程序编写中发现了一个问题. 在输入年份时,如果输入1)字母2)空3)超过Int上限时,就会抛excepti ...

  3. JAVA string、int、 double 转换

    1.查看数据类型 a.getClass().toString(); 2.string转int,如果 string中包含空格.包含小数点 会报错 string去掉空格: System.out.print ...

  4. Java String转int、float、double

    int i; String s1="134"; i=Integer.parseInt(s1); 如果是float可以用强制类型转换. Float.parseFloat(); Dou ...

  5. Java String 字符串

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://my.oschina.net/brucelee80/blog String String是引用类型而非基 ...

  6. JAVA 中 string 和 int 互相转化

    在实际开发工作中,有时候为因为一些特殊原因,做类型转换,今天说一下string类型和int类型之间的转换. 1 如何将字串 String 转换成整数 int? A. 有两个方法: 1. int i = ...

  7. 如何在Java中将String转换为int?

    如何在Java中将String转换为int ? 我的字符串仅包含数字,我想返回它代表的数字. 例如,给定字符串"1234" ,结果应为数字1234 . #1楼 好吧,要考虑的一个非 ...

  8. java indexof int,int indexOf(String str, int fromIndex)

    int indexOf(String str, int fromIndex) 描述 (Description) java.lang.String.indexOf(String str, int fro ...

  9. 如何在Java中将String转换为int

    在本教程中,我们将看到将Java中的String转换为int(或Integer)的各种方法. 您可以使用以下任何一种方式: –使用Integer.parseInt(string) –使用Integer ...

  10. Java String indexOf(int ch)方法与示例

    字符串indexOf(int ch)方法 (String indexOf(int ch) Method) indexOf(int ch) is a String method in Java and ...

最新文章

  1. 超越对手pdf_如何创建一个超越竞争对手的移动应用
  2. Qt 多线程TCP服务端一键关闭所有客户端
  3. IDEA突然自动关闭然后无法启动
  4. 【Python】Python3.7.3 - Collections (Arrays) - List数据类型
  5. 【Android Developers Training】 20. 创建一个Fragment
  6. 数值方法与计算机算法试卷,《数值方法与计算机算法》课程教学大纲.pdf
  7. pythonweb静态服务器_python实现外部静态服务器,浏览器通过HTTP与之通信2
  8. MySQL 主键、索引创建
  9. GridinSoft CHM编辑器3.2.0多语言,轻松快速地翻译CHM电子书
  10. office创建数据透视表
  11. 英特尔科技论坛 北京登场
  12. C语言程序——摄氏度和华氏度之间的转换
  13. 知识图谱关键技术及行业应用解读
  14. TOLUA的文件结构
  15. Java项目:自习室图书馆座位预约管理系统(java+SSM+JSP+easyUI+mysql)
  16. switch细节讨论
  17. 联通的光纤--无线路由--mac过滤--存在问题
  18. KVM 虚拟化 介绍
  19. 创建OE Order报Pre_Write_Process错误
  20. PHPstudy之PHP探针的查找

热门文章

  1. UI设计新手该怎么求职 有没有UI面试必备攻略
  2. NBT:扩增子及其他测序的最少信息标准和测序规范(MIMARKS)
  3. Stata: 断点回归(RDD)中的近似置换检验和伴随次序统计简介
  4. 内网渗透靶场(上)加入目标网段,抓取管理员密码 #zkaq
  5. java动漫项目_狂拽酷炫diao炸天的开源动画项目:lottie-android,拿来就用!
  6. 生产环境服务CPU飙升问题分析
  7. 23位子网掩码是多少_24 28 30 位的子网掩码是多少
  8. 运维团队(OPS)与技术团队有效沟通配合探讨
  9. MySQL中对索引的理解 特点 优势_深入理解MySQL索引和优化
  10. JS逆向-易班登录password参数(RSA加密)