第二十八讲 常用类——基本数据类型对象包装类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/82904553

概述

为了方便操作基本数据类型值,将其封装成了对象,带来的好处就是可以在对象中定义更多的属性和行为对基本数据类型进行操作,用于描述该对象的类就称为基本数据类型对象包装类。基本类型和包装类的对应如下表所示:

基本数据类型 包装数据类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

基本数据类型对象包装类的重要功能

用于基本数据类型与字符串之间的转换。

基本数据类型转成字符串

  1. 基本数据类型+""

  2. 更加专业的做法:

    基本数据类型的包装类.toString(基本数据类型值);
    

    例如,

    Integer.toString(34);// 将整数34变成字符串"34";
    

字符串转成基本数据类型

使用的是包装类中的parse基本类型(字符串)静态方法,例如,parseInt()、parseByte()、parseDouble()、parseBoolean(),只有Character没有parse方法。例如,

int a = Integer.parseInt("123");
double b = Double.parseDouble("12.23");
boolean b = Boolean.parseBoolean("true");

// 还有一种形式:
Integer i = new Integer("123");
int num = i.intValue();

自动装箱与自动拆箱

JDK1.5版本以后出现的新特性——自动装箱与自动拆箱,希望像操作int一样操作Integer。

  • 自动装箱:把基本类型转换为包装类类型;
  • 自动拆箱:把包装类类型转换为基本类型。

JDK1.5版本以后,简化了定义方式。如:

Integer i = new Integer(4);

可以直接写成:

Integer i = 4; // 自动装箱。Integer.valueOf(4);

接着自动拆箱:

i = i + 6; // 右边的i自动拆箱了。i.intValue() + 6,运算完的结果又一次装箱赋值给i。

需要注意:在使用时,Integer x = null;上面的代码就会出现NullPointerException。

一个面试题

运行以下程序,看会输出什么?

public class WrapperDemo {

	public static void main(String[] args) {
		Integer m = 128;
		Integer n = 128;
		System.out.println("m == n: " + (m == n));
		System.out.println("------------------");
		
		Integer a = 127;
		Integer b = 127;
		System.out.println("a == b: " + (a == b));
	}

}

答案是false和true,以下是解析:
在这里插入图片描述
JDK1.5以后,自动装箱的值如果在byte范围之内,相同的值不会单独开辟空间,而是重复使用。

练习题

有这样一个字符串:”23 10 -8 0 3 7 108”,请对字符串中的数值进行升序排序后,生成一个数值有序的字符串——”-8 0 3 7 10 23 108”。

思路:

  1. 排序,而且对整数数值排序;
  2. 排序的元素都在字符串中,如何取出?
  3. 找String类的功能,而且我发现,数字之间的间隔都是相同的空格,有规律。如果有这个功能,结果是返回多个字符串,找到方法:String[] split(String);
  4. 将获取到的数字格式的字符串转成数字存储到数组中;
  5. 对数组排序;
  6. 将数组转成字符串;
public class Test {

    private static final String SEPARATOR = " ";

    public static void main(String[] args) {

        String numStr = "23 10 -8 0 3 7 108";

        String sortStr = sortNumberString(numStr);

        System.out.println(sortStr);

    }

    /**
     * 对一个有多个数值的字符串,进行数值的排序
     * @param numStr
     * @return
     */
    public static String sortNumberString(String numStr) {
        // 1,将给定的字符串分解成多个数字格式的字符串
        String[] numStrs = toStringArray(numStr);

        // 2,将字符串数组转成int数组
        int[] nums = toIntArray(numStrs);

        // 3,对数组排序
        sort(nums);

        // 4,将int数组转成字符串
        return toString(nums);
    }

    /*
     * 将int数组转成字符串
     */
    private static String toString(int[] nums) {
        // 1,定义一个StringBuilder字符串缓冲区
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < nums.length; i++) {
            if (i != nums.length) 
                sb.append(nums[i] + SEPARATOR);
            else 
                sb.append(nums[i]);

        }
        return sb.toString();
    }

    /*
     * 对int数组进行升序排序
     */
    private static void sort(int[] nums) {
        Arrays.sort(nums);
    }

    /*
     * 将字符串数组转成int类型数组
     */
    private static int[] toIntArray(String[] numStrs) {
        // 1,创建一个int类型的数组,长度和字符串数组的长度一致
        int[] nums = new int[numStrs.length];
        // 2,对字符串数组进行遍历
        for (int i = 0; i < numStrs.length; i++) {
            // 3,将字符串数组中的元素通过parseInt()方法转换后,赋值给int类型的数组
            nums[i] = Integer.parseInt(numStrs[i]);
        }
        return nums;
    }

    /*
     * 将字符串按照指定的分隔,转成字符串数组
     */
    private static String[] toStringArray(String numStr) {
        // 使用字符串的split(regex)
        return numStr.split(SEPARATOR);
    }

}

猜你喜欢

转载自blog.csdn.net/yerenyuan_pku/article/details/82904553