涨见识!Java String转int还有这种写法
先看再点赞,给自己一点思考的时间,微信搜索【沉默王二】关注这个有颜值却假装靠才华苟且的程序员。
本文 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。
我就问一句,造轮子的感觉是不是很爽?反正我已经爽过了。
我是沉默王二,一枚有颜值却假装靠才华苟且的程序员。关注即可提升学习效率,别忘了三连啊,点赞、收藏、留言,我不挑,奥利给
Today we will look at Java String to int conversion and then java int to String conversion. Java pro ... 应要求,本周制作了一个判断一个年份是否是闰年的程序.逻辑很简单,这里就不贴代码了.可是,在这次程序编写中发现了一个问题. 在输入年份时,如果输入1)字母2)空3)超过Int上限时,就会抛excepti ... 1.查看数据类型 a.getClass().toString(); 2.string转int,如果 string中包含空格.包含小数点 会报错 string去掉空格: System.out.print ... int i; String s1="134"; i=Integer.parseInt(s1); 如果是float可以用强制类型转换. Float.parseFloat(); Dou ... 2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://my.oschina.net/brucelee80/blog String String是引用类型而非基 ... 在实际开发工作中,有时候为因为一些特殊原因,做类型转换,今天说一下string类型和int类型之间的转换. 1 如何将字串 String 转换成整数 int? A. 有两个方法: 1. int i = ... 如何在Java中将String转换为int ? 我的字符串仅包含数字,我想返回它代表的数字. 例如,给定字符串"1234" ,结果应为数字1234 . #1楼 好吧,要考虑的一个非 ... int indexOf(String str, int fromIndex) 描述 (Description) java.lang.String.indexOf(String str, int fro ... 在本教程中,我们将看到将Java中的String转换为int(或Integer)的各种方法. 您可以使用以下任何一种方式: –使用Integer.parseInt(string) –使用Integer ... 字符串indexOf(int ch)方法 (String indexOf(int ch) Method) indexOf(int ch) is a String method in Java and ...涨见识!Java String转int还有这种写法相关推荐
最新文章
热门文章