Java基础:char类型字节占用数

1. 前言

最近在研究InputStream、OutputStream和Reader、Writer这两大Java I/O输入输出抽象类。我们都知道对于InputStream、OutputStream是面向字节传输的(一次读取一个字节),对于Reader、Writer是面向字符传输(一次读取一个字符或者读取一行readline).在这其中我遇到了困惑,char类型到底是占用多少字节,因为在使用InputStream在read之后读取一个字节后转换成char之后,可以成功显示出正确的字符。但是由于网上以及Java编程思想这本书都提及Java中char是占用两个字节。所以本次博客就来详细探讨这个问题。

2. char类型字节占用数量

下面我们来看一下这个代码,来详细说明Java中char字节占用数量(其实和字符集编码和中文字符有关):

public class BytesOfChar {
    public static byte[] getBytesUTF8 (char  c ) {
        Charset cs = Charset.forName("utf-8");
        CharBuffer cb = CharBuffer.allocate (1);
        cb.put (c);
        cb.flip ();
        ByteBuffer bb = cs.encode (cb);
        return bb.array();
    }
    public static byte[] getBytesGBK (char c) {
        Charset cs = Charset.forName("GBK");
        CharBuffer cb = CharBuffer.allocate (1);
        cb.put(c);
        cb.flip ();
        ByteBuffer bb = cs.encode (cb);
        return bb.array();
    }
    public static void main(String[] args) throws UnsupportedEncodingException {
        char c='a';
        char cc='中';
        String str="a";
        String strr="中";
        String s="a";
        System.out.println("编码为UTF8:");
        System.out.println("char值为英文字符所占字节长度:"+getBytesUTF8(c).length);
        System.out.println("char值为中文字符所占字节长度:"+getBytesUTF8(cc).length);
        System.out.println("编码为GBK(默认编码):");
        System.out.println("char值为英文字符所占字节长度:"+getBytesGBK(c).length);
        System.out.println("char值为中文字符所占字节长度:"+getBytesGBK(cc).length);
        System.out.println("-------------------------------");
        System.out.println("编码为UTF8");
        System.out.println("String为英文字母所占字节长度:"+str.getBytes("utf-8").length);
        System.out.println("String为中文字母所占字节长度:"+strr.getBytes("utf-8").length);
        System.out.println("编码为GBK:");
        System.out.println("String为英文字母所占字节长度:"+str.getBytes("GBK").length);
        System.out.println("String为中文字母所占字节长度:"+strr.getBytes("GBK").length);
        System.out.println("String为英文字母(全角)所占字节长度:"+s.getBytes("GBK").length);

    }
}

运行结果:

编码为UTF8:
char值为英文字符所占字节长度:1
char值为中文字符所占字节长度:3
编码为GBK(默认编码):
char值为英文字符所占字节长度:2
char值为中文字符所占字节长度:2
-------------------------------
编码为UTF8
String为英文字母所占字节长度:1
String为中文字母所占字节长度:3
编码为GBK:
String为英文字母所占字节长度:1
String为中文字母所占字节长度:2
String为英文字母(全角)所占字节长度:2

从运行结果中,我们可以看出char类型字节占用数量实际上和字符集编码以及中文字符以及是否是String中的字符有关。下面我们来总结一下这个运行结果:

2.1 UTF-8编码

在UTF-8编码的情况下(一句话概括就是英文字母一个字节,中文字母三个字节):

  • char类型表示英文字母,占用1个字节
  • char类型表示中文字母,占用3个字节
  • String中英文字母,占用1个字节
  • String类型中文字母,占用3个字节

2.2 GBK编码(默认编码)

在GBK编码的情况下(一句话概括就是无论英文字母还是中文字母都是2个字节,但是有一个特例在String类型中英文字母占用一个字节):

  • char类型表示英文字母,占用2个字节
  • char类型表示中文字母,占用2个字节
  • String中英文字母,占用1个字节
  • String类型中文字母,占用2个字节

你可能感兴趣的:(Java编程语言,Java语言系统学习)