Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中对象和字符串的大小_Java - Fatal编程技术网

Java中对象和字符串的大小

Java中对象和字符串的大小,java,Java,我试图找出有效的数据类型。 我知道int是4个字节,char是1个字节 包含五个整数(4*5=20字节)的对象 具有十个字符的字符串对象。(假设它有10个字符10*1=10字节) 我说得对吗? 您认为哪一个更好?关于Java中的chars,您是不正确的:因为它们被设计用于保存16位UNICODE代码点。最后,两种表示都将占用相同的内存量 您应该选择对您、类的设计者和代码的读者最有意义的数据类型。除非所需对象的数量可能会溢出可用内存,否则内存问题不应处于设计优先级的首位。即使这样,在优化之前也应该

我试图找出有效的数据类型。 我知道int是4个字节,char是1个字节

  • 包含五个整数(4*5=20字节)的对象
  • 具有十个字符的字符串对象。(假设它有10个字符10*1=10字节)
  • 我说得对吗?
    您认为哪一个更好?

    关于Java中的
    char
    s,您是不正确的:因为它们被设计用于保存16位UNICODE代码点。最后,两种表示都将占用相同的内存量


    您应该选择对您、类的设计者和代码的读者最有意义的数据类型。除非所需对象的数量可能会溢出可用内存,否则内存问题不应处于设计优先级的首位。即使这样,在优化之前也应该仔细地进行内存分析。

    字符大小为2字节。它们相当于无符号短字符,因此字符的值可以在[065535]之间(含[065535])

    字符串占用的字节数实际上是:

    string.length * 2
    
    因此,对于您的示例,一个10个字符的字符串占用20个字节,而不是10个字节

    这将是字符串内容。
    字符串
    类中还有其他变量,当然会占用更多字节。即使是空对象也会占用一定数量的字节,这些字节会根据JVM实现的不同而变化

    但是,仅字符内容将占用每个字符2个字节

    但不要担心这是最明显的过早优化。干净的代码通常比闪电般的代码更重要。选择合适的数据类型,编写易于理解和阅读的代码。这些事情更重要

    如果你担心在记忆中保持大串,考虑改变你的方法。我在大字符串中看到的最常见的问题是新程序员将整个文件读入内存


    如果要执行此操作,请尝试逐行处理数据。每次只在内存中保存所需的最小单位,执行处理,然后继续。首先,请给出客观答案:

    • 原始数据类型被记录下来
    • 字符串更为复杂,因为JVM可以对它们进行内部调用。看一个好的解释
    不那么客观的答案是:选择适合您的应用程序的最佳设计的数据结构


    如果应用程序中有特定的约束,请发布有关需要处理的数据和约束的更多详细信息。

    String不仅仅是一个字符数组,它是一个独立的对象,并且具有除其背景以外的字段
    char[]
    。例如,
    String
    有三个
    int
    字段:
    offset
    count
    hash
    。因此,空字符串通常是16字节(因为我们还需要考虑
    char[]
    字段)加上正常的8字节对象开销。还要注意的是,
    char[]
    本身就是一个对象,并且具有
    int
    字段
    length
    和相关的对象开销。一旦考虑了所有这些因素,就可以为每个字符添加两个(而不是一个!)字节

    因此,对于10个字符的字符串:

    • 3
      int
      字段:12字节
    • char[]
      字段:8字节
      • int
        字段:4字节
      • 对象开销:8字节
    • 10个字符:20个字节
    • 对象开销:8字节
    结果是大约60字节。我之所以说“关于”,是因为其中一些依赖于VM

    我知道int是4字节

    正确的

    char是一个字节

    字符是一个16位无符号整数,因此有2个字节

    包含五个整数(4*5=20字节)的对象

    对象的头在32位JVM上为12字节,在64位JVM上为16字节。对象是8字节对齐的,如果更改,可能是16或32字节对齐的

    这意味着新的int[5]
    使用16+20+4(填充)=40字节

    具有十个字符的字符串对象。(假设它有10个字符10*1=10字节)

    一个字符串使用~24个字节,带有标题和长度字段等,但它包装了一个char[],其中包含实际的char,这是另外一个16+20+4=40字节

    检查这一点的一个简单方法是使用以下命令。确保使用
    -XX:-UseTLAB
    ,这可以改进内存占用(但对于多线程编程来说速度较慢)

    印刷品

    Creating a String of 10 characters used 64 bytes of memory
    

    你是在为微型设备编写代码吗?同意@pstanton的说法。您应该选择反映所需语义的数据类型(即,如果您实际存储int,则使用整数数组)。不要过早地进行优化。字符串内置了太多内存优化…字符不是1字节。现在是2点。字节是1字节。“字符是1字节”。。。不,不是。然后你把它和一个
    String
    对象实际使用的内存量搞混了,这在很大程度上是完全无关的。+1用于提到实习生池。-1:这完全是错误的:“因此,对于你的例子,一个10个字符的字符串占用20个字节,而不是10个字节。”。事情要复杂得多。还有其他字段,还有与对象相关的其他开销,可能有一些填充,字符串可能被插入…请允许我更具体一些。仅字符串内容就占用了20个字节。正如我在之前的评论中所说的那样。我将把这个添加到我的答案中。现在,我已经更新了我的答案。现在是准确的。请在您方便的时候删除-1。+1用于提及到目前为止没有人提及的对象开销。不过,如果您能稍微谈谈“内存孔”即对象沿单词边界对齐,那就太好了
    Creating a String of 10 characters used 64 bytes of memory