学习Java基础解惑(1)——字符类型
Java基础解惑——字符类型
免责声明:因个人水平有限,如有错误还望加指正。
基础知识:
char类型的变量存储单个的字符代码。因为Java中所有的字符都以Unicode存储,所以他们每个占16比特(2字节)的内存。
声明一个字符类型:
char myChar = 'X';
这里用Unicode字符表示字母X来初始化变量。需要注意的是语句使用单引号作为字符字面量的定义符,对于编译器而言,这将起到区分字符'X'与变量X的作用。另外不能还用双引号作为定义符,因为双引号是用来定义字符串的。字符串"X"与字符'X'的字面量完全不同。
1. 字符转移序列
转移序列式一种简单常用的通过其代码设置字符的方式,以一个反斜杠(\)作为序列的开始,和熟悉的\n是一样的原理。
以字母X为例,其Unicode编码的十六进制值是0x0058,因此同样可以使用这样的语句来进行声明:
char myChar = '\u0058';
这样做的结果与之前的初始化语句效果是一样的,使用这种方法可以输入任何Unicode字符,只需要知道其编码即可。
解惑:
有时候,我们需要对字符串中的双引号进行判断或者处理,这时候单纯的使用(\")这样的转义形式,可能会导致编译器报错失败。例如对字符串进行以split(双引号)的操作时,可以使用指定Unicode编码来实现判断,如:
String.split("\\u0022");
2. 字符算术
我们已经知道字符可以通过指定编码来进行初始化赋值,实际上字符类型与数字是有着紧密的关系的。
我们甚至可以直接使用数字来对字符串进行赋值,或者直接获取char类型的编码值,如:
char mychar=0x0058; //仍然初始化的值为'X'
int mycharIndex=mychar; //直接获取字符的Unicode编码值,需要注意的是,这样返回的结果将是十进制的88
如果要获得十六进制的结果(58),则可以使用以下方法。
Integer.toHexString(mycharIndex);
我们还可以对字符(实质是对其Unicode编码)进行数学运算
char mychar = 88; //这时mychar的值为'X'
mychar +=1; //这时mychar的值就是'Y'了
解惑:
曾经使用char[]数组来存储从服务器端返回的信息,由于需要判断是否已经将结果读取全,就需要判断当前的数组是否已经存放满了。但是如果此想通过length属性来获取长度,那么返回的结果肯定会让你失望,如:
char myCharArray[] = new char[256];
System.out.println(myCharArray.length); //将会在屏幕上赤裸裸的显示256,也就是你初始化时候的长度
于是有网友提出还用for循环来计非空值数量的方式,来完成这个需求。但是在判断非空时遇到了一些疑惑,当char[]数组在初始化的时候,会将值全部初始化为0,而这句话是有歧义的。到底是'0',还是编码0x0000?如果是'0',那如果数组本身正常的值就有'0',那怎么办?所以猜测是编码为0。真相没有让人失望,确实是编码值为0。也就是相当于: char myChar = 0x0000; (或者char myChar = 0)
所以这样子的话计数条件就应该以Unicode编码为基准。那么最原始的循环就应当如下:
char myCharArray[] = new char[256];
int count = 0; //计数器
boolen flag = true; //循环中断条件
for(int i=0;i<myCharArray.length && flag==true;i++)
{
if(myCharArray[i]!=0x0000) //这是以十六进制编码来判断
//if(myCharArray[i]!=0) //这是以十进制来判断
//if(myCharArray[i]!='\000') //这是使用字符转移序列'\000'进行判断,'/000'表示空
{
count++;
}
else
{
flag = false;
}
}
数组实际长度 = count;