package integer;
/**
* 包装类
* 包装类的出现是为了解决基本类型不能直接参与面向对象开发的问题,
* 使得我们可以让基本类型以对象的形式存在
*/
public class IntegerDemo1 {
public static void main(String[] args) {
int d = 123;
//java推荐我们使用valueof形式创建包装类
Integer i1 = Integer.valueOf(d);
Integer i2 = Integer.valueOf(d);
System.out.println(i1);//123
System.out.println(i1==i2);//true
System.out.println(i1.equals(i2));//true
double dou = 123.123;
Double d1 = Double.valueOf(dou);
Double d2 = Double.valueOf(dou);
System.out.println(d1==d2);//false
System.out.println(d1.equals(d2));///true
double dou1 = d1.doubleValue();
System.out.println(dou1);//123.123
int in = d1.intValue();
System.out.println(in);//123
}
}
package integer;
/**
* 包装类常用功能介绍
*/
public class IntegerDemo2 {
public static void main(String[] args) {
//得到int的最大值
int max = Integer.MAX_VALUE;
System.out.println(max);
int min = Integer.MIN_VALUE;
System.out.println(min);
double dmax = Double.MAX_VALUE;
System.out.println(dmax);
/*
包装类有一个静态方法:parseXXX(String str)
可以将字符串解析为对应的基本类型,但是前提是该字符串
正确的描述了基本类型可以保存的值
否则会抛出异常:NumberFormateException
*/
String str = "123";
int d = Integer.parseInt(str);
System.out.println(d);
double dou = Double.parseDouble(str);
System.out.println(dou);
}
}
package integer;
/**
* JDK1.5版本推出时,出现了一个新特性,自动拆装箱
* 这个特性是编译器认可的,让我们可以在源代码中基本类型与包装类之间直接相互赋值使用
* 无需再而外编写相互转换代码,编译器会在编译期间补充转换代码
*/
public class IntegerDemo3 {
public static void main(String[] args) {
/*
这里触发了编译器的自动装箱特性,编译器会将代码改为:
Integer in = Integer.valueOf(123)
*/
Integer in = 123;
/*
这里触发了编译器的自动拆箱特性,编译器会将代码改为:
int i = in.intValue()
*/
int i = in;
}
}
总结
①、无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。
②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。
③、两个都是new出来的,则为false。
④、int和integer(new或非new)比较,都为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。
package integer;
public class Test1 {
public static void main(String[] args) {
int int1 = 12;
int int2 = 12;
Integer integer1 = new Integer(12);
Integer integer2 = new Integer(12);
Integer integer3 = new Integer(127);
Integer a1 = 127;
Integer a2 = 127;
Integer a = 128;
Integer b = 128;
System.out.println("int1 == int2 -> " + (int1 == int2));
System.out.println("int1 == integer1 -> " + (int1 == integer1));
System.out.println("integer1 == integer2 -> " + (integer1 == integer2));
System.out.println("integer3 == a1 -> " + (integer3 == a1));
System.out.println("a1 == a2 -> " + (a1 == a2));
System.out.println("a == b -> " + (a == b));
}
}
/*
1、int1 == int2 为true,这个我就讲了,这个都知道
2、int1 == integer1,Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型,
所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱
为int类型,所以就是相等的。
3、integer1 == integer2 -> false,这是两个都是对象类型,而且不会进行拆箱比较,所以不等
4、integer3 == a1 -> false , integer3是一个对象类型,而a1是一个常量它们存放内存的位置不一样,所以也
不等,具体存在内存的位置看以看文章:点击打开链接
5、6 看起来是一模一样的为什么一个是true,一个是false,这是因为Integer作为常量时,对于-128到127之间的数,
会进行缓存,也就是说int a1 = 127时,在范围之内,这个时候就存放在缓存中,当再创建a2时,java发现缓存中存在127这
个数了,就直接取出来赋值给a2,所以a1 == a2的。当超过范围就是new Integer()来new一个对象了,所以a、b都是
new Integer(128)出来的变量,所以它们不等。
*/
TTFFTF