• int转换char的正确姿势


    一:背景

          在一个项目中,我需要修改一个全部由数字(0~9)组成的字符串的特定位置的特定数字,我采用的方式是先将字符串转换成字符数组,然后利用数组的位置来修改对应位置的值。代码开发完成之后,发现有乱码出现([]),经过排查发现,我将数字(0~9)转换成字符的姿势不对,现记下一笔,以加深印象。

    二:错误的使用方式

    如下代码所示,直接将int类型的数字直接转换成了char类型的数据,就会出现如(图-1)所示的情况

    public class TestChar {
        public static void main(String []args){
            for(int i =0,sum=9; i<sum; i++){
                char c = (char)i;
                System.out.print("the int value is : "+i+" the convert char value is : ");
                System.out.println(c);
            }
        }
    }

    图-1

    三:正确的使用方式

    后来发现字符类提供了对应的转换方法,如下代码所示,执行效果,如(图-2)所示

    public class TestChar {
        public static void main(String []args){
            for(int i =0,sum=9; i<=sum; i++){
                char c = Character.forDigit(i,10);
                System.out.print("the int value is : "+i+" the convert char value is : ");
                System.out.println(c);
            }
        }
    }

    当然了,如果,我们的前提条件是,只是将(0~9)这是十个int类型的数字转为其对应的字符表示形式的话,除了使用字符类提供的方法也有别选择,比如,下面的简单处理方式

    方式2:int->String-char

    public class TestChar {
        public static void main(String []args){
            for(int i =0,sum=9; i<=sum; i++){
                char c = String.valueOf(i).charAt(0);
                System.out.print("the int value is : "+i+" the convert char value is : ");
                System.out.println(c);
            }
        }
    }

    方式3:直接通过字符数字表现形式所对应的数字来转换

    public class TestChar {
        public static void main(String []args){
            for(int i =0,sum=9; i<=sum; i++){
                char c = (char)('0' + i);
                System.out.print("the int value is : "+i+" the convert char value is : ");
                System.out.println(c);
            }
        }
    }

    方式4:和方式3一样的道理

    public class TestChar {
        public static void main(String []args){
            for(int i =0,sum=9; i<=sum; i++){
                char c = (char)(48+ i);
                System.out.print("the int value is : "+i+" the convert char value is : ");
                System.out.println(c);
            }
        }
    }

    四:问题

    使用int直接转换为char的方式为什么不对哪?

    嗯,要回答这个问题需要弄明白char的本质了

    https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

    char: The char data type is a single 16-bit Unicode character. It has a minimum value of 'u0000' (or 0) and a maximum value of 'uffff' (or 65,535 inclusive).

    char这种简单的java数据类型特点如下:

    1:是java语言中8种基本数据类型中的一种

    2:它占两个字节十六位

    3:最小值是0,最大值是65535

    4:它可以通过单引号包装起来表示,比如:‘1’、‘A’、‘中’,也可以使用0~65535十进制(其他进制的数也可以)的整数表示,也可以使用‘u0000’~'uffff'表示

    5:它的默认值是'u0000'(或者0)

    6:只能是单个字符,多了,没有都不行(空格也是一种字符)

    当使用int类型的数据强转为char类型数据的时候,由于int数据类型是占四个字节的数据,(当int的值不在char类型的范围的时候会失去一定位数)此时char类型的数据值是int类型的值所对应的Unicode编码表中所对应的字符。

    五:其他

    如下简单代码实例和运行结果,恰好印证了我们以上的观点

    public class TestChar4 {
        public static void main(String []args){
            System.out.println('1');
            System.out.println('A');
            System.out.println('中');
            System.out.println(' ');
            //System.out.println('');//编译错误,空字面量
            //System.out.println('美国');//编译错误,字符太多了,对于字符字面量而言
    
            char max = (char)(Character.MAX_VALUE+1);
            System.out.println(max);
    
            char min = (char)(Character.MIN_VALUE-1);
            System.out.println(min);
    
            char a = 49;
            System.out.println(a);
    
            char b = 65535;
            //char b1 = 65536;//编译不通过,报必须是char类型的却发现为int类型的
    
            System.out.println(b);
            char c = 0;
            //char c1 = -1;//编译不通过,报必须是char类型的却发现为int类型的
            System.out.println(c);
    
            char d = '1'+1;
            System.out.println(d);
    
            char e = '1'+'1';
            System.out.println(e);
    
            char f = '国'+1;
            System.out.println(f);
        }
    }

  • 相关阅读:
    iOS开发之MapKit
    iOS开发之代码截图
    iOS开发之CoreLocation(二)
    iOS开发之CoreLocation(一)
    iOS开发之静态库.a的制作
    iOS开发之通讯录 AddressBook
    iOS开发之ARC MRC混编
    iOS开发之蓝牙(一)GameKit
    java学习笔记之转换流
    iOS开发之蓝牙(二)CoreBluetooth
  • 原文地址:https://www.cnblogs.com/godtrue/p/8641891.html
Copyright © 2020-2023  润新知