JAVA编码格式和占据内存大小

本文深入探讨了Java中Unicode编码的使用,解释了字符在内存中的占用情况,并对比了GBK、UTF-8等编码格式的区别。同时,文章还讨论了ASCII与Unicode编码的范围,以及JVM中字符集的初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA编码格式和占据内存大小

Java语言使用的是Unicode字符集,每个字符在内存中占16位。
一个中文或英文字符的unicode编码都占2个字节。
在unicode中,一个字符就是两个字节
数据和存储空间的大小
1.bit就是位,也叫比特位,是计算机表示数据最小的单位
2.byte就是字节
3.1byte=8bit ,0001 1100,一般用两个16进制来显示,所以我们经常看到1个字节显示为 1c
1个字节就是8位
4.1byte就是1B
1B=1/1024KB 1M=1024KB
通常情况下:
–GBK GB2312 占据2个字节 1个字符2个字节
–UTF-8 3 个字节 1个字符3个字节
java的String使用的编码是Unicode。
将’中’字转为Unicode编码,结果是’\u4e2d’。
'\u’的就是使用了Unicode编码。后面加上十六进制代码来表示Unicode字符。

  1. Unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,只是一种一对一的映射而已。
  2. GBK、UTF-8是一种“编码格式”,是用来序列化或存储1中提到的那个“编号(数字)”的一种“格式”。
    java的String使用的编码是Unicode,当String存在于内存中时(在代码中用string类型的引用对它进行操作时),是"只有编码而没有编码格式的",所以java程序中的任何String对象,说它是gbk还是utf-8都是错的,String在内存中不需要“编码格式”, 它只是一个Unicode的字符串而已。
      当字符串需要在网络中传输或要被写入文件时,就需要使用编码格式了。乱码问题也因此出现。
    ASCII码和Unicode:
      ASCII码,和Unicode编码一样,也是一种"编码"。
      ASCII码的范围比较小,一共规定了128个字符的编码。
      Unicode编码是一个很大的集合,现在的规模可以容纳100多万个符号。就像它的名字都表示的,这是一种包含所有符号的编码。
    在JVM中defaultCharset()是在初始化阶段被调用, 且只会初始化一次, 首先会取file.encoding指定的字符集, 如果取不到则使用系统默认字符集(如: windows下为GBK), 然后通过
    取到的字符集名称(csn)去获取Charset对象, 如果能获取到则将其设为defaultCharset, 如果取不到则将defaultCharset设置为UTF-8字符集, defaultCharset一旦被初始化后, 在JVM之后的运行过程中
    就无法再进行更改, 比如在JVM启动后在程序中使用properties.setProperty(“file.encoding”,“UTF-8”);也不会改变defaultCharset的值~~~
    如果想指定defaultCharset的值, 则可以通过JVM启动参数(-Dfile.encoding=“UTF-8”)来显示的指定此JVM的字符集!!!
    Java编译器(即编译成class文件时) 用的是unicode。
    通过下面输出可以看到当前选用的编码方式:
    System.out.println(System.getProperty(“file.encoding”));
    System.out.println(System.getProperty(“sun.jnu.encoding”));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值