精华内容
下载资源
问答
  • java中char占用字节:1、java中内码中的char使用UTF16的方式编码,一个char占用两个字节;2、java中外码中char使用UTF8的方式编码,一个字符占用【1~6】个字节。在讨论这个问题之前,我们需要先区分unicode和UTF...

    java中char占用的字节:1、java中内码中的char使用UTF16的方式编码,一个char占用两个字节;2、java中外码中char使用UTF8的方式编码,一个字符占用【1~6】个字节。

    2976de01d91daf69a2f8e7064327b229.png

    在讨论这个问题之前,我们需要先区分unicode和UTF。unicode :统一的字符编号,仅仅提供字符与编号间映射。符号数量在不断增加,已超百万。详细:[https://zh.wikipedia.org/zh-cn/Unicode]

    UTF :unicode转换格式 (unicode transformation format) 。定义unicode中编号的编码方式。utf8和utf16便是其中两种实现方式。其中utf8为变长表示,长度可能时1~6个字节;utf16为变长表示,长度可能是2或4个字节。详细:UTF8 [https://zh.wikipedia.org/zh-cn/UTF-8] UTF16 [https://zh.wikipedia.org/zh-cn/UTF-16]

    接着,要分清内码(internal encoding)和外码(external encoding)。内码 :某种语言运行时,其char和string在内存中的编码方式。

    外码 :除了内码,皆是外码。

    要注意的是,源代码编译产生的目标代码文件(可执行文件或class文件)中的编码方式属于外码。

    先看一下内码

    JVM中内码采用UTF16。早期,UTF16采用固定长度2字节的方式编码,两个字节可以表示65536种符号(其实真正能表示要比这个少),足以表示当时unicode中所有字符。但是随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码。Java为应对这种情况,考虑到向前兼容的要求,Java用一对char来表示那些需要4字节的字符。所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。

    外码

    Java的class文件采用UTF8来存储字符,也就是说,class中字符占1~6个字节。

    Java序列化时,字符也采用UTF8编码,占1~6个字符。

    总结:java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。

    java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。

    UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。

    UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。

    EOF相关免费学习推荐:java基础教程

    展开全文
  • 在java中,char占用2个字节。Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。原因:Java编译器默认使用Unicode编码,因此2字节可以表示所有字符。相关推荐:《Java视频教程》1:“字节”是byte,...

    在java中,char占用2个字节。Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。原因:Java编译器默认使用Unicode编码,因此2字节可以表示所有字符。

    a742c964a062f11ea0d122fc1a9dcdc3.png

    相关推荐:《Java视频教程》

    1:“字节”是byte,“位”是bit ;

    2: 1 byte = 8 bit ;

    char在java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符。

    例子代码如下:public class Test {

    public static void main(String[] args) {

    String str= "中";

    char x ='中';

    byte[] bytes=null;

    byte[] bytes1=null;

    try {

    bytes = str.getBytes("utf-8");

    bytes1 = charToByte(x);

    } catch (UnsupportedEncodingException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    System.out.println("bytes 大小:"+bytes.length);

    System.out.println("bytes1大小:"+bytes1.length);

    }

    public static byte[] charToByte(char c) {

    byte[] b = new byte[2];

    b[0] = (byte) ((c & 0xFF00) >> 8);

    b[1] = (byte) (c & 0xFF);

    return b;

    }

    }

    运行结果:bytes 大小:3

    bytes1大小:2

    java是用unicode来表示字符,"中"这个中文字符的unicode就是2个字节。

    String.getBytes(encoding)方法是获取指定编码的byte数组表示,

    通常gbk/gb2312是2个字节,utf-8是3个字节。

    如果不指定encoding则取系统默认的encoding。

    更多相关编程知识,可访问:编程学习网站!!

    展开全文
  • 1场 景可能很多人对Java中最简单的Char类型根本不屑一顾,不就是一个字符吗?能玩出什么花来?真的是这样吗?真不一定,我见过的几个所谓的高工对char的理解可能都是在比较浅的水平。今天我就带大家从高工的角度思考...

    点击蓝色“程序员书单”关注我哟

    加个“星标”,每天带你看好文,读好书!

    393b4a4b67e591e8692e72798e721bba.png

    阅读文本大概需要 5 分钟。

    1

    场 景

    可能很多人对Java中最简单的Char类型根本不屑一顾,不就是一个字符吗?能玩出什么花来?真的是这样吗?真不一定,我见过的几个所谓的高工对char的理解可能都是在比较浅的水平。今天我就带大家从高工的角度思考这个简单的Java类型Char。抛出问题:char如何存UTF-8字符?

    2

    UTF-8的由来

    我们知道char是占两个字节的这个大家都知道,那UTF-8是什么呢?我们见得比较多,真正能说清楚的也不见得都能做到,在谈到UTF-8,我们不得不谈下Unicode,对于有些人来说Unicode可能稍微陌生点,但是说到ASCII码估计大家都知道。 

    简单说明下,我们知道计算机只能识别0和1,那么如何将我们这个世界中如此众多的文字呈现或者传播呢?美国人搞了个ASCII码就是一个将英文中的字母和一些特殊符号一共128种,使用7位二进制数字一一对应起来(说白了就是符号和7位二进制数的映射表)。 

    计算机中每八位二进制组成一个字节,它是计算机存储的最小单位。那么我们就可以用一个字节,最高为用0占位就完全足够标识英文中的任何字母了,这样就可以将英文在计算机中进行无压力的传播啦。(举个例子:字母“A”对应的二进制数为“01000001”即十进制的41)不错!这确实解决了美国的问题,可是世界上那么多国家的不同文字字符,不全是英文字母啊,这怎么行呢? 

    诶?!于是Unicode诞生了,他将编号范围扩大为0x000000~0x10FFFF来将世界上绝大多数的字符一一映射起来了。(Unicode可以说是对ASCII的补充,它也是一个字符集)比如中文“马”字,对应的唯一的Unicode编号为U+9A6C(16进制的表示方式)。 

    注意Unicode只是规定了字符的编号,并没有说明以什么样的形式存储,你可以说直接将编号转换成二进制进行存储不就可以了吗?不错,这么做确实可以,但是会带来几个问题? 

    • 如何和ASCII码区分开来,计算机无法知道三个字节表示一个字符还是三个不同的字符?

    • 英文字符只需要一个字节就能表示完,如果Unicode统一说使用三个或者四个字节表示一个字符,那么对于英文字符存储空间造成很大的浪费

    所以,出现了很多中来实现Unicode编码方式,UTF-8就是其中一种,他是一种变长的编码方式,比如英文字符他只使用一个字节存储,按照不同的Unicode编号,将他们划成四个范围,分别对应使用一个、两个、三个、四个字节。

    而且编码规则简单,便于计算机判断当前多少个字节表示一个字符。比如检测到当前字节以0开头,那么当前字节就对应一个字符,如果开头是“1”,那么开头有多少个连续的“1”就表示当前这个字符占用多少个字节来存储。 

    以上,让我们知道了UTF-8其实就是Unicode字符集的一种编码方式,它可能会占用1~4个字节。

    3

    回归问题

    那么,回到最初的问题,char是两个字节的,那么怎么使用char类型存UTF-8编码的字符呢(可能会是3或者4个字节)?

    其实,我们可以定义一个char类型的数据赋值为'庆','庆'使用utf-8编码后为:e5ba86,不错是三个字节,三个字节怎么赋值给只占两个字节的char类型变量呢?可是事实是确实可以赋值的:

    char test = '庆';

    确实编译器没有报错,咋回事呢?这里就是大家的误区了。其实'庆'使用utf-16进行编码无论是大尾序utf-16BE(5E86)还是使用小尾序utf-16LE(865E)进行编码都是占用两个字节也就是一个字符的。

    所以,我们要了解一个事实就是JVM中对char是使用UTF-16编码的。使用UTF-16的好处是大部分字符都能以固定两个字节存储,但是这样的坏处就是对于英文字符存储就造成浪费,但是为了解决这个问题,Java9以后对字符串做了优化,对于字符串里面都是拉丁字母或者ASCII码中的字符,不使用UTF-16编码存储,而是使用byte存储,这样可以省一部分空间。

    4

    发散性思考

    emoji的表情"?"这个字符是占用几个字节呢,你可以这么赋值吗?
    char emoji = '?';
    发现编译器会报错的,我们换成下面的字符串的方式就没有问题了:
    String emoji = "?"System.out.println(emoji.length());// 输出 2

    这是为什么呢?感兴趣的读者可以去查下"?"这个表情的码点(Unicode中对应的值),使用UTF-16进行编码后看看有多少个字节,就知道为什么不能用char来存储了。

    总结:本文看起来简单,其实讲的细节也是蛮多的。需要读者的基础知识比较扎实,对Unicode字符集,utf-8、utf-16编码都有一定的了解。

    — 【 THE END 】—本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

    3T技术资源大放送!包括但不限于:Java、C/C++,Linux,Python,大数据,人工智能等等。在公众号内回复「1024」,即可免费获取!!

    6a96c800bb0ed743c2144730f64d106e.png

    展开全文
  • 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型。char与varchar的区别char (13)长度固定, 如'www.jb51.net' 存储...

    a53058bf143c91d97fe40d45c3f42bd0.png

    在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型。

    char与varchar的区别

    char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符

    varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13字符,

    小识备注

    char(10) 如果你存abc,需要空间为10,3个存abc,7个存空字符,因为char是固定长度

    varchar(10)如果你存abc,需要空间为4,3个存abc,1个存长度,varchar是可变长度

    超过10的部分,都会被截断

    从上面可以看得出来char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。所以实际应用中用户可以根据自己的数据类型来做。

    再看看char,与varchar在速度上的区别吧。

    代码如下:

    mysal>create tabe ab(v varchar(4),c char(4)); 
    query ok ,0 rows affected(0.02 sec)
    mysql>insert into abc values('ab ','ab ')
    query ok ,1 row affected(0.00 sec);
    mysql->select concat(v ,'+') ,concat(c ,'+') form abc
    ab + | ab+
    1rows in set (0.00 sec)

    从上面可以看出来,由于某种原因char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例。

    注明:

    在用char字符类型时内容后面有空间时必须作相关处理,要不就会把空格自动删除。

    建意:

    myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。

    memory存储引擎 目前都使用固定数据行存储,因此无论使用char varchar列都没关系,

    innodb 存储引擎 建意使用varchar 类型

    以下是其它网友的补充

    char是一种固定长度的类型,varchar则是一种可变长度的类型

    char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

    在MySQL中用来判断是否需要进行对据列类型转换的规则

    1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.

    2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.

    3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.

    例外:长度小于4个字符的char数据列不会被转换为varchar类型

    对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间

    对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利.

    文章2:

    字符应该是最常见的一种了,但似乎各个数据库都有所不同,比如oracle中就有啥varchar2之类。不过mysql似乎最多的还是集中在char和varchar上。

    说说区别。char是固定长度的,而varchar会根据具体的长度来使用存储空间。比如char(255)和varchar(255),在存储字符串"hello world"的时候,char会用一块255的空间放那个11个字符,而varchar就不会用255个,他先计算长度后只用11个再加上计算的到字符串长度信息,一般1-2个byte来,这样varchar在存储不确定长度的时候会大大减少存储空间。

    如此看来varchar比char聪明多了,那char有用武之地吗?还是很不少优势的。

    一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

    二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

    三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

    还有一个关于varchar的问题是,varchar他既然可以自动适应存储空间,那我varchar(8)和varchar(255)存储应该都是一样的,那每次表设计的时候往大的方向去好了,免得以后不够用麻烦。这个思路对吗?答案是否定的。mysql会把表信息放到内存中(查询第一次后,就缓存住了,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很大就会有问题。所以还是应该按需索取。

    总结:仔细看DZ的数据表,定长的字段基本还都是用char....

    更多Java学习资源请关注Java自学网公众号:

    7ded617814c3ebf9efde2529dd387f14.png

    展开全文
  • 指针变量占用多少字节

    千次阅读 2019-05-19 18:21:24
    我们讲过,指针变量根据“基类型”的不同有 int * 型,float * 型,double * 型,char * 型等 但是我们前面在讲数据类型...是不是基类型占用多少字节,该变量就占用多少字节呢?同样,用sizeof写一个程序看一下就知...
  • Java中char类型占用多少字节

    千次阅读 2020-03-09 15:34:35
    3 编码为GBK: String为英文字母所占字节长度:1 String为中文字母所占字节长度:2 String为英文字母(全角)所占字节长度:2 总结: java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是...
  • 32位 64位下 int double short boolean long 指针 char占用字节
  • 一个int类型占用多少字节

    千次阅读 2020-04-03 09:24:59
    在16位的PC机中,char类型占1个字节,int类型占2个字节,long int:4个字节,float占4个字节,double占8个字节字节是什么? 字节(Byte )是计算机用于计量存储容量的一种计量单位,一个字节通常8位长。 16位机...
  • 前言 本文中的储存分析以64位机器上的java为标准,其他主流语言也基本相通。 在分析储存空间大小前我们需要掌握基本知识: bit:位,是表示信息的最小单位,取值为0或1 ...占用字节 boolean 1 byte 1 ...
  • JAVA中的几种基本数据类型是什么,各自占用多少字节? byte占1个字节8位 char占2个字节16位 short占2个字节16位 int占4个字节32位 float占4个字节32位 long占8个字节64位, double占8个字节64位 ...
  • 如题如图,另:指针大小跟随系统 转载请注明出处:总有刁民想呀么想害朕 总有刁民想呀么想害朕
  • Java基础:char类型字节占用

    千次阅读 2018-12-24 17:14:43
    1. 前言 最近在研究InputStream、OutputStream和Reader、Writer这两大Java I/O输入输出抽象类。我们都知道对于InputStream、OutputStream是面向...在这其中我遇到了困惑,char类型到底是占用多少字节,因为在使用Inp...
  • 在Java中,-共有8种基本类型,其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。2、整型用于表示没有小数部分的数值,它允许是负数。在一般情况下,int ...
  • char:两个字节16bit short :两个字节16bit int:四个字节32bit long:八个字节64bit float:四个字节32bit double:八个字节64bit 这种数据类型代表一个比特的信息,但它的“大小”没有明确的定义。 基本数据类型...
  • Java中boolean数据类型占用多少字节

    千次阅读 2018-03-21 01:24:09
    Java中boolean数据类型占用多少个字节 在Java中一共有八种数据类型,未精确定义字节(Boolean),1字节(byte),2字节(short,char),4字节(float,int),8字节(long,double): Boolean到底占多少字节? 参考 Stack ...
  • Java基本类型占用字节数:1字节: byte , boolean2字节: short , char4字节: int , float8字节: long , double 编码与中文:Unicode/GBK: 中文2字节UTF-8: 中文通常3字节,在拓展B区之后的是4字节综上,中文...
  • 作者:威威喵 原文链接:https://blog.csdn.net/smile_Running/article/details/87211916在 C 语言中1、char a[10] = {"China"} 中,这个 a 占用多少字节?答:占用 10 个字节。解析:上面代码对 a 做了赋值的操作,...
  • 1、char a[10] = {“China”} 中,这个 a 占用多少字节? 答:占用 10 个字节。 解析:上面代码对 a 做了赋值的操作, a[0]=‘C’ ,a[1]=‘h’ ,a[2]=‘i’ ,a[3]=‘n’ ,a[4]=‘a’ ,a[5]=’\0’,a[6]=’\0’...
  • char占用的是2个字节 16位,所以一个char类型的可以存储一个汉字。 整型: byte:1个字节 8位 -128~127 short :2个字节 16位 int :4个字节 32位 long:8个字节 64位 浮点型: float:4个字节 32 位 double ...
  • char 4、布尔型 boolean 二、八种基本数据类型 三、数据类型详细介绍 整型(byte、short、int、long) 虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。 byte ...
  • 所谓的占用字节数 就是申请内存的时候所占的空间大小byte1字节最小值是 -128(-2^7);最大值是 127(2^7-1);boolean 至少1字节这种类型只作为一种标志来记录 true/false 情况;short 2字节最小值是 -32768(-2^15);...
  • java中 int、char、long各占多少字节

    万次阅读 2018-06-04 23:22:36
    所谓的占用字节数 就是申请内存的时候所占的空间大小byte1字节最小值是 -128(-2^7);最大值是 127(2^7-1);boolean至少1字节这种类型只作为一种标志来记录 true/false 情况;short2字节最小值是 -32768(-2^...
  • 多少字节?答:占 5 个字节。System.out.println(Charset.defaultCharset());//获取ide默认编码类型String s = new String("China".getBytes());byte[] b = s.getBytes();System.out.println("" + b.le...
  • 所谓的占用字节数 就是申请内存的时候所占的空间大小 byte 1字节  最小值是 -128(-2^7); 最大值是 127(2^7-1); boolean 至少1字节  这种类型只作为一种标志来记录 true/false 情况; short 2字节  ...
  • 所谓的占用字节数 就是申请内存的时候所占的空间大小byte1字节最小值是 -128(-2^7);最大值是 127(2^7-1);boolean 至少1字节这种类型只作为一种标志来记录 true/false 情况;short 2字节最小值是 -32768(-2^15);...
  • 变量有多少字节? C/C++语言中,表示整数和浮点数有好多种数据类型。在32位平台中,每种类型在内存中占用的字节数各不相同: char: 1 Byte int: 4 Byte long: 4 Byte long long: 8 Byte __int128: 16 Byte (前面两个...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 320
精华内容 128
关键字:

char占用多少字节