Java:字符串与字符串字节大小。

时间:2012-03-22 15:21:14

标签: java string char byte

大家好:我很惊讶地发现以下代码

System.out.println("Character size:"+Character.SIZE/8);
System.out.println("String size:"+"a".getBytes().length);

输出:

  

字符大小:2

     

字符串大小:1

我认为单个字符串应该占用与单个字符相同(或更多)的字节。

特别是我想知道---

如果我有一个包含多个字段的java bean,它的大小将根据字段的性质(字符,字符串,布尔值,向量等等)增加,我假设所有java对象都有一些(可能是最小的)足迹,并且这些足迹中最小的一个将是单个角色。所以..为了测试我从上面的代码开始的基本假设 - 并且print语句的结果似乎违反直觉。

默认情况下,java存储/序列化字符与字符串的方式的任何见解都非常有用......谢谢。

5 个答案:

答案 0 :(得分:10)

getBytes()使用默认编码输出String(最有可能是ISO-8859-1),而内部字符char始终为2个字节。内部Java总是使用带有2字节字符的char数组,如果您想了解有关编码的更多信息,请在问题注释中阅读Oded链接。

答案 1 :(得分:2)

我想说出我的想法,纠正我,如果我错了,但你发现字符串的长度是正确的,它显示为1,因为你在字符串中只有1个字符。长度表示长度而不是大小。长度和大小是两回事。

检查这个Link ..你发现错误方式占用的字节数

答案 2 :(得分:0)

好吧,你有char数组中的1个字符大小为2个字节,并且你的String包含1个字符长,而不是它有1个字节大小。

Java中的String对象包括:

private final char value[];
private final int offset;
private final int count;
private int hash;

只有这样才能确保String对象大于char数组。 如果您想了解有关对象大小的更多信息,您还可以阅读有关char数组的对象标题和多重性因子。例如herehere

答案 3 :(得分:0)

我想首先添加一些代码然后再解释一下:

import java.nio.charset.Charset;

public class Main {

    public static void main(String[] args) {
        System.out.println("Character size: " + Character.SIZE / 8);
        final byte[] bytes = "a".getBytes(Charset.forName("UTF-16"));
        System.out.println("String size: " + bytes.length);
        sprintByteAsHex(bytes[0]);
        sprintByteAsHex(bytes[1]);
        sprintByteAsHex(bytes[2]);
        sprintByteAsHex(bytes[3]);
    }

    static void sprintByteAsHex(byte b) {
        System.out.print((Integer.toHexString((b & 0xFF))));
    }
}

输出将是:

Character size: 2
String size: 4
feff061

所以你实际上缺少的是,你没有为 getBytes 方法提供任何参数。也许,你得到字符'a'的UTF-8表示的字节。

嗯,但是当我们要求UTF-16时,为什么我们得到4个字节?好吧,Java内部使用UTF-16,那么我们应该得到2个字节吗?

如果检查输出:

feff061

Java实际上向我们返回了一个BOM:https://en.wikipedia.org/wiki/Byte_order_mark

所以前两个字节:需要feff来表示后面的字节将是UTF-16 Big Endian。有关详细信息,请参阅维基百科页面。

剩余的2个字节:0061是您拥有的字符“a”的2字节表示。可以通过以下方式验证:http://www.fileformat.info/info/unicode/char/0061/index.htm

所以是的,Java中的一个字符是2个字节,但是当你要求没有特定编码的字节时,你可能并不总是得到2个字节,因为不同的编码对于各种字符需要不同的字节数。

答案 4 :(得分:-1)

Character的SIZE是char所需的存储空间,即16位。字符串的长度(也是底层char数组或字节数组的长度)是字符数(或字节数),而不是位数。

这就是为什么你的分区大小为8,但不是长度。长度需要乘以2。

另请注意,如果指定不同的编码,您将获得字节数组的其他长度。在这种情况下,在执行getBytes()时执行了对单个或不同大小编码的转换。

请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes(java.nio.charset.Charset