【发布时间】:2012-04-11 07:59:42
【问题描述】:
HashMap 内部有自己的静态最终变量供其工作。
static final int DEFAULT_INITIAL_CAPACITY = 16;
为什么他们不能使用byte 数据类型而不是使用int,因为值太小了。
【问题讨论】:
标签: java variables hashmap int byte
HashMap 内部有自己的静态最终变量供其工作。
static final int DEFAULT_INITIAL_CAPACITY = 16;
为什么他们不能使用byte 数据类型而不是使用int,因为值太小了。
【问题讨论】:
标签: java variables hashmap int byte
对变量和常量使用byte 或short 而不是int 是一种过早的优化,几乎没有效果。
JVM 的大多数算术和逻辑指令仅适用于 int、long、float 和 double,其他数据类型必须(通常)转换为 ints 才能使用这些指令对他们执行。
数字文字的默认类型是 int 用于整数,double 用于浮点数。因此,使用byte、short 和float 类型会导致一些细微的编程错误,并且通常会降低代码的可读性。
Java Puzzlers 书中的一个小例子:
public static void main(String[] args) {
for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++) {
if (b == 0x90)
System.out.print("Joy!");
}
}
这个程序不打印Joy!,因为十六进制值0x90被隐式提升为int,其值为144。由于 Java 中的bytes 是有符号的(这本身很不方便),变量b 永远不会分配给这个值(Byte.MAX_VALUE = 127),因此永远不会满足条件。
总而言之,内存占用量的减少实在是太小了(几乎没有),不足以证明这种微优化的合理性。通常,不同大小的显式数字类型不是必需的,并且适用于更高级别的编程。我个人认为,只有字节数组才能接受较小的数值类型。
【讨论】:
从byte 转换为 int(as it needs to be anint` 在任何情况下)都会使代码变慢(如果有的话)。在整体方案中,内存的成本是微不足道的。
鉴于默认值可以是任何int 值,我认为int 是有意义的。
【讨论】:
我认为这是因为Map 的容量以int 表示。当您尝试使用byte 和int 时,由于提升规则,字节无论如何都会转换为int。默认容量以int 表示,以避免那些不必要的促销。
【讨论】:
字节值在 JVM 中仍然占用相同的空间,并且还需要显式或隐式地将其转换为 int 以实现实际用途,包括数组大小、索引等。
【讨论】:
很多数据可以表示为一系列字节。
Int 是大多数用户在计算或处理整数时使用的默认数据类型。
使用 Byte 的问题是编译器无法识别它进行类型转换。
任何时候都尝试过
int variablename = bytevariable;
但它不会完成任务
double variablename = intVariable;
会起作用的。
【讨论】:
他们可以,但这将是一个微优化,并且权衡会降低可读性和可维护性代码(Premature optimization,有人吗?)。
这是一个静态最终变量,因此每个类加载器只分配一次。我想说我们可以节省这 3 个(我猜这里)字节。
【讨论】:
byte 的东西被声明为int,这是一个非常有效的问题。
byte 会节省任何内存。)
byte 没有被选中,而不仅仅是说“过早优化”并洗手。