一:背景

在一个项目中,我需要修改一个全部由数字(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);
}
}

int转换char的正确姿势的更多相关文章

  1. 从EntityFramework转换EntityFrameworkCore的正确姿势(DBFirst)

    今天有一个小任务:要把一个数据的数据搬运到另一个数据库(两个数据库的数据结构很不一样). 决定用.net core  console app来跑,并且采用entityframework 去做数据CRU ...

  2. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

  3. C++ 中 char 与 int 转换问题

    itoa 功  能:把一整数转换为字符串 函  数:char *itoa(int value, char *string, int radix); 解  释:itoa 是英文integer to ar ...

  4. Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();

    Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...

  5. (转)CString,int,string,char*之间的转换

    CString,int,string,char*之间的转换http://www.cnblogs.com/greatverve/archive/2010/11/10/cstring-int-string ...

  6. MFC/C++/C中字符类型CString, int, string, char*之间的转换

    1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...

  7. 数据结构基础之memset---有memset 抛出的int 和 char 之间的转换和字节对齐

    今天晚上,在做滤波算法时,里面用到很多float 和int 以及char 之间的类型强制转换,后面滤波完发现图片有些区域块,有过度曝光的白光,我就跟踪,以为是char 字符数字数据溢出问题,加了0-2 ...

  8. 打印出A到Z的所有字符,使用char和int转换

    public class Demo14{ //A到Z的所有字符,使用char和int转换 public static void main(String[] args) { for(int i = 65 ...

  9. VC CString,int,string,char*之间的转换

    CString转string : CString strMfc = "test"; std::string strStr; strStr = strMfc.GetBuffer(); ...

随机推荐

  1. Android Studio项目生成Jar包

    步骤: 1)在module的gradle文件中,将apply plugin:'com.android.application'改为apply plugin:'com.android.library' ...

  2. datetime.timedelta类

    datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象. Python中datetime模块中的timedelta ...

  3. HDU3339 In Action 【最短路】+【01背包】

    <题目链接> 题目大意: 给出一个0-n组成的图,1-n的点上分布着值为pow的电站,给出图的m条边以及距离,从0出发到n个点中的x个点的行走距离和最小(因为是每炸一个点派出一辆坦克),且 ...

  4. numpy学习笔记.

    import numpy as np import cv2 import matplotlib.pyplot as plt 一.数组的创建 1. 创建二维数组 np.array([ [1,2,3], ...

  5. Python常用模块--configparser

    作用: 官方:实现基本配置语言的类,该语言提供类似于Microsoft Windows INI文件中的结构.您可以使用它来编写可由最终用户轻松定制的Python程序. 通俗的说:该模块用于系统配置文件 ...

  6. SpringSecurity整合JWT

    一.前言 最近负责支付宝小程序后端项目设计,这里主要分享一下用户会话.接口鉴权的设计.参考过微信小程序后端的设计,会话需要依靠redis.相关的开发人员和我说依靠Redis并不是很靠谱,redis在业 ...

  7. SpringMvc接口中转设计(策略+模板方法)

    一.前言 最近带着两个兄弟做支付宝小程序后端相关的开发,小程序首页涉及到很多查询的服务.小程序后端服务在我司属于互联网域,相关的查询服务已经在核心域存在了,查询这块所要做的工作就是做接口中转.参考了微 ...

  8. YOLO系列:YOLO v2深度解析 v1 vs v2

    概述 第一,在保持原有速度的优势之下,精度上得以提升.VOC 2007数据集测试,67FPS下mAP达到76.8%,40FPS下mAP达到78.6%,可以与Faster R-CNN和SSD一战 第二, ...

  9. JavaScript基础笔记(一)基本概念

    基本概念 一.语法 一)区分大小写 二)标识符 书写规则同Java 三)注释 略 四)严格模式 1.在整个脚本中启用严格模式:在顶部添加 "use strict" 2.指定函数在严 ...

  10. [CC-MCO16306]Fluffy and Alternating Subsequence

    [CC-MCO16306]Fluffy and Alternating Subsequence 题目大意: 给定一个\(1\sim n(n\le3\times10^5)\)的排列\(a\). 对于一个 ...