java 数据类型转换


JDK1.7

啊啊啊啊。今天想把int[]转换为String的时候被坑了。一看有个toString().走起。额。“[I@27021e58”转换出来什么鬼。好吧。源码一看。原来是Object类的实现方法。我们都知道Object是所有类的父类或间接父类。本身没有实现肯定会向上调用Object的toString方法。

所以返回值就是这个。好了下面看一下类型转换的几种方式。

用的比较多的就是(Integer或int)与String之间的转换

                //1
		int a=889343;
		String str=String.valueOf(a);
		//2
		String str1=a+"";
		
		//3
		Integer it=234214;
		String str2=it.toString();
		//4
		String str3=it+"";
其实他们都依赖Integer的toString()方法。

public static String valueOf(int i) {
        return Integer.toString(i);
    }

public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(buf, true);
    }

OK。那如何从String转为int。(Integer和int属于java语法糖的内容。在编译期的语义分析和生成字节码阶段将会进行转换也就是自动拆箱与装箱)。

                String str4="234";
		int z=Integer.valueOf(str4);
		int x=Integer.parseInt(str4);

为什么同样的功能要两个函数来实现呢。

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }


可以发现valueOf其实使用parseInt方法的返回值当作参数进行处理的。
另外两个方法的返回值是不同的。基本数据类型是在栈上分配的。
而Integer面向对象的设计需要他在堆上分配内存。小数值创建和死亡又是非常频繁的行为。
频繁的操作将会使对象在堆上分配和GC造成不必要的资源损耗。所以通过享元模式进行优化。
在常量池中保存对象。当常量池存在此对象时不在创建对象直接把引用指向对象就可以

public static Integer valueOf(int i) {         
           assert IntegerCache.high >= 127;       
           if (i >= IntegerCache.low && i <= IntegerCache.high)            
                   return IntegerCache.cache[i + (-IntegerCache.low)];        
           return new Integer(i);     
} 

可以看到保存的对象最大到127.这也就是

                Integer it=127;
		Integer it1=127;
		System.out.println(it==it1);
		
		Integer it3=128;
		Integer it4=128;
		System.out.println(it3==it4);
第一个会成功,第二个失败的原因。额写的可能有点乱。大家见谅吧。
























  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值