整形转换为字符串,写了五种算法,并进行了性能分析:

1. 算法: 直接先求得长度,然后从左向右求得各位的大小

 private static class Int2String1 implements Int2String {public String int2String(int intValue) {if (intValue == 0) {return "0";}int length = 0;boolean sign = false;if (intValue < 0) {intValue = -intValue;sign = true;length++;}int k = 1;while (true) {if (intValue >= k) {length++;k = k * 10;} else {break;}}char[] holder = new char[length];int start = 0;if (sign) {holder[0] = '-';start = 1;}for (; start < length; ++start) {int count = (length - start - 1);int pow10 = 1;for (int i = 0; i < count; i++) {pow10 = pow10 * 10;}holder[start] = (char) ((intValue / Math.pow(10, count)) + '0');intValue = intValue % pow10;}return new String(holder);}}

打印时间:

1the time is 12122, strValue = -100121312

2. 算法: 直接从右向左, 或者说低位到高位进行逐个插入。最后插入符号位

  private static class Int2String2 implements Int2String {public String int2String(int intValue) {char[] str = new char[0];boolean sign = false;if (intValue == 0) {return "0";}if (intValue < 0) {sign = true;intValue = -intValue;}while (true) {int leftValue = intValue % 10;char additionalChar = (char) (leftValue + '0');char[] old = str;str = new char[str.length + 1];str[0] = additionalChar;for (int i = 1; i < str.length; ++i) {str[i] = old[i - 1];}intValue = intValue / 10;if (intValue == 0) {break;}}if (sign) {char[] old = str;str = new char[str.length + 1];str[0] = '-';for (int i = 1; i < str.length; ++i) {str[i] = old[i - 1];}}return new String(str);}}

打印时间:

1the time is 3426, strValue = -100121312

3.算法:先斤算长度,计算长度时与10的倍数比较。再从右向左进行运算各位的值。

   private static class Int2String3 implements Int2String {public String int2String(int intValue) {if (intValue == 0) {return "0";}int length = 0;boolean sign = false;if (intValue < 0) {intValue = -intValue;sign = true;length++;}int k = 1;while (true) {if (intValue >= k) {length++;k = k * 10;} else {break;}}char[] holder = new char[length];int start = 0;if (sign) {holder[0] = '-';start = 1;}for (int i = length - 1; i >= start; --i) {holder[i] = (char) ((intValue % 10) + '0');intValue = intValue / 10;}return new String(holder);}}

打印时间:

1the time is 834, strValue = -100121312

4. 先斤算长度,再从右向左进行运算各位的值。计算长度采用除法求模。

 private static class Int2String4 implements Int2String {public String int2String(int intValue) {int length = 0;boolean sign = false;if (intValue < 0) {sign = true;intValue = -intValue;}int k = intValue;while (k >= 0) {length++;k = k / 10;if (k == 0) {break;}}char[] charArray;if (sign) {length = length + 1;charArray = new char[length];charArray[0] = '-';} else {charArray = new char[length];}int m = intValue;int index = length - 1;while (true) {int leftValue = m % 10;charArray[index] = (char) (leftValue + '0');index--;m = m / 10;if (m == 0) {break;}}return new String(charArray);}}

打印时间:

1the time is 1102, strValue = -100121312

5. 不再计算长度,而是采用一个buffer。最后构造字符串直接使用此buffer构造。由于10进制的位数一定是小于8进制的位数。32位int转换到8进制就是11位,推断10进制的最大位数也是11位。

    private static class Int2String5 implements Int2String {public String int2String(int intValue) {int position = 10;char[] buf = new char[11];if (intValue < 0) {intValue = -intValue;buf[0] = '-';}while (true) {int leftValue = intValue % 10;buf[position] = (char) (leftValue + '0');intValue = intValue / 10;if (intValue == 0) {break;} else {position--;}}return new String(buf, position, buf.length - position);}}

打印时间:

1the time is 742, strValue = 100121312

6. 采用系统自带的算法

 private static class Int2String6 implements Int2String {public String int2String(int intValue) {return String.valueOf(intValue);}}

打印时间:

1the time is 764, strValue = -100121312

由此可见java SDK 提供的算法并不是最优算法。采用buffer避免计算长度的算法速度更快。可以在系统内存要求不高的时候直接提供一个公用的11位的buffer去做转换可能比java系统自带的算法更快。

于是得到了以下算法

   public static char[] buf = new char[11];private static class Int2String7 implements Int2String {public String int2String(int intValue) {int position = 10;if (intValue < 0) {intValue = -intValue;buf[0] = '-';}while (true) {int leftValue = intValue % 10;buf[position] = (char) (leftValue + '0');intValue = intValue / 10;if (intValue == 0) {break;} else {position--;}}return new String(buf, position, buf.length - position);}}

打印:

1the time is 636, strValue = 100121312

可是此算法有个很大的问题,就是在多线程环境下的同步问题,于是解决同步问题,于是有了算法7.

7. 在6的基础上解决同步问题:

    public static char[] buf = new char[11];private static class Int2String7 implements Int2String {public synchronized String int2String(int intValue) {int position = 10;if (intValue < 0) {intValue = -intValue;buf[0] = '-';}while (true) {int leftValue = intValue % 10;buf[position] = (char) (leftValue + '0');intValue = (intValue >>1)/5;if (intValue == 0) {break;} else {position--;}}return new String(buf, position, buf.length - position);}}

打印:

 

1the time is 616, strValue = 100121312

 

总结 :

整形转字符串,减少循环次数可以很明显提升运算速度。乘法运算比除法运算效率更高。尽量使用乘法代替除法。

如果您看了有收获,那么下载一个APl软件支持一下博主吧!还可以解决您的密码太多记不住的烦恼哦。

源码下载链接:

http://a.app.qq.com/o/simple.jsp?pkgname=com.wa505.kf.epassword

Android面试题目之二:整形转换为字符串相关推荐

  1. [置顶] Android面试题目之二:整形转换为字符串

    整形转换为字符串,写了五种算法,并进行了性能分析: 1. 算法: 直接先求得长度,然后从左向右求得各位的大小 private static class Int2String1 implements I ...

  2. 个人总结Android面试题目之二

    1.Andriod中onTouchEvent(),onInterceptTouchEvent(),onDispatchEvent()区别 onDispatchEvent:分发事件 onTouchEve ...

  3. 应该是史上最全最新Java和Android面试题目(自己总结和收集的)

    Android面试题目 Java 基础 int占用几个字节 讲一下常见编码方式? UTF-8编码下中文占几个字节 int和Interger的区别 int.char.long各占多少字节数 string ...

  4. C++ 整形转换为字符串的方式总结

    目录 整形转换为字符串 itoa sprintf stringstream 整形转换为字符串 itoa char* itoa (int value, char * str, int base) val ...

  5. 某通信公司的Android面试题目

    某通信公司的Android面试题目 今天的面试感觉做的不是很好,有些知识点明显没有掌握好,现在抽空把面试题目抄下来,同时努力掌握好对应的知识点. stack和heap有什么区别? heap是堆,sta ...

  6. 一个BAT大厂面试者整理的Android面试题目!

    身边好多朋友都裸辞了,出去旅游了一圈之后,回来才发现,工作并没有想象中那么好找.朋友小A一心只想进大厂面试Android,于是面试了阿里巴巴.美团.滴滴等,最后在某个大厂经历了5轮面试后拿到了offe ...

  7. Android面试题目(1-2-3--7)

    网上收集的Android 题目一 1.Activity生命周期说下,出现异常主要在那个阶段处理? 2.数据存储有哪几种方式?说过你用过哪些,做了哪些相关的项目?Sqlite用过说下? 3.Adapte ...

  8. android面试题目

    最近才开的博客,希望大家多多关注,andorid开发也做了3年有余了,也面试多家企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助.学完& ...

  9. Android面试题目及其答案

    第一篇 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalv ...

最新文章

  1. PHP获取IP的多种方式解析
  2. eclipse 64位 免安装_Python-3.6.6(32/64)位 软件安装教程
  3. Android 置Activity全屏和无标题
  4. Pandas高级教程之:GroupBy用法
  5. python opencv创建图像_OpenCV-Python 展示图像(1)
  6. 开课吧学python靠谱吗-开课吧9.9元学Python课程适合哪些人?开课吧靠谱吗?
  7. shell脚本 把一个文件的内容全部转换为大写
  8. java更改用户邮箱_git 修改提交邮箱以及用户名-亲测
  9. md5算出来不一样_西安美发培训学校:为什么我看到的色卡上的颜色和染出来的颜色会不一样呢?...
  10. 华为盒子 鸿蒙,华为盒子真不值得买,网友总结了3个原因
  11. iphonex屏幕尺寸html,三分钟弄懂iPhone X 设计尺寸和适配
  12. css3 dyoe_【跑马灯】纯css3跑马灯demo
  13. Java开发一年经验北京薪资,全网首发!
  14. java说的tps pv是什么_你知道服务器PV、TPS、QPS是怎么计算出来的吗?
  15. flex+java项目创建_创建Flex 4和Java Web应用程序
  16. 汽车智能化的商业化路径、产业演进及投资机会探讨——附下载链接
  17. Linux 性能优化全景指南
  18. typecho小程序双鱼2.5版本更新说明
  19. 全国首个数字产权区块链平台上线,共享购模式悄然上市
  20. 输入一个字符串,字符串长度大于6,让黄灯长亮,否则一直闪烁

热门文章

  1. idea启动springboot卡_写给新手看的 Spring Boot 入门学习指南
  2. python ggplot画等值线图,是否可以在Python ggplot上绘制多折线图?
  3. 速算C语言程序设计,C语言程序设计课程设计-速算24.doc
  4. bat 命令返回结果_bat教程[284] unzip解压
  5. c语言求阶乘和的流程图_C/C++编程笔记:C语言 rand() 随机函数,深入解析程序随机数!...
  6. bootstraptable设置行高度_条码打印软件中不干胶卷纸的标签设置方法
  7. linux脚本读取mssql数据库,WebShell通过SQL语句管理MSSQL
  8. c++读取utf8文件_【Python】File文件对象
  9. vue绑定数据之前 会看到源代码
  10. 完美世界推穿戴式设备:能消灭“宅玩家”吗?