从头再学java系列之char和Character的区别及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的,都是从缓存池里面取出来,那么就是同一个对象,那么地址也就一样了

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值