天天看点

java基本类型、对应的包装类型(自动拆箱和自动装箱)

什么是自动装箱和拆箱?

      自动装箱就是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 = ;
Integer num = Integer.valueOf(i);

//把Integer类型转换为int类型
int i = num.intValue();
           

自动装箱的弊端有哪些?

1、在一个循环中进行自动装箱操作的时候,会创建多余的对象,会影响程序的性能。

Integer sum = ;
for(int i = ;i < ;i++{
    sum += i;
}
           

      代码sum += i 可以看成sum = sum + i,但是 + 操作符不适用于Integer对象,所以就会对sum先进性自动拆箱操作,然后进行数值相加操作,最后发生自动装箱操作转换成Integer对象。

      通过XJad反编译软件我们可以看到源码是这样的:

Integer sum = Integer.valueOf();
for (int i = ; i < ; 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 <= ){
        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 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 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):把给定的字符转换为小写。