标签:sys format -128 serial rac 分享 eval turn eva
java中的数字类型包括 Byte,Short,Integer,Long,Float,Double.其中前四个是整数,后两个是浮点数。 在说java中数字类型之前先来看看它们统一的基类Number。
package java.lang; public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); public abstract float floatValue(); public abstract double doubleValue(); public byte byteValue() { return (byte)intValue(); } public short shortValue() { return (short)intValue(); } private static final long serialVersionUID = -8742448824652078965L; }
代码并不复杂,从代码可以看出数字类型的封装类可以转化为任意数字类型,也就是说数字类型是可以相互转化的。
首先概括的说一下这六个类型都是数字类型,都包含了这四个静态字段,分别是
Size代表数据二进制位的长度,MAX_VALUE最大值,MIN_VALUE最小值,和TYPE对应的基元类型的Class
需要特别说明的是 TYPE虽然也是Class<Long>,但是它和 Long.class的Class不是同一个对象。因为java的泛型是伪泛型,<>中的类型,只是代表该类型的对象可以强转为<>中的类型。
package demo.nio; public class NumberDemo { public static void main(String[] args) { System.out.println(Long.class.getName());//java.lang.Long System.out.println(Long.TYPE.getName());//long } }
四个整型类型的数据中,Byte的Size是8,也就是一个字节,Short的SIZE是16,也就是两个字节,Integer是32也就是4个字节,Long的SIZE是64也就是8个字节,它们的最大,最小值随长度的大小而变化,长度越大,最大值越大,最小值越小。
package demo.nio; public class NumberDemo { public static void main(String[] args) { System.out.println(Byte.MAX_VALUE);//127 System.out.println(Byte.MIN_VALUE);//-128 System.out.println(Short.MAX_VALUE);//32767 System.out.println(Short.MIN_VALUE);//-32768 System.out.println(Integer.MAX_VALUE);//2147483647 System.out.println(Integer.MIN_VALUE);//-2147483648 System.out.println(Long.MAX_VALUE);//9223372036854775807 System.out.println(Long.MIN_VALUE);//-9223372036854775808 } }
先说Byte类型,Byte就是一个字节,代表8个二进制位。内部有一个value字段,用于存放装箱前的数据。而这个封装类的hashCode就是该value,数字类型都包含这样几个静态函数:
valueOf(XXX v)
valueOf(String s, int radix)
valueOf(String s)
parseXXX(String s)
parseXXX(String s, int radix)
decode(String nm)
其中Byte的parse和decode都是调用Integer的方法实现的。其中parse用于转化普通数字,decode用于转化 0xa之类的数字。
package java.lang; public final class Byte extends Number implements Comparable<Byte> { public static final byte MIN_VALUE = -128; public static final byte MAX_VALUE = 127; public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte"); public static String toString(byte b) { return Integer.toString((int)b, 10); } private static class ByteCache { private ByteCache(){} static final Byte cache[] = new Byte[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Byte((byte)(i - 128)); } } public static Byte valueOf(byte b) { final int offset = 128; return ByteCache.cache[(int)b + offset]; } public static byte parseByte(String s, int radix)throws NumberFormatException { int i = Integer.parseInt(s, radix); if (i < MIN_VALUE || i > MAX_VALUE) throw new NumberFormatException( "Value out of range. Value:\"" + s + "\" Radix:" + radix); return (byte)i; } public static byte parseByte(String s) throws NumberFormatException { return parseByte(s, 10); } public static Byte valueOf(String s, int radix) throws NumberFormatException { return valueOf(parseByte(s, radix)); } public static Byte valueOf(String s) throws NumberFormatException { return valueOf(s, 10); } public static Byte decode(String nm) throws NumberFormatException { int i = Integer.decode(nm); if (i < MIN_VALUE || i > MAX_VALUE) throw new NumberFormatException( "Value " + i + " out of range from input " + nm); return valueOf((byte)i); } private final byte value; public Byte(byte value) { this.value = value; } public Byte(String s) throws NumberFormatException { this.value = parseByte(s, 10); } public byte byteValue() { return value; } public short shortValue() { return (short)value; } public int intValue() { return (int)value; } public long longValue() { return (long)value; } public float floatValue() { return (float)value; } public double doubleValue() { return (double)value; } public String toString() { return Integer.toString((int)value); } public int hashCode() { return (int)value; } public boolean equals(Object obj) { if (obj instanceof Byte) { return value == ((Byte)obj).byteValue(); } return false; } public int compareTo(Byte anotherByte) { return compare(this.value, anotherByte.value); } public static int compare(byte x, byte y) { return x - y; } public static final int SIZE = 8; private static final long serialVersionUID = -7183698231559129828L; }
因为数字类型都实现了Comparable接口,也就是说他是可比较的类型,对于Byte compare的实现就是简单的减去,除此之外还有个ByteCache,存放了-128~127的装箱类型的数组。
valueOf(byte b)返回的就是Cache中的数据。
package demo.nio; public class NumberDemo { public static void main(String[] args) { System.out.println(Byte.valueOf((byte) 10)); System.out.println(Byte.valueOf("10")); System.out.println(Byte.valueOf("10",10)); System.out.println(Byte.parseByte("a",16)); System.out.println(Byte.parseByte("10")); System.out.println(Byte.decode("10")); System.out.println(Byte.decode("0xa"));//10 } }
Short和Byte类型基本相同,valueOf,parseXXX,decode也是调用的Integer实现的,不过这里多了一个,reverseBytes(short i)函数,该函数的功能是将short数据反转,就是后八位变成前8位,前八位变成后八位。
如:0x100,反转之后就是0x1
标签:sys format -128 serial rac 分享 eval turn eva
原文地址:http://www.cnblogs.com/yangyang12138/p/7398678.html