1、赋值
char是16位的,采取的Unicode的编码方式,所以char就有以下的初始化方式:
- char c=‘c’; //字符,可以是汉字,因为是Unicode编码。需要加单引号。
- char c=十进制数,八进制数,十六进制数都可以; //可以用整数赋值【整数范围:0~65535】。输出字符编码表中对应的字符。
- char c=‘\u数字’; //用字符的编码值来初始化,如:char=‘\0’,表示结束符,它的ascll码是0,这句话的意思和 char c=0 是一个意思。
例如:char a = 65; char a1 = ‘A’; 两者打印输出都是A
2、运算
char类型是可以运算的因为char在ASCII等字符编码表中有对应的数值。
在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。==(char遇到运算符,就会自己转为ASCII做运算)==在中缀转后缀表达式算法中经常就有char的运算。
- 例子:
char a = 65; -->A //为char类型变量 a 赋值常量值 65。
char b = ‘A’+3; -->D // 65+3=68,ASCII对应的字符为 D【注意:这里查询的是十进制编码的ASCII字符集】 ‘a’ + 3 结果是常量。
char c = a+3; -->报错 //无法从int类型转换为char类型。a+3 结果是int类型的变量!
int d = ‘a’; //输出变量d后结果是97;
接下来让我们了解下为什么会不能这样运算:
首先,我们先知道在jvm内存机制中,char类型数据运算是将字符在ASCII表对应的整数以int类型参与运算(可以认为’ A’=65)
常量(65)与常量(3)运算得到一个新的常量(68),常量赋值给变量(b),不存在强制转换,只要这个接受变量(b)的类型范围大于这个常量即可。
而变量声明时需要定义数据类型(例:char a),内存就为这个变量划分一个char类型大小的空间,其中变量(a)的值是可变的,而常量(3)的值是不变的,两个运算得到的还是一个变量,本例中(a+3)是int类型的变量,而int类型变量(a+3)赋值给char类型变量(c)需要强制转换,因此会报错。
char c=(char)(a+3); -->D
3、算法题中对String数据的操作
在算法题中经常遇到String s = “xxxx”,我们往往需要对s中的每一个字字符串进行处理,单独进行操作肯定不行,java不像c++操作起来那么简单。不可以直接s[i]的方式取到单独的元素。
3.1 思路1、使用toCharArray()方法
String s = "ASDFGH";
//System.out.println(s[2]);错误写法
char[] chars = s.toCharArray();
System.out.println(chars[2]); //D
System.out.println(chars[0]+1); //66 char遇到运算符,以对应的asc2的int值进行运算
另外注意联想到,String类型数据,遇到 + 运算符直接将其他类型数据变为字符串类型
- 例:String s = “23456”,如何以int类型取出每一个数字?
String s1 = "1234";
char[] chars1 = s1.toCharArray();
for (int i = 0; i < chars1.length; i++) {
int num = chars1[i];//49,50,51... 想得到1,2..减去48
int realNum = chars1[i] - '0';//1,2,3,4...
char c1 = chars1[i];//1,2,3,4(都还是char类型)
}
3.2 例题:将字符串倒叙输出
思路:字符串直接操作每一个元素肯定是不好做的,思路就是要转为数组,对每个元素进行操作!
使用toCharArray(),转为char数组,之后使用双指针法(复习倒置链表的双指针解决方案),将头尾进行倒置!最后通过String的构造函数,将数组重新组装为String。
public static String reverseString(String originalString){
char[] charArray = originalString.toCharArray();
//双指针
int left = 0;
int right = charArray.length -1;
while(left < right){
char temp = charArray[left];
charArray[left] = charArray[right];
charArray[right] = temp;
left++;
right--;
}
return new String(charArray);
}
3.3 例题:反转字符串中的单词
输入:s = “the sky is blue”
输出:“blue is sky the”
//API大法,使用库函数
public String reverseWords(String s) {
//trim修剪的意思,先去除字符串两边的多余空格
s = s.trim();
//将每个单词分离出来(正则表达式 spacce /s+)
//注意split之后是一个数组,但是数组不好操作,所以使用Arrays封装类
List<String> arrList = Arrays.asList(s.split("\\s+"));
//每个单词倒了一个位置
Collections.reverse(arrList);
//单词间用空格隔开
s = String.join(" ",arrList);
return s;
}