【问题标题】:Storing numbers in Strings. Is it resources waste?在字符串中存储数字。是不是资源浪费?
【发布时间】:2018-01-30 14:57:00
【问题描述】:

假设我有一个 String 类型的 ArrayList,它只存储数字。我在浪费资源吗? String 是比 int 大还是比短?我在任何地方都找不到字符串的大小,所以想出了一个让我感兴趣的愚蠢问题。

short 是存储 5 位数字最有效的数据类型吗?

【问题讨论】:

  • String 使用尽可能多的内存来存储每个字符。字符越多,它使用的内存就越多
  • 字符串只是不可变的char[]char 是 16 位,使用多少 chars 取决于编码,但是对于 2147483647 的最大 int 值,您需要 10 个字符,而这适合一个 32 位 int。更重要的是,为什么这是个问题?这似乎是代码异味。
  • short 根本不是存储 5 位数字的最佳类型。 Short.MAX_VALUE (2^15-1) 为 32767,不涵盖 0-99999 的全部范围。

标签: java types


【解决方案1】:

String 对象的大小非常灵活。 String 中的每个字符占用一个或两个字节,因此存储一个 5 位数字至少是 5 个字节。此外,String 对象还有一些开销。另一方面,一个 int 是 32 位的,只有 4 个字节。

一个更重要的问题是很难对存储为字符串的数字执行算术运算。您将必须实现加、减、乘和除的方法。使用int,您已经内置了运算符。

【讨论】:

  • 和 int 最多存储2,147,483,647的值
【解决方案2】:

在 Java 8 中,String 只是一个 char[] 的实习生,其中包含 String 中使用的所有字符。在这种情况下,32 位的int 大于 16 位的char

在 Java 9 中,String 使用 byte[] 而不是 char[]

现在由您来决定哪种类型更适合您使用。

【讨论】:

    【解决方案3】:

    String 和 Integer 是对象,int 是原始类型。所以对象会使用更多的内存,而原始类型则不会。 例如,如果您有一个原始类型:

    int i = 5; 
    

    例如在内存地址 10 中,值 5 将被保存,我知道地址 10

    但对于对象为:

    Integer i = new Integer(5):
    

    5 的值将保存在例如地址 2 中,地址 10(即 i 变量)将引用地址 2,这将占用更多内存。当创建一个新对象时,会创建一个由一系列连续块组成的复合内存块,每个实例变量一个块,这会占用更多内存。

    String 是一个对象,一个特殊的对象,但仍然是一个对象。它很特别,例如它不需要new

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2022-12-01
      • 2011-02-13
      相关资源
      最近更新 更多