什么是自动装箱和拆箱?
自动装箱就是Java自动将原始类型值转换成对应的包装类型,如将int的变量转换成Integer对象,这个过程叫做装箱。反之将Integer引用类型转换成int类型值,这个过程叫做拆箱。因为装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。
基本数据类型:byte,short,char,int,long,float,double、boolean
对应的封装类为:Byte,Short,Character,Integer,Long,Float,Double,Boolean
自动装箱时编译器调用valueOf将基本类型值转换成引用类型。
自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。
//把int类型转换为Integer类型:
int i = 23;
Integer num = Integer.valueOf(i);
//把Integer类型转换为int类型
int i = num.intValue();
自动装箱的弊端有哪些?
1、在一个循环中进行自动装箱操作的时候,会创建多余的对象,会影响程序的性能。
Integer sum = 0;
for(int i = 0;i < 100;i++0{
sum += i;
}
代码sum += i 可以看成sum = sum + i,但是 + 操作符不适用于Integer对象,所以就会对sum先进性自动拆箱操作,然后进行数值相加操作,最后发生自动装箱操作转换成Integer对象。
通过XJad反编译软件我们可以看到源码是这样的:
Integer sum = Integer.valueOf(0);
for (int i = 0; i < 100; i++){
sum = Integer.valueOf(sum.intValue() + i);
}
由于我们这里声明的sum是Integer类型,在上面循环中我们或创建几乎100个没有用的Integer对象,会降低程序的性能,并且还加重了垃圾回收的工作量。
2、当一个对象和一个原始数据值进行比较时,如果这个对象没有进行初始化或者为null,在自动拆箱中会抛出NullPointerException。所以今后我们在进行操作对象的时候要首先判断是否为null
private static Integer count;
public static void main(String[] args) {
if(count <= 0){
System.out.println("Count is not started yet");
}
}
将基本数据类型封装成对象有什么好处?
1、为了对基本类型进行更多的操作,更方便的操作,java针对每一种基本数据类型提供了对应的类类型,即包装类类型。
2、可以用于基本数据类型和字符串之间的转换
int类型和String类型的相互转换:
int类型转换为String类型:
(1) 通过拼接一个空字符串。也就是number+”“的形式
(2) 通过String类的valueOf方法。也就是String.valueOf(number)(推荐)
public static String valueOf(T l):返回 参数的字符串表示形式。
(3) 通过转换为Integer对象,然后调用toString()方法。(不推荐)
public String toString():返回一个表示该 Integer 值的 String 对象。
(4)调用Integer的toString(int i)方法
public static String toString(int i):返回一个表示指定整数的 String 对象
String s1 = "" + number; //法一
System.out.println("s1:" + s1);
String s2 = String.valueOf(number); //法二
System.out.println("s2:" + s2);
Integer i = new Integer(number); //法三
String s3 = i.toString();
System.out.println("s3:" + s3);
String s4 = Integer.toString(number); //法四
System.out.println("s4:" + s4);
String类型转换为int类型:
String s = "100";
Integer i = new Integer(s); //法一
int x = i.intValue();
System.out.println("x:" + x);
int ii = Integer.parseInt(s); //法二<font color="red">(推荐)</font>
System.out.println("ii:" + ii);
Integer类:java.lang
public final class Integer extends Number implements Comparable<Integer>
构造方法:
public Integer(int value):构造一个新分配的 Integer 对象,它表示指定的 int 值。
public Integer(String s) throws NumberFormatException:这个字符串必须是由数字组成。
十进制转换为其他进制:
public static String toBinaryString(int i):以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
public static String toOctalString(int i):以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
public static String toHexString(int i):以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
public static String toString(int i,int radix):返回用第二个参数指定基数(2进制、8进制等)表示的第一个参数的字符串表示形式。
进制的范围:2-36(因为0-9 a-z总共有36个)
其他进制转换为十进制:
public static int parseInt(String s,int radix) throws NumberFormatException:使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
范围:
public static final int MAX_VALUE:值为 231-1 的常量,它表示 int 类型能够表示的最大值。
public static final int MIN_VALUE:值为 -231 的常量,它表示 int 类型能够表示的最小值。
Character类:java.lang
public final class Character extends Object implements Serializable, Comparable<Character>
public static boolean isLowerCase(char ch):确定指定字符是否为小写字母。
public static boolean isUpperCase(char ch):确定指定字符是否为大写字母。
public static boolean isDigit(char ch):确定指定字符是否为数字。
public static char toUpperCase(char ch):把给定的字符转换为大写。
public static char toLowerCase(char ch):把给定的字符转换为小写。