在Java中,长,双,字节,字符的目的是什么?

2022-08-31 22:39:57

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

我的问题是,其他类型,如,,等,是否曾经在正常的日常编程中使用过?这些可以用来做什么实际的事情?它们存在的目的是什么?longdoublebytechar


答案 1

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

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

[*]例如,在奔腾架构上的热点中,除除法外,float和双重操作通常需要完全相同的时间

不要太沉迷于这些类型的内存使用,除非你真正理解它。例如:

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

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

请注意,String 不是基元类型,因此它实际上不属于此列表。


答案 2

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

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

双精度型的大小是浮点数的两倍,因此您通常使用双倍数而不是浮点数,除非您对大小或速度有一些限制,并且浮点数具有足够的容量。

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

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

对于这些细节的真正权威来源,请看 java 语言规范