/** * 基本数据类型 包装类型 * ---------------------------------------------- * byte java.lang.Byte (父类是java.lang.Number) * short java.lang.Short (父类是java.lang.Number) * int java.lang.Integer (父类是java.lang.Number) * long java.lang.Long (父类是java.lang.Number) * float java.lang.Float (父类是java.lang.Number) * double java.lang.Double (父类是java.lang.Number) * boolean java.lang.Boolean (父类是java.lang.Object) * char java.lang.Character (父类是java.lang.Object) * * 八种基本数据类型,分别对应一个包装类,下面以Integer来学习,JDK5以后能够进行自动装箱和自动拆箱 * 自动装箱:基本数据类型自动转换为包装类 * 自动拆箱:包装类自动转换为基本数据类型 * * 自动装箱和自动拆箱的好处是:方便编程 */ public class IntegerText { public static void main(String[] args) { Integer x = 123;//123是基本数据类型,x是包装类型 这里发生的是基本数据类型自动转换为包装类型(自动装箱) int y = x;//这里的x是包装类型,y是基本数据类型,发生的是包装类型自动转换为基本数据类型(自动拆箱) Integer z = 456;// 该代码等同于Integer z = new Integer(456); // 注意这里的z是一个引用,也是一个变量,z中保存的是对象的内存地址 System.out.println(z + 1);//457,这里的z先发生了自动拆箱变成了基本数据类型,然后进行了加法运算 Integer a = 128; Integer b = 128; System.out.println(a == b);//false Integer k = 127; Integer m = 127; System.out.println(k == m);//true /* 为什么会出现上面不一样的情况呢?原因在于java为了提高程序运行效率,再Integer类加载时将[-128,127]区间所有256个整数 型包装对象提前创建好,放到了方法区的“整数型常量池”当中,目的是只要用这个区间的包装类型对象不需要再new了,直接就可以从 “整数型常量池”当中取出来。为此无论创建多少个对象它们的引用所指向的内存地址都相同,但是只要超出了这256个的区间就不一样了。 其内存图见下图:Integer方法区整数型常量池。 */ /* 总结一下之前所学的经典异常有: 空指针异常:NullPointerException 类型转换异常:ClassCastException 数组下标越界异常:ArrayIndexOutOfBoundsException 数字格式化异常:NumberFormatException */ Integer w = new Integer("12");//本行代码没有问题 // 下行代码是将非数字型字符串转换成Integer包装类型对象就会出现异常(该异常编译期可以通过编译,但运行期报错) // Integer q = new Integer("oneTwo");//java.lang.NumberFormatException 数字格式化异常(运行期异常) // (重点) 将字符串转换成int,使用静态方法: static int parseInt(String s); // 静态方法,传入参数String,返回int,网页上文本框中输入的是100,实际上是字符串"100",后台数据库中需要的是数字100, // 这时java程序就需要使用该方法把字符串"100"转换成数字100 int retValue = Integer.parseInt("123");//如果将"123"换成文字就会出现java.lang.NumberFormatException 数字格式化异常 System.out.println(retValue + 100);//223 // 照葫芦画瓢学习其他包装类的方法 // 将字符串转换成double,使用静态方法:static double parseDouble(String s); double retValue1 = Double.parseDouble("3.14"); System.out.println(retValue1 + 1);//4.140000000000001这个问题是double的精度问题不要纠结 // 将字符串转换成float,使用静态方法:static float parseFloat(String s); float retValue2 =Float.parseFloat("10.0"); System.out.println(retValue2 + 1);//11.0 /** * String、int、Integer之间相互转换 */ // String---->int int i1 = Integer.parseInt("100");//i1是int类型数字100; System.out.println(i1 + 1);//101,数字100和1相加 // int ------>String String s1 = i1 + "";//这里进行的是字符串拼接 System.out.println(s1 + 1);//1001,这里进行的是字符串拼接 // 也可以使用String.valueOf(int) String s2 = String.valueOf(456); System.out.println(s2 + 1);//4561,这里进行的是字符串拼接 // int ------>Integer Integer h = 1000;//自动装箱 // Integer---->int int i2 = h;//自动拆箱 // String----->Integer Integer d = Integer.valueOf("789"); // Integer---->String String s3 = String.valueOf(d); } }
Integer方法区整数型常量池