好好学Java:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

5.2.1 字符串的赋值与转换

无论是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工需求。为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类型允许保存一整串字符,并对字符串进行各种处理。

字符串类型不属于基本类型,它的用法与包装类型更为接近。例如给字符串变量赋初始值,就有多达4种赋值形式(包装类型只有3种赋值),分别介绍如下:

(1)被双引号包裹着的字符串可直接用等号赋值给字符串变量,代码示例如下:

    // 第一种方式:用双引号把字符串引起来
    String fromQuote="Hello";
    System.out.println("fromQuote="+fromQuote);

(2)调用String类型的valueOf方法把整型、浮点型、布尔型、字符型、字符数组等变量转换为字符串,方法调用的代码示例如下:

    // 第二种方式:使用String的valueOf方法把数值、布尔、字符、字符数组等变量转换为字符串
    String fromValueOf=String.valueOf(111);
    System.out.println("fromValueOf="+fromValueOf);

(3)对于字符数组来说,可通过new关键字创建字符串变量,此时赋值代码如下:

    // 第三种方式:对于字符数组来说,还能通过new关键字创建字符串变量
    char[] array={'A', 'B', 'C'};
    String fromArray=new String(array);
    System.out.println("fromArray="+fromArray);

(4)对于基本变量类型(数组除外)来说,也可以利用加号连接基本变量和空串,下面的代码便是一个例子:

    // 第四种方式:对于基本变量类型(数组除外)来说,也可以利用加号连接基本变量和空串
    // 注意,数值变量之间的加号为算术上的相加运算,而字符串之间的加号为两个字符串的合并操作
    String fromPlus=true+"";
    System.out.println("fromPlus="+fromPlus);

以上给字符串变量的赋值方式不多不少正好4种,恰似茴香豆的茴有4种写法那样。既然知晓了字符串的4种赋值,不妨温习一下鲁迅笔下“茴”的4种写法,看看你还记得几个?茴字上边为草头,下边为回家的回,其实有4种写法的是“回”字,包括:回、囘、囬,还有一种是“口”字里面有一个“目”字。回头再复习刚才提到的字符串的4种赋值方式,如果还记得具体是哪4种,那么恭喜你已经掌握了字符串的入门诀窍。

既然能够把各种基本类型的变量赋值给字符串变量,那么公平起见,也要求字符串变量允许转换成其他类型的变量。然而字符串类型不支持直接转换为基本类型,必须先转换成包装类型,再从包装类型转换成基本类型。像包装整型Integer提供了parseInt方法,可将输入的字符串变量转换成包装整型变量并返回。类似的字符串转换方法还有:包装长整型Long的parseLong方法,包装浮点型Float的parseFloat方法,包装双精度型Double的parseDouble方法,包装布尔型Boolean的parseBoolean方法。但是包装字符型并没有相应的parse***方法,这是怎么回事呢?仔细想想字符串内部由一串连续的字符组成,然而一个字符型变量只能容纳一个字符,由于一串字符无法转换成一个字符,必须拆开变为多个字符,因此字符串类型不能转换成字符型,只允许转换成字符数组。要想把字符串变量转换为字符数组,则需调用字符串变量的toCharArray方法,该方法的输出参数即为字符数组类型char[]。

下面的代码例子将演示如何将字符串类型转换成包装类型和字符数组类型的变量(完整代码见本章源码的src\com\string\string\StrAssign.java):

        String number="13456";
        Integer packInt=Integer.parseInt(number);  // 将字符串变量转换成包装整型变量
        System.out.println("packInt=" + packInt);
        Long packLong=Long.parseLong(number);  // 将字符串变量转换成包装长整型变量
        System.out.println("packLong=" + packLong);
        Float packFloat=Float.parseFloat(number);  // 将字符串变量转换成包装浮点型变量
        System.out.println("packFloat=" + packFloat);
        Double packDouble=Double.parseDouble(number);  // 将字符串变量转换成包装双精度型变量
        System.out.println("packDouble=" + packDouble);
        String zhen="true";
        Boolean packBoolean=Boolean.parseBoolean(zhen);  // 将字符串变量转换成包装布尔型变量
        System.out.println("packBoolean=" + packBoolean);
        char[] numberArray=number.toCharArray();  // 将字符串转换成字符数组
        for (char item : numberArray) {  // 遍历并打印字符数组中的各元素
            System.out.println("item=" + item);
        }

前面介绍大数字类型的时候,提到可以通过valueOf方法给大数字变量赋值,但是该方法的输入参数要求为基本数字类型,因为基本类型可表达的数值范围存在限制,比如长整型long表示的数字大小为19位整数,双精度型double表示的有效数字大小只有15~16位,所以一旦某个巨大的整数或者长尾巴的小数超出有效位数,这个数字就无法通过valueOf方法赋值给大数字类型。

为了解决超大数字的赋值问题,BigInteger和BigDecimal提供了第二种赋值方式:先利用字符串变量保存超大数字,再使用关键字new创建该字符串对应的大数字变量,具体的超大数字赋值代码示例如下:

        String bigNumber="134567890134567890134567890";
        BigInteger bigInt=new BigInteger(bigNumber);  // 将字符串变量转换成大整数变量
        System.out.println("bigInt=" + bigInt);
        BigDecimal bigDec=new BigDecimal(bigNumber);  // 将字符串变量转换成大小数变量
        System.out.println("bigDec=" + bigDec);

既然字符串变量能够转换成包装类型和大数字类型,那么反过来,包装变量和大数字变量也能转换成字符串类型,并且转换为字符串的方式很简单,只要由包装变量和大数字变量调用自身的toString方法即可。