我需要创建一个数据传输对象,用于存储从数据库检索出的记录。在此数据传输对象中,我需要声明一个数字字段。对于这个字段,哪个更好 - int 还是 Integer?
如果我将字段定义为 Integer,那么如果我要从数据库检索超过 2000 条记录,是否会因为 'Integer' 类型而有任何性能影响!?
提前致谢。
我需要创建一个数据传输对象,用于存储从数据库检索出的记录。在此数据传输对象中,我需要声明一个数字字段。对于这个字段,哪个更好 - int 还是 Integer?
如果我将字段定义为 Integer,那么如果我要从数据库检索超过 2000 条记录,是否会因为 'Integer' 类型而有任何性能影响!?
提前致谢。
Integer
是一个更好的选择,因为它可以处理null
;对于int
,如果使用resultSet.getInt(..)
,null
会在不知不觉中变成0
。否则,它可能会抛出一些异常,比如“无法将null
设置为原始属性”。
性能在这里并不重要。
int
,您最终将添加额外的处理代码; 这不会给您带来太多好处。您的代码将不会清晰明了,有很多样板代码,而且您甚至不会获得性能提升。null
和零不同。有时候,您会输入0
,而本意是想输入null
。想象一下用户提交表单,没有为int
提供任何值的情况。你最终会默认得到0
。当该字段在数据库中不是not null
时,这是有意义的,或者说真的有意义吗。在做决策时,应该基于对象需要完成的任务来选择,而不是性能成本。只有通过分析工具(profiler)检测到速度问题后,才应该以性能为基础作出决策。
比较两者的特点并根据需要做出决策,例如:
Integer
可以为 null
,但 int
不行。那么数据库中的 int
字段是一个 Nullable
字段吗?Integer
类方法?个人而言,我总是更喜欢使用原始类型,而非包装类。但这只是一种偏好,而非基于技术优势做出的决策。
在我看来,将某个变量声明为int或Integer的选择仅仅取决于它是否允许为null。自动装箱和拆箱会处理任何需要将数字强制转换为一个特定类型的情况。在几乎所有情况下,性能也不太可能有明显的差异。
此外,int应该是自然的选择,并且如果性能成为问题,那么很可能是最高效的选择。如果您需要能够存储null值,则必须使用Integer(并确保不要将空引用自动拆箱为只接受int的方法,否则将导致NullPointerException)。
Integer
理论上比int
慢,但是除非你在进行大量计算,否则性能影响应该很小。此外,JIT优化将减少性能损失。
根据原始类型或引用类型的情况,选择更适合您情况的一个。
int 比 integer 快 10 倍
我们使用 jetm 性能库对此代码进行测试
int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
Integer t = 0;
t = 10;
t = 11;
}
point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
int t = 0;
t = 10;
t = 11;
}
point.collect();
etmMonitor.render(new SimpleTextRenderer());
以下是结果:
测试:对象 10.184
测试:基元 1.151
整数循环:0.0018秒,int循环:0.0020秒
。可能大部分循环中发生的事情都被优化掉了。 - Liiint
是 Java 最常用的计算类型。除了原始数组,Integer
在所有集合形式中都被使用。
大量使用临时 Integer
会导致垃圾收集器负荷过重,并在后台使用无法进行性能分析的 CPU,从而导致整体减速。每秒垃圾回收的临时对象过多会导致 CG 进入紧急“我需要现在释放内存”的模式,这可能会导致延迟关键型应用(如实时交互式图形、物理设备控制器或通信)出现停顿。
对我来说,如果有很多嵌套调用,不涉及数学计算但却访问了许多集合(例如使用映射的键),我会使用 Integer
,以避免传递参数时自动装箱过多。
如果操作是数学密集型或用作循环计数器或其他面向数学的操作,并且不存储在集合中(除了原始数组),我则使用原始数据类型。对于除了字符串之外的所有原始数据类型也是如此,因为字符串是一个完整的对象。
我猜这取决于你用什么来访问数据库。使用普通的JDBC,你可以使用int
,而ORM可能会将它们悄悄地转换为Integers
。而Integer则允许你处理nulls。
int
无法使用 toString
或 (String)
转换为 String
。
Integer
可以使用 toString
或 (String)
转换为 String
,并且可以处理 null
。
String.valueOf(int)
将 int
转换为 String
。正如@Adeel的答案所指出的那样,能够处理 'null' 是这里唯一的优势。 - Marcelonull
值,那么使用Integer
是最好的选择,但如果您想比较整数,则int可能更好。在下面的示例中,我使用整数c=1000和d=1000进行比较,返回false,但在int的情况下,它们将返回true。public class IntegerCompare {
public static void main(String[] args) {
int a = 1000;
int b = 1000;
Integer c = 1000;
Integer d = 1000;
if (a == b) {
System.out.println("int Value Equals");
}
if (c == d) {
System.out.println("Integer value Equals");
} else {
System.out.println("Integer Value Not Equals");
}
}
}