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基础:char类型字节占用数相关推荐

  1. Java基础—char类型数据

    char类型介绍 char类型原本表示单个字符,但由于Unicode字符集扩充,导致有些字符需要使用两个char来描述 大小: 一个char类型占两个字节,16位 范围: 为十进制数 0 ~ 6553 ...

  2. Java基础题37:(单选题)java中char类型的取值范围是() A.0 ... 32767 B.0 ... 65535

    37.(单选题)java中char类型的取值范围是() A.0 - 32767 B.0 - 65535 C.–256 - 255 D.–32768 - 32767 [正确答案]B [答案解析]在jav ...

  3. java char 计算_经典Java面试题之Java中Char类型的运算

    经典Java面试题之Java中Char类型的运算 char在java中称为"字符型",占2个字节.本文是百分网小编搜索整理的关于经典Java面试题之Java中Char类型的运算,有 ...

  4. 杂记(1)java读取char类型2. 大小写字母的转换3. 字符串的拼接4. 一串数字排序

    1. java读取char类型 应为java中没有nextchar();函数,所以只能先读取一行,即 Sting a=sc.nextline(); char need=a.charAt(0);//取字 ...

  5. java中char类型可以存储两个中文字符吗

    java中char类型只能存储一个中文字符 https://www.cnblogs.com/lchzls/p/7071862.html https://blog.csdn.net/qq_4264294 ...

  6. Java中char类型数组打印数组名输出结果不是地址值

    Java中其他类型数组打印数组名,输出结果都是内存地址 Java中char类型数组打印数组名,输出结果不是内存地址 char类型的数组就相当于一个字符串. 因为输出流System.out是PrintS ...

  7. Java中char类型占几个字节?

    要想弄清楚char占用几个字节,就必须了解Unicode编码机制. 早在Unicode诞生之前,就已经有很多字符集,如美国的ASCII.表示西欧语言的ISO 8859-1.中国的GB18030等. 但 ...

  8. JAVA基础——基本类型

    1.基本数据类型 整数类型:byte, short, int, long 浮点数类型:float, double 字符类型:char 布尔类型:boolean 不同数据类型占用的字节数不一样,假设一个 ...

  9. java中char类型_【考点】JAVA中的char类型

    写在前面: 本周,在我们同学的刷题群里,一位同学上传了一道关于char的题,引起的不少同学的热议.热议的同时,我们也发现近乎一半的同学对char的基础知识一知半解,今天我们给大家一个浅显易懂的解释,赶 ...

最新文章

  1. 【 C 】字符串查找基础笔记
  2. java lazy loading_java – Spring,@Transactional和Hibernate Lazy Loading
  3. 在macOS搭建React Native for IOS开发环境
  4. 六. 异常处理7.throw:异常的抛出
  5. jQuery自定义选择器
  6. 2019蓝桥杯省赛---java---B---1(组队)
  7. 用的最多的正则表达式
  8. openlayer 图层上下_OpenLayers 3 的图层体系结构
  9. linux系统网络命令(六)
  10. (新手)使用pandas操作EXCEL
  11. 天线分类特征学习笔记(1)偶极子天线
  12. C# 单个按钮实现暂停或继续
  13. Win10 蓝屏0xc0000098修复
  14. 平板触控笔有哪些用途?超高性价比的触控笔推荐
  15. 元数据管理-技术元数据解决方案
  16. 20210212web04mysql多表,事务
  17. 《爱你就像爱生命》读后
  18. Win10激活提示“连接到internet激活windows”的最佳解决方法
  19. html点赞代码java_17种 HTML5字体图标点赞动画特效源码
  20. android购物车代码简述,Android实现简单购物车功能

热门文章

  1. ef entity转json引起的Self referencing loop
  2. studio-引入外来包
  3. 【原】移动web动画设计的一点心得——css3实现跑步
  4. 计算机视觉开源库OpenCV之利用开操作(Opening Operation)修复受损照片方法
  5. 2019世界机器人大赛总决赛在河北保定开赛
  6. Linux源代码编译安装详解
  7. 零基础Python学习路线图,小白的进阶之路!
  8. 使用Elasticsearch+filebeat+logstach+kibana构建日志服务平台
  9. python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解
  10. mysql concat 去掉重复_mysql - concat字段具有共同的重复密钥,并删除那些重复项,从而留下一个 - 堆栈内存溢出...