Fork me on GitHub

Java 常用工具类之基本对象包装类

为了方便操作基本数据类型值, 将其包装成对象, 在对象中定义了属性和行为, 丰富了该数据的操作.
用于描述该对象的类就称为基本数据类型对象包装类.

基本数据类型对应关系

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

常用操作之一: 用于基本数据类型和字符串之间的转换

1. 基本类型转换为字符串方法:
    1. 基本类型数值 + "";
    2. 使用 String 类中的静态方法 valueOf(基本类型数值);
    3. 使用 Integer 类中的静态方法 valueOf(基本类型数值);

2. 字符串转换为基本类型
    1. 使用包装类中的静态方法 `xxx  parseXxx("xxx类型的字符串");`

        ```
        int a = Integer.parseInt("234"); // 直接使用类名调用对应方法
        int parseInt("intstring");
        long parseLong("longstring");
        boolean parseBoolean("booleanstring");
        // 只有 Charater, 没有 parse 方法
        ```
    2. 如果字符串被 Integer 进行对象的封装, 可以使用另一个非静态的方法: intValue();
       将一个 Integer 对象转成基本数据类型的值

       ```
        Integer i = new Integer("123");
        System.out.println(i.intValue()); // 使用 intValue() 将 i 转换为 int 类型的值
        ```

整数进制转换

-  十进制转换为其他进制

```
Integer.toBinaryString(); // 转换为二进制
Integer.toOctalString(); // 转换为八进制
Integer.toHexString(); // 转换为十六进制
Integer.toString(int i, int radix); // 转换为任意进制
```

- 其他进制转换为十进制
    `Integer.parseInt(String s, int radix);`

a.equals(b); : Integer 比较数值是否相同
int compareTo(Integer anotherInteger); : Integer 对象比较两个数值大小, 返回值为: -1, 0, 1

自动装箱和自动拆箱

- 自动装箱:把基本的数据类型转换成包装类
- 自动拆箱:把包装类转换成基本的数据类型
Integer i = new Integer(4);
可以简化书写为: Integer i = 4; // 自动装箱
i = i + 2; // 先将 i 进行自动拆箱, 变成了 int 类型, 和 2 进行加法运算
          // 再将和进行装箱赋给 i, 即 i = new Integer(i.intValue() + 2);

备注:
自动装箱(拆箱): Integer = null; `对于对象可以成立, 但是对于 int 类型不可以, 运算时, 会发生错误.
因此, 使用 Integer 对象时, 需要进行健壮性判断.

Integer a = new Integer(127);
Integer b = new Integer(127);

System.out.println(a==b); // false, 两个对象, 地址值不同
System.out.println(a.equals(b)); // true, 比较的是数值

Integer x = 127;
Integer y = 127;

System.out.println(x==y); // true

Integer x = 128;
Integer y = 128;
System.out.println(x==y); // flase, JDK 1.5 以后, 自动装箱, 如果装箱的是一个字节(-128~!27)
                          // 那么该数据会被共享不会重新开辟空间


// 示例: 下面代码运行的结果
    public static void main(String[] args){
        doSomethind(10);
    }

    public static void doSomething(double m){
        System.out.println("double...");
    }

    public static void doSomething(Integer a){
        System.out.println("integer...");
    }

    // 运行结果: double...
    // 首先在 JDK1.4 里面肯定调用这个方法, 如果调用下面的方法, 需要类型转换, 但是
    // JDK 1.4  不能实现自动拆装箱.由于 JDK 是向下兼容的, 所以, 在 JDK 1.4 调用
    // 这个方法, 在 JDK 1.5 里面还是会调用这个方法

练习

对一个字符串中的数值进行从小到大的排序
"20 73 9 -7 88 36 29"

思路:

  1. 排序
  2. 如何获取到这个字符串中需要排序的数值?
    发现这个字符串中其实都是空格来对数值进行分隔的,
    所以就想到用字符串对象的切割方法将大串变成多个小串
  3. 数值最终变成小字符串, 怎么变成一个 int 数呢?
    字符串转换为基本类型可以使用包装类
import java.util.Arrays;  // 数组类中自带 sort() 方法

public class WrapperTest{
    private static final String SPACE_SEPARATOR = " "; // 空格为常量,提高阅读性

    public static void main(String[] args){
        String numStr = "20 73 9 -7 88 36 29";

        System.out.println(numStr); // 未排序前

        numStr = sortStringNumber(numStr);

        System.out.println(numStr); // 排序后打印
}

public static String sortStringNumber(String numStr){
    // 1. 将字符串变成字符串数组
    // String[] str_arr = numStr.split(SPACE_SEPARATOR);
       String[] str_arr = stringToArray(numStr);  // 封装成方法,提高阅读性

    // 2. 将字符串数组变成 int 数组
         int[] num_arr = toIntArray(str_arr);

    // 3. 对 Int 数组排序
          mySortArray(num_arr);

    // 4. 将排序后的 int 数组变成字符串
         String temp = arrayToString(num_arr);

    return temp;
}

public static String[] stringToArray(String numStr){
    String[] str_arr = numStr.split(SPACE_SEPARATOR);

    return str_arr;
}

public static int[] toIntArray(String[] str_arr){
    int[] arr = new int[str_arr.length];

    for(int i = 0; i<arr.length; i++){
        arr[i] = Integer.parseInt(str_arr[i]);
}
    return arr;
}

public static void mySortArray(int[] num_arr){
    Arrays.sort(num_arr);
}

public static String arrayToString(int[] num_arr){
    StringBuilder sb = new StringBuilder();

    for(int x = 0; x<num_arr.length(); x++){
        if(x != arr.length()-1)
            sb.append(num_arr[x] + SPACE_SEPARATOR);
        else
            sb.append(num_arr[x]);
}
    return sb.toString();
}

}


_参考资料_ - [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3113337/index_1.html#page=5) - [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)
posted @ 2017-09-07 08:21  小a的软件思考  阅读(787)  评论(0编辑  收藏  举报