博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Integer转String
阅读量:5926 次
发布时间:2019-06-19

本文共 4612 字,大约阅读时间需要 15 分钟。

hot3.png

    Integer转String的场景我们在工作中会遇到很多,我们今天来分析下有哪些方法,这些方法分别是怎么实现的,有什么区别。

    我们首先会想到的是类型强转,格式如:(String)Integer。

    

    我们发现idea中编写不通过,报错:cannot cast 'java.lang.Integer' to 'java.lang.String'。

    第二种方式调用Object.toString()方法。toString()方法是超类Object提供的方法,Integer肯定也含有该方法, 不过Integer对这个方法进行了重写。我们先来运行Integer.toString()方法,然后再来具体分析该方法。

public static void main(String[] args){        Integer var = new Integer(10);        String str = var.toString();        System.out.println(str);}

    执行结果为10,没问题。我们先来看下Object.toString()方法。

public String toString() {      return getClass().getName() + "@" + Integer.toHexString(hashCode());}public native int hashCode();

    Integer重写了Object.toString()方法。

private final int value;@Native public static final int   MIN_VALUE = 0x80000000;@Native public static final int   MAX_VALUE = 0x7fffffff;public String toString() {        //通过Integer类的成员变量value去获取String值        return toString(value);}public static String toString(int i) {        if (i == Integer.MIN_VALUE)            return "-2147483648";        //如果i是正整数,返回这个数是几位数,如果是负数,取负数的绝对值位数加一,比如是-23,size为3        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);        //根据Integer的位数,创建一个该位数大小的char数组        char[] buf = new char[size];        //获取Integer值对应的char数组        getChars(i, size, buf);        //通过new String()构造方法将char数组转换为String        return new String(buf, true);}//x小于等于9,返回1//x小于等于99,返回2//按此规律返回x是几位数//如果x是负数,返回1static int stringSize(int x) {        for (int i=0; ; i++)            if (x <= sizeTable[i])                return i+1;}final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,                                      99999999, 999999999, Integer.MAX_VALUE };//通过参照码表digits,将Integer i的每一位都放到char数组中static void getChars(int i, int index, char[] buf) {        int q, r;        int charPos = index;        char sign = 0;        //如果i小于0,字符前面加负号,i取绝对值        if (i < 0) {            sign = '-';            i = -i;        }        // Generate two digits per iteration        while (i >= 65536) {            q = i / 100;        // really: r = i - (q * 100);            r = i - ((q << 6) + (q << 5) + (q << 2));            i = q;            buf [--charPos] = DigitOnes[r];            buf [--charPos] = DigitTens[r];        }        // Fall thru to fast mode for smaller numbers        // assert(i <= 65536, i);        for (;;) {            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[] 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'    };

    通过研究Integer的源码我们发现Integer转String的主要思路是先获得Integer的位数,如果是负数,就是这个数的绝对值的位数加一(负号占一位),然后根据位数创建一个char数组,将Integer的每一位都放到char数组中,最后通过String的new String(Char[] char,boolean share)构造方法创建字符串。

    第三种方式是String类提供的静态方法String.valueOf(Integer i )

Integer var = new Integer(10);String str = String.valueOf(var);

    看下String类中String.valueOf(Integer i )的底层源代码。

public static String valueOf(Object obj) {        return (obj == null) ? "null" : obj.toString();}

    我们看到底层还是调用的Integer.toString()方法。这里有一点我们需要注意的是String类的valueOf()方法,如果传入值是null,返回值是“null”,而不是null。

    第四种方式Integer+""方式,就是在Integer的变量值后面加上一个空字符串。

Integer var = new Integer(10);String str = var+"";System.out.println(str);

    这个代码得去看字节码文件分析。我们可以使用javap命令或者idea提供的jclasspath插件查看。文件内容如下所示:

0 new #2 
3 dup 4 bipush 10 6 invokespecial #3
> 9 astore_110 new #4
13 dup14 invokespecial #5
>17 aload_118 invokevirtual #6
21 ldc #723 invokevirtual #8
26 invokevirtual #9
29 astore_230 getstatic #10
33 aload_234 invokevirtual #11
37 return

    我们发现字节码文件中是创建StringBuilder,通过StringBuilder.append()方法将Integer类型的var和空字符串""连接起来的,相当于下面的java流程:

Integer var = new Integer(10);StringBuilder builder = new StringBuilder();builder.append(var);builder.append("");String str = builder.toString();System.out.println(str);

    再看下builder.append(var)的底层代码:

@Overridepublic StringBuilder append(Object obj) {    return append(String.valueOf(obj));}

    StringBuilder的append(Object obj)方法里是先通过String.valueOf()方法将obj转换为String类型,然后再调用append方法。而String.valueOf()方法最终还是调用的Integer类的toString()方法。

    结合三种方式我们发现最终都是落到了Integer类的toString()方法上来了,那么我们在实际写代码中遇到Integer转String类型的时候不妨就直接调用Integer的toString()方法了。

转载于:https://my.oschina.net/u/3765527/blog/1836184

你可能感兴趣的文章
robots.txt写作语法
查看>>
CentOS 7安装Supervisor设置开机启动
查看>>
spring 配置常见错误
查看>>
计算机图形学当中的光照模型
查看>>
VC 2008 Express下安装OpenCV2.3.1
查看>>
IT面试之全排列
查看>>
js-className
查看>>
Solr5安装配置
查看>>
linux下的i2c与时钟芯片pcf8563通信
查看>>
Spring——jar包详解
查看>>
关于setInterval与setTimeout作用域问题
查看>>
【转】NodeJS之process进程
查看>>
5、外观模式
查看>>
那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)
查看>>
详解Android中那些酷炫返回方式的实现
查看>>
微信开发遇到的坑
查看>>
阅读源码的心得
查看>>
Bacula Fileset资源翻译文档
查看>>
回归的线性模型---偏置-方差分解
查看>>
概率与信息论---边缘概率
查看>>