String 与 int 类型之间的互相转换_string int-程序员宅基地

技术标签: java基础  


1 如何将字串 String 转换成整数 int?

A. 有两个方法:

1). int i = Integer.parseInt([String]); 或

i = Integer.parseInt([String],[int radix]);

2). int i = Integer.valueOf(my_str).intValue();

注: 字串转成 Double, Float, Long 的方法大同小异.

2 如何将整数 int 转换成字串 String ?

A. 有叁种方法:

1.) String s = String.valueOf(i);

2.) String s = Integer.toString(i);

3.) String s = "" + i;

注: Double, Float, Long 转成字串的方法大同小异.

 

int -> String 

int i=12345;
String s="";
第一种方法:s=i+"";
第二种方法:s=String.valueOf(i);
这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?

String -> int 

s="12345";
int i;
第一种方法:i=Integer.parseInt(s);
第二种方法:i=Integer.valueOf(s).intValue();
这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?

以下是答案:

第一种方法:s=i+""; //会产生两个String对象
第二种方法:s=String.valueOf(i); //直接使用String类的静态方法,只产生一个对象

第一种方法:i=Integer.parseInt(s);//直接使用静态方法,不会产生多余的对象,但会抛出异常
第二种方法:i=Integer.valueOf(s).intValue();//Integer.valueOf(s) 相当于 new Integer(Integer.parseInt(s)),也会抛

异常,但会多产生一个对象


1.问题思考:

需要明确的是String是引用类型,int是基本类型,所以两者的转换并不是基本类型间的转换,这也是该问题提出的意义所在,SUN公司提供了相应的类库供编程人员直接使用。

2.Integer.parseInt(str) 与 Integer.valueOf(Str).intValue() :

其实查看Java源码不难发现后者的实现是基于parseInt函数来实现的,所以很有必要分析parseInt源码。

3.Integer.parseInt(str) 源码分析:

[java]  view plain  copy
  1. public static int parseInt(String s, int radix)  
  2.                throws NumberFormatException  
  3.    {  
  4.        /* 
  5.         * WARNING: This method may be invoked early during VM initialization 
  6.         * before IntegerCache is initialized. Care must be taken to not use 
  7.         * the valueOf method. 
  8.         */  
  9.   
  10.        if (s == null) {  
  11.            throw new NumberFormatException("null");  
  12.        }  
  13.   
  14.        if (radix < Character.MIN_RADIX) {  
  15.            throw new NumberFormatException("radix " + radix +  
  16.                                            " less than Character.MIN_RADIX");  
  17.        }  
  18.   
  19.        if (radix > Character.MAX_RADIX) {  
  20.            throw new NumberFormatException("radix " + radix +  
  21.                                            " greater than Character.MAX_RADIX");  
  22.        }  
  23.   
  24.        int result = 0;  
  25.        boolean negative = false;  
  26.        int i = 0, len = s.length();  
  27.        int limit = -Integer.MAX_VALUE;  
  28.        int multmin;  
  29.        int digit;  
  30.   
  31.        if (len > 0) {  
  32.            char firstChar = s.charAt(0);  
  33.            if (firstChar < '0') { // Possible leading "+" or "-"  
  34.                if (firstChar == '-') {  
  35.                    negative = true;  
  36.                    limit = Integer.MIN_VALUE;  
  37.                } else if (firstChar != '+')  
  38.                    throw NumberFormatException.forInputString(s);  
  39.   
  40.                if (len == 1// Cannot have lone "+" or "-"  
  41.                    throw NumberFormatException.forInputString(s);  
  42.                i++;  
  43.            }  
  44.            multmin = limit / radix;  
  45.            while (i < len) {  
  46.                // Accumulating negatively avoids surprises near MAX_VALUE  
  47.                <span style="color:#ff0000;">digit = Character.digit(s.charAt(i++),radix);</span>  
  48.                if (digit < 0) {  
  49.                    throw NumberFormatException.forInputString(s);  
  50.                }  
  51.                if (result < multmin) {  
  52.                    throw NumberFormatException.forInputString(s);  
  53.                }  
  54.                result *= radix;  
  55.                if (result < limit + digit) {  
  56.                    throw NumberFormatException.forInputString(s);  
  57.                }  
  58.                result -= digit;  
  59.            }  
  60.        } else {  
  61.            throw NumberFormatException.forInputString(s);  
  62.        }  
  63.        return negative ? result : -result;  
  64.    }  

加红源码如下:

[java]  view plain  copy
  1. public static int digit(char ch, int radix) {  
  2.         return digit((int)ch, radix);  
  3.     }  
[html]  view plain  copy
  1. /* @param   codePoint the character (Unicode code point) to be converted.  
  2.  * @param   radix   the radix.  
  3.  * @return  the numeric value represented by the character in the  
  4.  *          specified radix.  
  5.  * @see     Character#forDigit(int, int)  
  6.  * @see     Character#isDigit(int)  
  7.  * @since   1.5  
  8.  */  
  9. public static int digit(int codePoint, int radix) {  
  10.     return CharacterData.of(codePoint).digit(codePoint, radix);  
  11. }  

可以看出加红代码是将字符 => Unicode(字符统一编码) =>  Unicode(数字统一编码) => 数字。

从上面的分析可以发现源码是取出字符串中的每个字符,然后将字符转换为数字进行拼接,但是在拼接的过程中SUN公司的编程人员是将其先拼接为负数,再用三元运算转换选择输出。自己并不认同,因为这样的做法是不利于理解,当然作者可能有自己的考虑,值得揣摩。

4.自己动手,丰衣足食:

  思路:

化整为零 ->  将引用类型的String分解为char;

逐个击破 ->  进本数据类型之间的转换Character.digit(ch,radix) / Character.getNumericValue(ch) 原理相同;

    由点及线-> 将数字放到不同权值得相应位置上,组成int型数值。

 注:

    正负号判断,数值长度判断,数字合法性校验(0-9)...

 CODEING:

[java]  view plain  copy
  1. public static int change(String s){  
  2.         int result = 0;<span style="white-space:pre;">          </span>    //数值  
  3.         int len = s.length();<span style="white-space:pre;">        </span>  
  4.         int indexEnd = len - 1;             //控制由右及左取字符(数字)  
  5.         int indexBegin = 0;<span style="white-space:pre;">      </span>    //起始位置(存在+ - 号)  
  6.         boolean negative = false;<span style="white-space:pre;">    </span>    //确定起始位置及输出结果标志符  
  7.         int position = 1;                   //权值:起始位置为个位  
  8.         int digit = 0;<span style="white-space:pre;">           </span>    //数字  
  9.           
  10.     if(len > 0){  
  11.         char firstChar = s.charAt(0);  
  12.             if (firstChar < '0') {   
  13.                 if (firstChar == '-') {  
  14.                     negative = true;  
  15.                     indexBegin = 1;  
  16.                 }else if(firstChar == '+'){  
  17.                     indexBegin = 1;  
  18.                 }else if (firstChar != '+'){  
  19.                     throw new NumberFormatException(s);  
  20.                 }   
  21.                 if (len == 1throw new NumberFormatException(s);  
  22.             }  
  23.               
  24.             while (indexEnd >= indexBegin) {  
  25.                 //(int) s.charAt(indexEnd--);只是该字符的数字编码,十进制数字的Unicode码范围为48-57  
  26.                 if(s.charAt(indexEnd) < 48 || s.charAt(indexEnd)> 57){  
  27.                     throw new NumberFormatException(s);  
  28.                 }  
  29.                 //int temp = Character.getNumericValue(s.charAt(indexEnd--));  
  30.                 int temp = Character.digit(s.charAt(indexEnd--), 10);  
  31.                 digit = temp * position;  
  32.                 result += digit;  
  33.                 position *= 10;  
  34.             }  
  35.         }  
  36.         return negative ? -result : result;  
  37.     }  


5.学无止境,Java升级版:

[java]  view plain  copy
  1. public static int myAtoi(String str) {  
  2.         int index = 0, sign = 1, total = 0;  
  3.         //1. Empty string  
  4.         if(str.length() == 0return 0;  
  5.   
  6.         //2. Remove Spaces  
  7.         while(str.charAt(index) == ' ' && index < str.length()) // str = str.trim();  
  8.             index ++;  
  9.   
  10.         //3. Handle signs  
  11.         if(str.charAt(index) == '+' || str.charAt(index) == '-'){  
  12.             sign = str.charAt(index) == '+' ? 1 : -1;  
  13.             index ++;  
  14.         }  
  15.           
  16.         //4. Convert number and avoid overflow  
  17.         while(index < str.length()){  
  18.             int digit = str.charAt(index) - '0';  
  19.             if(digit < 0 || digit > 9break;  
  20.   
  21.             //check if total will be overflow after 10 times and add digit  
  22.             if(Integer.MAX_VALUE/10 < total || Integer.MAX_VALUE/10 == total && Integer.MAX_VALUE %10 < digit)  
  23.                 return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;  
  24.   
  25.             total = 10 * total + digit;  
  26.             index ++;  
  27.         }  
  28.         return total * sign;  
  29.     }  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rui_xiao/article/details/79711950

智能推荐

基于内核4.19版本的XFRM框架_linux的xfrm框架-程序员宅基地

文章浏览阅读794次,点赞2次,收藏5次。XFRM框架_linux的xfrm框架

织梦常用标签整理_织梦中什么页面用什么标签教学-程序员宅基地

文章浏览阅读774次。DedeCMS常用标签讲解笔记整理 今天我们主要将模板相关内容,在前面的几节课中已经基本介绍过模板标签的相关内容,大家可以下载天工开物老师的讲课记录:http://bbs.dedecms.com/132951.html,这次课程我们主要讲解模板具体的标签使用,并且结合一些实例来介绍这些标签。 先前课程介绍了,网站的模板就如同一件衣服,衣服的好坏直接决定了网站的好坏,很多网站一看界面_织梦中什么页面用什么标签教学

工作中如何编译开源工具(gdb)_gdb编译-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏15次。编译是大部分工程师的烦恼,大家普遍喜欢去写业务代码。但我觉得基本的编译流程,我们还是需要掌握的,希望遇到相关问题,不要退缩,尝试去解决。天下文章一大抄,百度能解决我们90%的问题。_gdb编译

python简易爬虫v1.0-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏6次。python简易爬虫v1.0作者:William Ma (the_CoderWM)进阶python的首秀,大部分童鞋肯定是做个简单的爬虫吧,众所周知,爬虫需要各种各样的第三方库,例如scrapy, bs4, requests, urllib3等等。此处,我们先从最简单的爬虫开始。首先,我们需要安装两个第三方库:requests和bs4。在cmd中输入以下代码:pip install requestspip install bs4等安装成功后,就可以进入pycharm来写爬虫了。爬

安装flask后vim出现:error detected while processing /home/zww/.vim/ftplugin/python/pyflakes.vim:line 28_freetorn.vim-程序员宅基地

文章浏览阅读2.6k次。解决方法:解决方法可以去github重新下载一个pyflakes.vim。执行如下命令git clone --recursive git://github.com/kevinw/pyflakes-vim.git然后进入git克降目录,./pyflakes-vim/ftplugin,通过如下命令将python目录下的所有文件复制到~/.vim/ftplugin目录下即可。cp -R ...._freetorn.vim

HIT CSAPP大作业:程序人生—Hello‘s P2P-程序员宅基地

文章浏览阅读210次,点赞7次,收藏3次。本文简述了hello.c源程序的预处理、编译、汇编、链接和运行的主要过程,以及hello程序的进程管理、存储管理与I/O管理,通过hello.c这一程序周期的描述,对程序的编译、加载、运行有了初步的了解。_hit csapp

随便推点

挑战安卓和iOS!刚刚,华为官宣鸿蒙手机版,P40搭载演示曝光!高管现场表态:我们准备好了...-程序员宅基地

文章浏览阅读472次。点击上方 "程序员小乐"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!关注订阅号「程序员小乐」,收看更多精彩内容每日英文Sometimes you play a..._挑战安卓和ios!华为官宣鸿蒙手机版,p40搭载演示曝光!高管表态:我们准备好了

精选了20个Python实战项目(附源码),拿走就用!-程序员宅基地

文章浏览阅读3.8w次,点赞107次,收藏993次。点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤昔闻洞庭水,今上岳阳楼。大家好,我是小F。Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。那么要想学会并掌握Python,可以实战的练习项目是必不可少的。接下来,我将给大家介绍20个非常实用的Python项目,帮助大家更好的..._python项目

android在线图标生成工具,图标在线生成工具Android Asset Studio的使用-程序员宅基地

文章浏览阅读1.3k次。在网站的导航资源里看到了一个非常好用的东西:Android Asset Studio,可以在线生成各种图标。之前一直在用一个叫做Android Icon Creator的插件,可以直接在Android Studio的插件里搜索,这个工具的优点是可以生成适应各种分辨率的一套图标,有好几种风格的图标资源,遗憾的是虽然有很多套图标风格,毕竟是有限的。Android Asset Studio可以自己选择其..._在线 android 图标

android 无限轮播的广告位_轮播广告位-程序员宅基地

文章浏览阅读514次。无限轮播广告位没有录屏,将就将就着看,效果就是这样主要代码KsBanner.java/** * 广告位 * * Created by on 2016/12/20. */public class KsBanner extends FrameLayout implements ViewPager.OnPageChangeListener { private List

echart省会流向图(物流运输、地图)_java+echart地图+物流跟踪-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏6次。继续上次的echart博客,由于省会流向图是从echart画廊中直接取来的。所以直接上代码<!DOCTYPE html><html><head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /&_java+echart地图+物流跟踪

Ceph源码解析:读写流程_ceph 发送数据到其他副本的源码-程序员宅基地

文章浏览阅读1.4k次。一、OSD模块简介1.1 消息封装:在OSD上发送和接收信息。cluster_messenger -与其它OSDs和monitors沟通client_messenger -与客户端沟通1.2 消息调度:Dispatcher类,主要负责消息分类1.3 工作队列:1.3.1 OpWQ: 处理ops(从客户端)和sub ops(从其他的OSD)。运行在op_tp线程池。1...._ceph 发送数据到其他副本的源码