在Java中,如果我有一个字符串x,我如何计算该字符串中的字节数?
当前回答
尝试使用apache commons:
String src = "Hello"; //This will work with any serialisable object
System.out.println(
"Object Size:" + SerializationUtils.serialize((Serializable) src).length)
其他回答
String实例在内存中分配一定数量的字节。也许您正在查看类似sizeof(“Hello World”)的东西,它将返回数据结构本身分配的字节数。
In Java, there's usually no need for a sizeof function, because we never allocate memory to store a data structure. We can have a look at the String.java file for a rough estimation, and we see some 'int', some references and a char[]. The Java language specification defines, that a char ranges from 0 to 65535, so two bytes are sufficient to keep a single char in memory. But a JVM does not have to store one char in 2 bytes, it only has to guarantee, that the implementation of char can hold values of the defines range.
sizeof在Java中没有任何意义。但是,假设我们有一个大的String并且一个char分配两个字节,那么String对象的内存占用至少是2 * str.length()字节。
根据如何在Java中转换字符串和UTF8字节数组:
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
如果你运行64位引用:
sizeof(string) =
8 + // object header used by the VM
8 + // 64-bit reference to char array (value)
8 + string.length() * 2 + // character array itself (object header + 16-bit chars)
4 + // offset integer
4 + // count integer
4 + // cached hash code
换句话说:
sizeof(string) = 36 + string.length() * 2
对于32位虚拟机或64位虚拟机,如果有压缩OOPs (-XX:+UseCompressedOops),则引用为4字节。所以总数是:
sizeof(string) = 32 + string.length() * 2
这没有考虑到对字符串对象的引用。
要避免try catch,请使用:
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
System.out.println(b.length);
有一个叫做getBytes()的方法。明智地使用它。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- Printf与std::字符串?
- 在Jar文件中运行类
- 带参数的可运行?
- 不区分大小写的“in”
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- 如何在PHP中截断字符串最接近于一定数量的字符?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作