将一个整形数转换成字符串形式
2013-09-05 21:57
225 查看
假如给你一个题目,将一个整型数转换成它的字符串形式,你会怎么做,你会这样做,new Integer(432).toString(),或者Integer.toString(432),再或者Integer.toString(432,10)这几个方法都能办到,但是他们是怎么实现的呢,假如让你去实现你怎么做呢,我们通常的做法是:
converIntToString()方法可以将任意的整形数转换成它的字符串形势,但是java库函数中是怎么实现的呢?在Integer类中的有个方法toString(int i)将整型转换成字符串表示,这个实现方法对渗透了对性能的考虑,对实际情况的考虑,让我们学习一下java源码。
通过阅读java源码,我们能从中学到这样几点:
1.尽可能的用移位操作代替乘除法
2.有时候查表操作比直接运算性能要好
3.考虑问题要全面,不要写一些教学用的代码片段,要充分考虑问题的情况,
比如这里面就充分考虑了,整型数如果大于65536怎么操作,小于65536又怎么操作,
public static String convertIntToString(int i){ int j = 0; //用来表示表示i中每一位上的数字 int size = 0; //用来表示i的位数 size = (i < 0) ? sizeOfInt(-i) + 1:sizeOfInt(i); char[] buf = new char[size]; if(i < 0){ i = -i; buf[0] = '-'; } while(i != 0){ j = i % 10; i = i / 10; buf[--size] = Digit[j]; } return new String(buf); } public static int sizeOfInt(int x){ int i = 0; while(x != 0){ x /= 10; i++; } return i; } public static char[] Digit = { '0','1','2','3','4','5','6','7','8','9' };
converIntToString()方法可以将任意的整形数转换成它的字符串形势,但是java库函数中是怎么实现的呢?在Integer类中的有个方法toString(int i)将整型转换成字符串表示,这个实现方法对渗透了对性能的考虑,对实际情况的考虑,让我们学习一下java源码。
/** *将i转换成其字符串形式 */ public static String toString(int i) { ////如果i是int的最小值,直接返回一个常数,不用进行计算, //不知道为什么没有对int的最大值进行优化,可能会在其他地方已经优化了, if (i == Integer.MIN_VALUE) return "-2147483648"; int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); //利用size方法计算i的位数 char[] buf = new char[size]; getChars(i, size, buf); //这一步才将i的值转换成字符数组,使用了getChars方法,这个方法也很与众不同啊 return new String(buf, true); } final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE }; // 这种计算整型的位数很奇葩吧,没有经过区域运算,直接查表比较,肯定节省了不少时间吧 static int stringSize(int x) { for (int i=0; ; i++) if (x <= sizeTable[i]) return i+1; } /** * Places characters representing the integer i into the * character array buf. The characters are placed into * the buffer backwards starting with the least significant * digit at the specified index (exclusive), and working * backwards from there. * * Will fail if i == Integer.MIN_VALUE */ static void getChars(int i, int index, char[] buf) { int q, r; int charPos = index; char sign = 0; if (i < 0) { sign = '-'; i = -i; } // 如果i的值大于65536就执行这个循环,一次能产生两个字符哦 while (i >= 65536) { q = i / 100; // really: r = i - (q * 100); //用移位操作比直接的乘法操作要快,以后咱们自己写程序,能不能从运用大师们的这一招呢? r = i - ((q << 6) + (q << 5) + (q << 2)); i = q; //这两个数组设计的比较精巧, //DigitOne中根据数组下表能取出各位数的字符表示, //DigitTens取出十位上数的字符表示 buf [--charPos] = DigitOnes[r]; buf [--charPos] = DigitTens[r]; } // Fall thru to fast mode for smaller numbers // assert(i <= 65536, i); for (;;) { //这一步牛b吧完成的是i/10操作,>>>这个操作符的意思是向右移位之后用0填充最高位。 //但是这一步还是没有看懂到底是怎样移位的,求高手赐教 q = (i * 52429) >>> (16+3); r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ... buf [--charPos] = digits [r]; i = q; if (i == 0) break; } if (sign != 0) { buf [--charPos] = sign; } } final static char [] DigitTens = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9', } ; final static char [] DigitOnes = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', } ; final static char[] digits = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' };
通过阅读java源码,我们能从中学到这样几点:
1.尽可能的用移位操作代替乘除法
2.有时候查表操作比直接运算性能要好
3.考虑问题要全面,不要写一些教学用的代码片段,要充分考虑问题的情况,
比如这里面就充分考虑了,整型数如果大于65536怎么操作,小于65536又怎么操作,
相关文章推荐
- 将一个整数(数字或长字符串形式)转换成中文输出
- 不用系统函数,实现输入一个整形数,输出其转换后的字符串,如输入整形1234,则转换后输出字符串“1234”,-1234转换为“-1234”。
- 【原创工具】将一个整形数字转换成三位逗号分隔的形式
- 8、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数, 然后打印出这个十进制整数对应的二进制形式。
- 请写一个将整形转换成字符串的函数,函数接口自己定义,如 123 转变成“123”。
- 一个字符为0~9的字符串转换成整型数组中数值的对应的形式
- 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数) 例如:“12.34“ 返回12.34 “-123.34“ 返回-123.34 函数原型:double my_
- 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
- mysql 中字符串转换成整形
- 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
- 18. 微软面试题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 在java中,怎样把一个double数转换为字符串时,不用科学计数法表示。
- Python 字符串转换为整形和浮点类型的方法
- Winform中通过一个字符串定位到和字符串相等ID的控件(将字符串转换成相应的控件名称
- 练习 4-12 运用 printd 函数的设计思想编写一个递归版本的 itoa 函数,即通过递归 调用把整数转换为字符串
- 把一个XML字符串转换为一个XML文档对象
- 编写一个函数,将一个数字字符串转换成该字符串对应的数字(包括正整数、负整数)
- 将整形数字(int)转换成字符串
- 怎样将一个整型值转换为一个字符串?(C++方法)
- 如何判断一个字符串是小数点后两位的形式