您的位置:首页 > 其它

基本数据类型装箱拆箱,与转换方法,BigDecimal运算,Random随机数

2017-09-19 18:20 543 查看
基本数据类型有八种,在1.4前八种数据类型的包装类,是一个工具类。提供了一些有用的方法,在1.4后经过改动,可以和基本数据混用,使基本数据类型也可以向对象转型,更加贴切万事万物皆对象。

在jdk1.4前,写法Integer a=new Integer(3);1.4后,写法Integer b=3;也就是在1.4前,必须要new对象然后传递值,因为3是一个int类型,Integer是一个类,是不能直接赋值的。

1.4后可以直接赋值是因为,在写Integer b=3;编译时是转换为Integer b=Integer.valueOf(3);valueOf将int转换为Integer,在交给b,所以和之前的写法实质一样,不过使得操作更加简介。这种行为称为装箱,将基本数据类型自动转换包装为数据类型封装类。

Integer a=3;自动装箱,int b=a;3自动装箱为Integer封装类,a即是一个Integer类,b是一个int类型,b怎么能引用Integer类a?在Integer还有一个方法intValue();将a拆解为int类型,

当写上int b=3;编译的代码,int b=a.intValue();将a拆解为基本数据类型在交给b引用,在1.4后,写上int b=a,会自动intValue()方法,所以这种自动调用拆解的方式,称为拆箱,将封装类自动拆解为基本数据类型。

parseInt();将字符串格式化为封装类,toString();将封装类转换为toString():

写法一

String a="1257";

Integer.parseInt(a),即会将字符串a转换为封装类1257,如果没有指定进制默认是10进制转10进制,整数是十进制。

写法一参数二

Integer.parseInt(a,10),后面10是说明a是什么进制,此时格式化得到的结果依然是1257,因为1257本是10进制,在转换为10进制不变,

Integer.parseInt(a,8),默认整数是10进制,指定a为8进制也没问题,1257这个八进制转换为Integer10进制的结果是2351,进制也不能乱指定,1257没有超过8,所以可以指定为8进制,如果指定是二进制,就错了。合理指定。

指定进制转换还有个注意的,不能超过此封装类的最大值,比如Byte.parseByte("1257");这就错了,因为Byte最大的值是127,超过了最大值,报错。

Integer.toString();将Integer封装类转换为字符串,也可以指定进制Integer.toString(567,8);将10进制567转换为8进制,返回字符串。

另外三种将封装类转换为字符串,不过toString做起来更加方便,直接转换为指定进制即可。

Integer.toBinaryString(1000);       toBinaryString将1000转换为二进制字符串,

Integer.toHexString(1000);           toHexString将1000转换为16进制字符串

Integer.toOctalString(1000) ;        toOctalString将1000转换为8进制字符串

获得一些属性

System.out.println(Integer.BYTES);            获得Integer占多少字节,一个字节占八位

System.out.println(Integer.MAX_VALUE);  获得Integer最大值

System.out.println(Integer.MIN_VALUE);    获得Integer最小值

System.out.println(Integer.SIZE);                获得Integer占多少位

知其Integer一,即可知道其他7个封装类型的方法,其余7个封装类型有的方法Integer有,Integer是八个里面方法最多的。

BigDecimal运算,api翻译:不可变的、任意精度的有符号十进制数。

在folat与double进行运算的时候,总是是存在一些问题,极不精确。数目越大越不准确,尾数越多。

                float e = 1.5f;
for (int i = 0; i < 10; i++) {
e =(float) (e+ 0.1);
}
System.out.println(e);

最后的e的结果为2.4999995,double也存在这种问题。,此刻就需要用到BigDecimal对这种小数进行精确的计算。

               BigDecimal d = new BigDecimal("1.5");
for (int i = 0; i < 10; i++) {
d = d.add(new BigDecimal("0.1"));
}
System.out.println(d.toString());

结果为2.5,对精度对小数有较高要求时候,需要采用 BigDecimal进行精确运算,不过 BigDecimal也存在一个一个,速度不是那么快。

为什么要d = d.add(new BigDecimal("0.1"));,调用加法运算为什么d还要覆盖,在之前粘贴api翻译中,说明了BigDecimal是一个不可变的,任意精度的有符号十进制数。他是一个不可变的,不进行覆盖从新引用的话,最后打印d还是1.5。

在BigDecimal

add()加法

subtract()减法

multiply()乘法


divide()除法


BigDecimal除不尽是会报错的,


new BigDecimal(11).divide(new BigDecimal(3));这种除不尽的会报错,可以指定保留小数位,指定四舍五入的形式。


new BigDecimal(11).divide(new BigDecimal(3),5,RoundingMode.HALF_UP);此次11/3指定的是保留5位小数,向上四舍五入。


如果不指定保留几位小数直接就向上进位了,如果不指定四舍五入,碰到无限不循环小数就报错了。如果进位和保留小数都不指定,就不保留小数和进位,直接显示除后的值。存在除不尽报错或是小数保留问题。






Random随机数


Random a = new Random();
byte[] h = new byte[10];
a.nextInt(9);    //指定随机范围,在9里面随机值
a.nextBytes(h);  //在byte范围随机值,直到填充满byte数组,仅对byte有这种方法。

for (byte b : h) {
System.out.print(b + " ");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐