【问题标题】:What is the purpose of long, double, byte, char in Java?Java中long,double,byte,char的目的是什么?
【发布时间】:2010-09-29 18:40:20
【问题描述】:

所以我正在学习java,我有一个问题。似乎intbooleanstring 类型对于我在变量方面所需要的几乎所有东西都有好处,除非当数字中需要十进制数字时可以使用float

我的问题是,longdoublebytechar 等其他类型是否曾经在日常编程中使用过?这些可以用于哪些实际的事情?他们存在是为了什么?

【问题讨论】:

  • 我想知道为什么这个问题被否决了?这似乎是一个合理的问题,但对谷歌来说并不一定是一件容易的事情。

标签: java variables types language-features


【解决方案1】:

除了“短”可能是个例外,这可以说有点浪费空间——有时从字面上看,它们都是课程的马:

  • 当您不需要小数并且没有理由使用其他任何东西时,请使用 int;在大多数处理器/操作系统配置上,这是机器可以最有效地处理的数字大小;
  • 当您需要小数并且没有理由使用其他任何东西时,请使用 double
  • 当您想要表示一个字符时使用 char(或者在极少数情况下您需要两字节无符号算术);
  • 如果您特别需要操作 有符号 字节(很少见!),或者当您需要在 中移动时,请使用 byte > 字节;
  • 当您需要一个简单的“是/否”标志时,请使用 布尔值
  • long 用于需要整数但量级可能超过 20 亿的情况(文件大小、以毫秒/纳秒为单位的时间测量、用于压缩多个数据转换为单个数字);
  • 在极少数情况下使用 float,您可以 (a) 存储 大量 它们并且值得节省内存,或者 (b) 正在执行大量的计算,并且可以承受准确性的损失。对于大多数应用程序,“float”提供的精度非常差,但操作速度可能快两倍——不过,值得在您的处理器上进行测试,以发现它确实如此! [*]
  • 如果您确实需要 2 字节有符号算术,请使用 short。没有那么多案例……

[*] 例如,在 Hotspot on Pentium 架构中,float and double operations generally take exactly the same time,除法除外。

除非您真正了解这些类型的内存使用情况,否则不要太纠结于这些类型的内存使用情况。例如:

  • Hotspot 中每个对象大小都舍入到 16 个字节,因此具有单字节字段的对象将与具有长或双字段的单个对象占用完全相同的空间;
  • 将参数传递给方法时,每种类型在堆栈上占用 4 或 8 个字节:您不会通过将方法参数从 int 更改为 short 来保存任何内容! (我见过人们这样做...)

显然,有某些 API 调用(例如,对非 CPU 密集型任务的各种调用,由于某种原因需要浮点数),您只需将其要求的类型传递给它...!

请注意,String 不是原始类型,因此它并不真正属于此列表。

【讨论】:

  • 请注意,如果您使用的所有字符都在 Unicode 的基本多语言平面 (BMP) 内,则 char 仅表示一个字符。离开 BMP 后,Java 中的字符处理非常很时髦。如果您只处理西方语言,则不一定需要关心,但您应该意识到这一点。
  • 参见例如这个问题和答案的解释:stackoverflow.com/questions/2533097/java-unicode-encoding
  • 我能想到的byteshort 原语的唯一优点是编译器允许它们直接存储byte[]short[] 数组,但不允许int无需类型转换即可存储。还有其他优势吗?
  • (或者可能需要两字节无符号算术的极少数情况)什么?
【解决方案2】:

java int 是 32 位,而 long 是 64 位,所以当你需要表示大于 2^31 的整数时,long 是你的朋友。 long 的典型使用示例见 System.currentTimeMillis()

一个字节是 8 位,是大多数现代硬件上最小的可寻址实体,因此在从文件中读取二进制数据时需要它。

double 的大小是 float 的两倍,因此您通常会使用 double 而不是 float,除非您对大小或速度有一些限制并且 float 有足够的容量。

short 是两个字节,16 位。在我看来,这是最不需要的数据类型,我还没有在实际代码中真正看到过,但同样,它可能对读取二进制文件格式或执行低级网络协议很有用。例如 ip 端口号是 16 位的。

Char 表示单个字符,为 16 位。这与 short 大小相同,但 short 是有符号的(-32768 到 32767),而 char 是无符号的(0 到 65535)。 (这意味着一个 ip 端口号可能更正确地表示为一个字符而不是一个短字符,但这似乎超出了字符的预期范围......)

有关这些细节的真正权威来源,请参阅java language specification

【讨论】:

  • 整个 short 被签名和 char 未被签名的事情真的让我很烦恼。请Java先生,把我的“无符号”修饰符还给我! :-)
  • Brian:我更喜欢字节、短和字符非数字。最好也有 int 和 long 非数字,具有合理的任意大小的数字有理整数。
  • 短类型的一个用例是数组。如果您需要在内存中处理大量数字,并且知道它们都适合 16 位,则可以使用 short[] 而不是 int[] 节省 50% 的 RAM。 crazysquirrel.com/computing/java/speed_and_memory/…
【解决方案3】:

您可以查看here 了解 Java 中的原始类型。

这些类型之间的主要兴趣是内存使用情况。例如,int 使用 32 位,而 byte 仅使用 8 位。

假设您处理大型结构(数组、矩阵...),那么您将更好地处理所使用的类型以减少内存使用量。

【讨论】:

    【解决方案4】:

    我想这种类型有几个目的:

    1) 它们强制限制可以存储在其中的变量的大小(和符号)。

    2) 它们可以使代码更加清晰(例如,如果您使用 char,那么任何阅读代码的人都知道您打算在其中存储什么)。

    3) 它们可以节省内存。如果你有一个大的数字数组,所有这些都是无符号的并且小于 256,你可以将它声明为一个字节数组,与声明一个整数数组相比,可以节省一些内存。

    4) 如果您需要存储的数字大于 2^32,则需要 long,对于非常大的浮点数,则需要 double。

    【讨论】:

    • 请修正关于大于 2^32 的数字需要双打的问题
    • 哎呀-对不起。现在修复了。
    • 对精确值更有用;幅度的事情不太重要。第(1)点应该是“导致溢出错误被隐藏”:)。
    【解决方案5】:

    原始数据类型是必需的,因为它们是每个复杂集合的基础。

    如果您只需要一个小整数(或其他),则使用 long、double、byte 等,这不会浪费您的堆空间。

    我知道,我们这个时代有足够的内存,但你不应该浪费它。

    我需要“小的”来进行数据库和流操作。

    【讨论】:

      【解决方案6】:

      整数一般应用于数字。
      双精度数是用于表示小数的基本数据类型。
      字符串 基本上可以保存任何数据类型,但使用 int 更容易,并且使用字符串(文本除外)会造成混淆。
      字符用于只希望保存一个字母的情况,尽管它们是基本上只是为了清楚起见。
      shorts、longs 和 floats 可能不是必需的,但如果您要创建一个大小为 1,00000 的数组,它只需要保存小于1000,那么你会想用短裤,只是为了节省空间。

      【讨论】:

        【解决方案7】:

        它与您正在处理的数据有关。当您只处理少量数据时,使用保留大部分内存的数据类型是没有意义的。例如,许多数据类型在使用之前就保留了内存。以数组为例,即使您只使用其中的 4 个字节,它们也会保留一个默认数量(例如,256 个字节

        See this link为您解答

        【讨论】:

        • 我在问这个之前正在阅读它,但没有得到它,所以投票失败
        • 阵列的开销应该远没有那么大。更多,大约为 16 个字节。
        猜你喜欢
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 2021-08-22
        • 2016-10-30
        • 2020-09-22
        • 1970-01-01
        相关资源
        最近更新 更多