整形转换为字符串,写了五种算法,并进行了性能分析:
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
相关推荐
在这里,`String.format()`和`BigInteger`用于将字符串转换为16进制,而`Base64.getDecoder().decode()`则用于将16进制字符串解码回原始的字节数组,再转化为字符串。 在实际应用中,你可能还会遇到其他复杂情况,...
1138:将字符串中的小写字母转换成大写字母 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 54809 通过数: 25241 【题目描述】 给定一个字符串,将其中所有的小写字母转换成大写字母。 【输入】 输入一行,包含一...
2049:【例5.19】字符串判等 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 26376 通过数: 9899 【题目描述】 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。 【输入】 两行,每行...
C语言字符串转换为Python字符串是指将C语言中的字符串数据转换为Python中的字符串对象,以便在Python环境中使用。下面详细介绍了C语言字符串转换为Python字符串的方法。 使用Py_BuildValue()构建字节对象 在Python...
9. **字符串转化数字以及数字转化字符串**:在C/C++中,可以使用`atoi()`将字符串转换为整数,`atof()`转换为浮点数,而`itoa()`和`sprintf()`可以将数字转换为字符串。在其他语言如Python中,有内置的`int()`和`str...
在本篇文章中,我们将深入探讨如何在C#中将整型数组元素转换为字符串,并对提供的代码示例进行详细分析。 ### C#中将整型数组转换为字符串的方法 #### 背景介绍 在软件开发过程中,经常需要将不同类型的变量转换成...
TIA 博途中字符串转换相关指令的使用方法是指在 Siemens SIMATIC TIA Portal 中使用的字符串转换相关指令,包括移动和转换字符串指令、字符串和数值相互进行转换指令等。 1. 移动和转换字符串指令 移动和转换字符...
在处理通信数据时,我们经常需要对字符和字符串进行操作,例如将字符转换为字符串,或者从字符串中截取有效字符。以下将详细介绍在TIA博途中如何实现这些操作。 首先,字符转换为字符串的过程通常涉及到ASCII码。...
本文将详细介绍整形和字符串之间的各种转换,包括整形到字符串、字符串到整形、字符串到字符数组、字符数组到字符串、不同的进制之间的转换等。 整形到字符串的转换 在Java中,我们可以使用String.valueOf()方法将...
1. **字符串解析**:首先,我们需要将用户输入的字符串解析为可以执行的数学表达式。这通常涉及到分隔符(如空格、括号)的识别和操作符优先级的理解。我们可以使用正则表达式来分割字符串,提取数字和操作符。 2. ...
在Qt开发中,有时我们需要将整型数组转换为字符串,以便于显示或处理。这个问题的解决方案通常涉及到使用Qt提供的容器类QVector以及QString的相关转换函数。以下是对标题和描述中涉及知识点的详细说明: 首先,创建...
在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...
要将二进制字符串转化为十六进制字符串,我们需要逐位处理二进制数。每四位二进制数对应一位十六进制数。例如,二进制字符串 "1101 0110" 可以转换为十六进制的 "D6"。在C语言中,可以使用`sscanf`和`sprintf`函数...
"Android存储字符串数据到txt文件" Android存储字符串数据到txt文件是Android开发中的一种常见需求,对于大多数开发者来说,存储字符串数据到txt文件是一种非常有用的功能。今天,我们将详细介绍如何在Android中...
std::cout 转换后的字符串为:" << str << std::endl; ``` Java中,可以使用`Integer.toString()`方法: ```java int num = 123; String str = Integer.toString(num); System.out.println("转换后的字符串为:" + ...
- 处理路径字符串,例如将Windows风格的路径`C:\Users\John`转换为Unix风格的`C:/Users/John`。 - 解析JSON或XML字符串,其中某些字符(如反斜杠)可能是非法的或需要转义的。 - 编码或解码URL,URL中的反斜杠需要...
2. **十六进制转字符串**:相反的过程需要先使用“十六进制到整数”函数将十六进制字符串转换为十进制,再用“整数到字符串”函数将十进制数值转化为字符串。需要注意的是,这里的“整数到字符串”可能会产生一个以...
在这个背景下,“CVI串口字符串16进制转换”涉及的是如何在CVI中处理串口接收到的字符串数据,并将其转化为16进制格式,以便进一步分析或存储。 首先,我们需要理解字符串和16进制之间的关系。字符串是由字符组成的...
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。 输入: 每一行包括两个字符串,长度不超过100。 输出: 可能有多组测试数据,对于每组数据, 不借用任何字符串库函数实现无冗余...