char和Character类的区别
char和Character类的区别
1.char是一种基本的数据类型,Character是char类型的包装类,即通过Character创建出来的是一种对象。
Character的最大值和最小值
2.Character的最大值和最小值:是的,你没有看错,字符也可以用最大值和最小值。请看源码:
public static final char MIN_VALUE = '\u0000';
public static final char MAX_VALUE = '\uFFFF';
以上代码定义了Character类的最大值和最小值,我们都知道有一种编码格式叫做utf-8,java里面的编码格式就是Unicode编码,ASCII编码只定义了128个子符,而Unicode编码集里面定义了65536个字符。最小值和最大值就是表示第一个和最后一个字符,第一个是null,最后一个是一个小方框字符。
下面的代码是上面的输出,只是第一行刚刚好是空白所以看不出来。
Character字符种类
Character中定义了字符的种类:很多种,每种都是特定的意思,只列举一些常用的。
public static final byte UNASSIGNED = 0;//无效字符
public static final byte UPPERCASE_LETTER = 1;//大写字符
public static final byte LOWERCASE_LETTER = 2;//小写字符
public static final byte TITLECASE_LETTER = 3;//题目字符
public static final byte MODIFIER_LETTER = 4;//修饰字符
public static final byte OTHER_LETTER = 5;//其他字符
public static final byte NON_SPACING_MARK = 6;//非间隔字符
public static final byte ENCLOSING_MARK = 7;//包围字符
public static final byte COMBINING_SPACING_MARK = 8;
public static final byte DECIMAL_DIGIT_NUMBER = 9;
public static final byte LETTER_NUMBER = 10;
public static final byte OTHER_NUMBER = 11;
public static final byte SPACE_SEPARATOR = 12;
public static final byte LINE_SEPARATOR = 13;
public static final byte PARAGRAPH_SEPARATOR = 14;
public static final byte CONTROL = 15;
public static final byte FORMAT = 16;
public static final byte PRIVATE_USE = 18;
public static final byte SURROGATE = 19;
public static final byte DASH_PUNCTUATION = 20;
public static final byte START_PUNCTUATION = 21;
public static final byte END_PUNCTUATION = 22;
public static final byte CONNECTOR_PUNCTUATION = 23;
public static final byte OTHER_PUNCTUATION = 24;
public static final byte MATH_SYMBOL = 25;
public static final byte CURRENCY_SYMBOL = 26;
public static final byte MODIFIER_SYMBOL = 27;
public static final byte OTHER_SYMBOL = 28;
public static final byte INITIAL_QUOTE_PUNCTUATION = 29;
public static final byte FINAL_QUOTE_PUNCTUATION = 30;
Character类的缓存
3.我们上面讲到,char是一种基本的数据类型,Character是char类型的包装类,即通过Character创建出来的是一种对象。但是,下面的代码的结果,让人迷惑。
char c='a';
char b='a';
Character d='a';
Character e='a';
System.out.println(c==b);//true
System.out.println(e==d);//true
System.out.println(c==d);//true
System.out.println(e==b);//true
结果都是true,那么只能说明一个点,这些 变量/对象,在内存中的地址都一样。我的另外一篇博客有讲到这个点:关于equals方法和==的区别
那么又能说明一个点,就是,Character类和Integer类一样,都有进行字符的缓存
源码走起:
Character和Integer类一样,也是有一些常量被存储在缓存池里面的,请看源码:
该类一共缓存了从0-127共128个Character值
private static class CharacterCache {
private CharacterCache(){}
static final Character cache[] = new Character[127 + 1];
static {
for (int i = 0; i < cache.length; i++)
cache[i] = new Character((char)i);
}
}
那么,缓存的128个字符到底是什么鬼呢?
通过控制台打印出来,我们可以看到,是缓存了ASCII码的字符。【一些特殊字符无法被打印出来】
再看源码:
public static Character valueOf(char c) {
if (c <= 127) { // must cache 小于127从缓存池里面取出来
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
这段源码,说明什么,说明只要是字符小于127的,都是从缓存池里面取出来,那么就是同一个对象,那么地址也就一样了