【JAVA源码分析——Java.lang】包装类源码分析
来源:互联网 发布:unity3d 镜面反射 编辑:程序博客网 时间:2024/06/07 14:34
包装类分析
Java 基本类型包括八种:byte、short、int、long、float、double、char、boolean
Number类型
其中数字类型包括:
整数型:
byte : -127~128
short : -32767~32768
int : 0x80000000~0x7fffffff
long : 0x8000000000000000L~0x7fffffffffffffffL
浮点型:
float : 0x0.000002P-126f / 0x1.fffffeP+127f
double : 0x0.0000000000001P-1022 ~ 0x1.fffffffffffffP+1023
java.lang.Number是数字类型对象的抽象类,子类包括Byte、Short、Integer、Long、Float、Double。还有BigDecimal和BigInteger
//定义非抽象方法byteValue 和shortValuepublic byte byteValue() { return (byte)intValue();}public short shortValue() { return (short)intValue();}
Number类定义方法如下
Byte
Byte中主要提供的方法有
- 构造方法
- toString
- decode 解码方法,包括二进制、八进制、十六进制 静态工厂方法
- compare 比较大小 静态工厂方法
- compareTo 比较大小
- valueOf 转换为Byte类型 静态工厂方法
- parseByte 转换为Byte类型
- intValue 类型转换 等类型转换方法
、、、decode、valueOf、parse
属性域
//最小值public static final byte MIN_VALUE = -128;//最大值public static final byte MAX_VALUE = 127;//声明类型//获取JVM本地类型public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");//二进制长度public static final int SIZE = 8;//byte存储 private final byte value;//静态内部类private static class ByteCache { //不提供实例化方法 private ByteCache(){} //缓存byte的所有值 //好处显而易见,使用比较多时节省内存空间 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)); }}
主要方法
//主要调用了Integer的parseInt方法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;}//调用了Integer.decode 八进制、十六进制转换 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);}//转换其他类型,直接进行强制转换,低级变量向高级变量转换public double doubleValue() { return (double)value;}
parseType 与 valueOf方法的区别
//返回值是byte,相当于在栈中划分新的内存空间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 valueOf(String s, int radix) throws NumberFormatException { return valueOf(parseByte(s, radix));}
Short
short属性域与Btye类似的,所差别的主要是值域范围
short的主要方法也类似于btye,调用的是Integer的方法
Integer
Integer静态域类似于Byte的静态域,包括范围和type。
Byte和Short的toString 都是调用Integer进行实现的。
//提供的进制转换支持字符,根据设定,最高支持36进制转换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'};//设置进制的toString public static String toString(int i, int radix) { //判断是否越界 if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) radix = 10; //若为10进制,调用toString(int i) if (radix == 10) { return toString(i); } char buf[] = new char[33]; boolean negative = (i < 0); int charPos = 32; //判断正负 if (!negative) { i = -i; } //辗转相除,存储到buff里 while (i <= -radix) { buf[charPos--] = digits[-(i % radix)]; i = i / radix; } buf[charPos] = digits[-i]; if (negative) { buf[--charPos] = '-'; } //从数组尾部存储,创建String调用String的截取创建 return new String(buf, charPos, (33 - charPos));}//十进制String转换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);}//定义范围数组,确定String长度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;}
看到了Integer的getChars方法,开始没怎么看明白,附知乎大神解释
java源码中Integer.class中有个getChars方法,里面有个52429是怎么确定的?
- 【JAVA源码分析——Java.lang】包装类源码分析
- 【JAVA源码分析——Java.lang】String源码分析
- java.lang.Integer源码分析
- JDK源码分析:java.lang.Boolean
- JDK源码分析:java.lang.String
- JDK源码分析之 java.lang.Boolean
- java.lang.String源码分析(1)
- java.lang.String源码分析(2)
- JDK源码分析:java.lang.Boolean
- JDK源码分析:java.lang.Boolean
- JDK源码分析:java.lang.String
- 【实践】java.lang.Integer源码分析
- 【实践】java.lang.Integer源码分析 -- parseInt
- 【实践】java.lang.Integer源码分析 -- valueOf
- JDK源码分析-java.lang.Boolean
- java.lang之java.lang.Long源码阅读及分析
- java.lang之java.lang.String 源码阅读及分析
- java.lang之java.lang.Object源码阅读及分析
- 二项分布和Beta分布
- mybatis入门
- Poj 3905 Perfect Election【2-SAT-------Tarjan强连通】
- android 显示/隐藏 view
- 不用加减乘除做加法
- 【JAVA源码分析——Java.lang】包装类源码分析
- 3 hbase基础知识
- 了解ZooKeeper
- 左右滚动jquery 插件 swiper
- ahoi2005 lane 航线规划
- 226. Invert Binary Tree 翻转二叉树
- 17. Letter Combinations of a Phone Number
- 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
- 运动目标跟踪(一)--搜索算法预测模型之KF,EKF,UKF