java是一个近乎纯洁的面向对象的语言,但是为了编程的方便还是引入了基本数据类型,为了能将这些基本数据类型能够当做对象处理,因此java为每一个基本数据类型都提供了它的包装类。从java5开始引入了自动装箱、自动拆箱机制,使二者可以相互转换。
int num=128;
short number=(short)num;
System.out.println(number);
以上的转换结果都在我们的预期之内,属于正常的转换,但有时强制转换会出现丢失精度、数据溢出的情况。
int b=129;
byte bb=(byte)b;//byte的取值范围在-128~127
System.out.println(bb);
调用基本类型对应的包装类中的方法parseXX()或valueOf(),即可返回对相应的基本类型
String s="1234";
int a=Integer.parseInt(s);
long b=Long.valueOf(s);
一:在基本数据之后与空字符串“”用“+”连接; 二:调用String类中的valueOf()方法
int num=12;
String s1=num+"";
String s2=String.valueOf(num);
1.写出下列语句输出结果
例1:
public class Demo01 {
public static void main(String[] args) {
Integer a=new Integer(3);
Integer b=3; //3自动装箱成Integer类型,相当于Integer b=new Integer(3)
int c=3;
System.out.println(a==b);//false a和b二者都为引用类型,但并没有引用同一个对象
System.out.println(a==c);//true a自动拆箱为int类型再和c比较
System.out.println(b==c);//true b自动拆箱为int类型再和c比较
}
}
结果:
false
true
true
例2:
public class Demo01 {
public static void main(String[] args) {
Integer f1=100,f2=100,f3=150,f4=150;
System.out.println(f1==f2);//true
System.out.println(f3==f4); //false
}
}
结果:
true
false
分析:首先f1,f2,f3,f4都会自动装箱为Integer对象,相当于new Integer(),而Integer是引用类型,故它的==比较,比较的就不是值,而是地址,自动装箱的本质就是调用Integer的静态valueOf()方法,查看这个方法的源码可知道,当整型字面量的值在-128~127之间时,就不会
new新的 Integer对象,而是直接引用 常量池的Integer对象,而不在-128~127之间时,才会new新的 Integer对象,因此f1==f2的结果是true,而f3==f4的结果是false。
2.String、StringBuffer、StringBuilder的区别
String:字符串常量,在修改时不会改变自身,因为它可以理解为被final修饰的常量,显然是线程安全的。
StringBuffer:在修改时会改变自身,每次操作都是对StringBuffer对象本身做修改,线程安全。
StringBuilder是java5引入的,它和StringBuffer的方法完全相同,二者有均继承于AbstractStringBuilder,会调用该抽象类中的公共方法,如:append、insert、indexOf(...), 区别在于,StringBuffer会在方法上加上synchronized关键字,进行同步,来保证线程安全,而StringBuilder是线程不安全的。
三者如何选择?
如果一个字符串不经常改,优先考虑使用StringBuilder。
程序是单线程的,修改或者操作大量的数据,优先考虑使用StringBuilder。
程序是多线程的,考虑线程安全,修改或者操作大量的数据,优先考虑使用StringBuffer。