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);
}
}

int转换char的正确姿势的更多相关文章
- 从EntityFramework转换EntityFrameworkCore的正确姿势(DBFirst)
今天有一个小任务:要把一个数据的数据搬运到另一个数据库(两个数据库的数据结构很不一样). 决定用.net core console app来跑,并且采用entityframework 去做数据CRU ...
- Qt中 QString 和int, char等的“相互”转换
转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...
- C++ 中 char 与 int 转换问题
itoa 功 能:把一整数转换为字符串 函 数:char *itoa(int value, char *string, int radix); 解 释:itoa 是英文integer to ar ...
- Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();
Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...
- (转)CString,int,string,char*之间的转换
CString,int,string,char*之间的转换http://www.cnblogs.com/greatverve/archive/2010/11/10/cstring-int-string ...
- MFC/C++/C中字符类型CString, int, string, char*之间的转换
1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...
- 数据结构基础之memset---有memset 抛出的int 和 char 之间的转换和字节对齐
今天晚上,在做滤波算法时,里面用到很多float 和int 以及char 之间的类型强制转换,后面滤波完发现图片有些区域块,有过度曝光的白光,我就跟踪,以为是char 字符数字数据溢出问题,加了0-2 ...
- 打印出A到Z的所有字符,使用char和int转换
public class Demo14{ //A到Z的所有字符,使用char和int转换 public static void main(String[] args) { for(int i = 65 ...
- VC CString,int,string,char*之间的转换
CString转string : CString strMfc = "test"; std::string strStr; strStr = strMfc.GetBuffer(); ...
随机推荐
- Sublime text 3搭建Python开发环境及常用插件安装
参考 https://www.cnblogs.com/honkly/p/6599642.html 一.环境准备 1.官方网站地址 2.Windows 10 3.Sublime Text 3 + 官网 ...
- HTML文本结构及常用标签
一.什么是HTML? HTML:超文本标签语言 (Hyper Text Markup Language) www万维网的描述性语言. XHTML指可扩展超文本标记语言(标识语言)(EXtensible ...
- DevOps: CLM, RLM, RPM, RPD, BSA, BAA, BMA - WOW!
1. BMC Release Lifecycle Management (RLM) is our suite targeted at managing and automating applicati ...
- Python、进程间通信、进程池、协程
进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...
- SQL 2016 正式版 安装过程
1.点击全新安装 2.接着就是下一步,下一步... 3.选择你要安装的功能 [可以利用PolyBase,使用标准TSQL查询hadoop数据,但这里我不需要装] 4.设置排序规则 5.设置登录用 ...
- LOJ.6074.[2017山东一轮集训Day6]子序列(DP 矩阵乘法)
题目链接 参考yww的题解.本来不想写来但是他有一些笔误...而且有些地方不太一样就写篇好了. 不知不觉怎么写了这么多... 另外还是有莫队做法的...(虽然可能卡不过) \(60\)分的\(O(n^ ...
- 2159 ACM 杭电 杀怪 二维费用的背包+完全背包问题
题意:已知经验值,保留的忍耐度,怪的种数和最多的杀怪数.求进入下一级的最优方案. 思路:用二维费用的背包+完全背包问题 (顺序循环)方法求解 什么是二维费用的背包问题? 问题: 二维费用的背包问题是指 ...
- Scrapy基础(五) ------css选择器基础
基本语法: * 选择所有节点#container 选择id为container的节点.container 选择所有class包含contai ...
- Ubuntu16.04搜狗输入法无法输入中文
搜狗输入法图标显示正常,但是无法输入中文,切换为中文输入时无待选中文,只能输入英文. 这种情况应该是搜狗输入法的配置出现了问题,因为重装输入法时配置文件夹会保留,因此重装无法解决问题. 解决方案: 1 ...
- mysql error
一.could not find driver 我们这里以 PDO 为例, 问题: PDO 连接数据库找不到驱动程序. 解决方法:在 php.ini 里面讲 php_pdo_mysql 和 php_ ...