据我所知:
- " bytes - wise",看起来它们是相同的(它们都是2字节长);
-
Character
有更多的处理(静态.isLetter()
方法等)。
虽然我的问题可能听起来很愚蠢,但它们是:
- 除非我的第一个假设是错误的,为什么有基本类型
char
和short
,因为它们具有相同的"内部长度",无论如何,在Java中没有无符号基本类型? -
Short
是final
,如果不是,Character
会扩展Short
吗?
EDIT:给出的答案和我错了:在Java中是一种无符号基本类型,这是…char
.
EDIT 2: @PatriciaShanahan还提到,在算术操作中,char
的行为就像一个无符号16位整数,就像short
一样。这包括左移,也就是说,符号位是,就像short
一样。
区别在于short
是有符号的,char
是无符号的。
public class CharVsShort {
public static void main(String[] args) throws Exception {
short ffShort = (short)0xFFFF;
char ffChar = (char)0xFFFF;
System.out.println("all-1s-short = " + (int)ffShort);
System.out.println("all-1s-char = " + (int)ffChar);
}
}
打印
all-1s-short = -1
all-1s-char = 65535
Java语言规范第4.2节指出
整型为
byte
、short
、int
和long
,它们的值分别为8位、16位、32位和64位有符号双补整数;char
的值为16位无符号整数,表示UTF-16编码单元
(我的大胆的)。它还显式地给出了类型的范围
-
byte
,从-128到127,包括 -
short
,从-32768到32767,包括 -
int
,从-2147483648到2147483647,包括 -
long
,从-9223372036854775808到9223372036854775807,含 -
char
,从'u0000'到'uffff'包括在内,即从0到65535
它们目前是不兼容的,这是永远无法改变的。但是要猜测为什么它们最初是不同的—对于数值数据和字母有不同的类型可能是一个好主意,即使它们的内容以完全相同的方式工作,只是为了避免混淆它们。
关于short和char的知识:
-
如果没有显式强制转换,char原语变量永远不能赋值给short类型。
-
如果没有显式强制转换,短原语变量永远不能赋值给char。
char c = 'c'; short s = c; // will cause a compiler error short sh = 10; char ch = sh; // will also cause a compiler error
-
用关键字final定义的短常量只有在值适合char(0 - 65535)时才能赋值给char,反之亦然。对于item1和item2中的示例。下面修复了错误。
final char c = 'c'; short s = c; // compiles without any issues. final short sh = 10; char ch = sh; // compiles without any issues.
但是,下面的操作失败,因为char是无符号的,即只能处理正数
final short sh = -1;
char ch = sh; // compiler error is thrown
要修复这个错误,需要一个显式的case。
final short sh = -1;
char ch = (char)sh; // compiler error is thrown