在Java中,有人使用short或byte吗?

non*_*tor 32 java

除了在流媒体中使用(byte [])之外,我并没有真正看到字节和短片的使用情况.另一方面,我看到长期使用的实际值是| 100 | 和byte更合适.这是现在相对便宜的内存性质的结果,还是这只是开发人员不必担心的细节?

Sha*_*ean 34

在为内存或磁盘空间不足的嵌入式设备编程时使用它们.如电器和其他电子设备.

字节也用于低级Web编程,您可以使用标题等向Web服务器发送请求.

  • *“内存上**短**的设备”*——没有双关语。 (4认同)

Ste*_*n C 24

byte从一个文件或网络连接的原始数据处理的数据类型时,经常使用,但它主要是用来作为byte[].这些shortshort[]类型通常与GUI和图像处理(用于像素位置和图像大小)以及声音处理结合使用.

使用byte或使用short清晰度的主要原因.程序代码无条件地声明只使用8位或16位,并且当您意外使用更大的类型(没有适当的类型转换)时,您会收到编译错误.(不可否认,在编写代码时,这也可能被视为一种麻烦......但是,再次出现的类型转换标志着读者发生了截断这一事实.)

由于大多数Java实现在字边界上对齐堆栈变量和对象成员,因此不使用byte或使用short简单变量来实现任何空间节省int.但是,原始数组类型的处理方式不同; 的,即元素boolean,byte,charshort阵列是字节对齐的.但除非数组大小或数量大,否则它们对应用程序的总内存使用量没有任何重大贡献.

所以我想,开发人员不使用byteshort与你(一个C开发人员?)可能期望的主要原因是它确实没有太大(或通常是任何)差异.Java开发人员往往不迷恋过像老派的C语言开发的内存使用情况做了:-).

  • @ChrisHatton - 如果您担心内存使用和性能,那么"你的位"可能会浪费精力(或有害).严重的是,无向微观优化*通常是浪费精力.我已经提到了清晰度问题. (3认同)
  • 如果您试图关注内存使用情况,我认为 Java 会让您发疯。然而,作为一名 Java 开发人员,很高兴知道我正在“尽自己的一份力量”,因此我总是尽可能选择最简洁的类型。这不仅与内存使用有关,还与清晰度有关。 (2认同)

Pet*_*rey 14

在64位处理器中,寄存器都是64位,所以如果你的局部变量被分配给一个寄存器并且是一个布尔值,字节,短,char,int,float,double或long它不使用内存而且不是不保存任何资源.对象是8字节对齐的,因此它们总是占用内存中8字节的倍数.这意味着布尔,字节,短,字符,整数,长,浮点和双精度,AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference都使用相同数量的内存.

如上所述,短类型用于数组和读/写数据格式.即使这样短期也不经常使用恕我直言.

值得注意的是,GB在服务器上的成本约为80英镑,因此MB大约为8便士,KB大约为0.008便士.字节和长度之间的差异大约是0.00006便士.你的时间比这更值钱.esp如果你有一个因数据类型太小而导致的错误.


Awe*_*ter 9

Stephen C上面的回答是不正确的。(抱歉,我没有足够的声誉点来发表评论,所以我必须在这里发布答案)

他表示

“通过在简单变量中使用 byte 或 Short 而不是 int 并不能节省任何空间,因为大多数 Java 实现都会在字边界上对齐堆栈变量和对象成员”

这不是真的。以下是在Oracle JDK1.8.0上运行的,使用jol

public class CompareShorts {
    public static void main(String[] args) {
        System.out.println(VM.current().details());
        System.out.println(ClassLayout.parseInstance(new PersonalDetailA()).toPrintable());
        System.out.println(ClassLayout.parseInstance(new PersonalDetailB()).toPrintable());
    }
}
class PersonalDetailA {
     short height;
     byte color;
     byte gender;
}

class PersonalDetailB{
     int height;
     int color;
     int gender;
}
Run Code Online (Sandbox Code Playgroud)

输出:

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

com.hunterstudy.springstudy.PersonalDetailA object internals:
 OFFSET  SIZE    TYPE DESCRIPTION                               VALUE
      0     4         (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4         (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4         (object header)                           82 22 01 f8 (10000010 00100010 00000001 11111000) (-134143358)
     12     2   short PersonalDetailA.height                    0
     14     1    byte PersonalDetailA.color                     0
     15     1    byte PersonalDetailA.gender                    0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

com.hunterstudy.springstudy.PersonalDetailB object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e1 24 01 f8 (11100001 00100100 00000001 11111000) (-134142751)
     12     4    int PersonalDetailB.height                    0
     16     4    int PersonalDetailB.color                     0
     20     4    int PersonalDetailB.gender                    0
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
Run Code Online (Sandbox Code Playgroud)

如您所见,使用shorts和bytes的类实例占用16个字节,使用ints的类实例占用24个字节。所以它确实为每个类实例节省了八个字节的内存。


Luk*_*ard 7

bytes 和s的算术shortints 的算术更尴尬。例如,如果b1b2是两个byte变量,则不能编写byte b3 = b1 + b2将它们相加的代码。这是因为 Java 永远不会在任何小于 an 的内部进行算术运算,因此即使int表达式只添加两个值,它也b1 + b2具有类型。你必须改为写作。intbytebyte b3 = (byte) (b1 + b2)


McD*_*ell 5

在使用二进制格式和DataInput/DataOutput实例时,我经常使用shortbyte类型.如果规范说下一个值是8位或16位值并且没有推广它们的价值(也许它们是位标志),它们是一个明显的选择.int