Ich muss ein Datenübertragungsobjekt erstellen, das ich zum Speichern der aus der Datenbank abgerufenen Datensätze verwenden werde. In diesem Datenübertragungsobjekt muss ich ein numerisches Feld deklarieren. Für das was besser ist - int oder Integer
Wenn ich das Feld als Integer definiere, hat dies Auswirkungen auf den Typ "Integer", wenn ich mehr als 2000 Datensätze von der DB abrufe!
Danke im Voraus.
Integer
ist eine bessere Option, da es null
verarbeiten kann. für int
wird null
zu 0
, wenn resultSet.getInt(..)
verwendet wird. Andernfalls wird möglicherweise eine Ausnahme ausgelöst, z. B. "null
kann nicht auf eine primitive Eigenschaft festgelegt werden".
Leistung ist hier wenig von Belang.
int
wählen, fügen Sie am Ende zusätzlichen Code für die Handhabung hinzu. und das würde dir nicht viel nützen. Ihr Code wird nicht sauber und unkompliziert sein, viel Code für die Kesselplatte, und Sie würden nicht einmal an Leistung gewinnen.0
, wobei null
beabsichtigt war. Stellen Sie sich den Fall vor, in dem der Benutzer ein Formular gesendet hat, und liefert keinen Wert für int
. Am Ende erhalten Sie standardmäßig 0
. Es macht Sinn oder tut das wirklich, wenn das Feld not null
in der Datenbank ist.Sie sollten Ihre Entscheidung wirklich auf der Grundlage dessen, was Sie für Ihr Objekt tun müssen, und nicht aufgrund der Leistungskosten treffen. Die Entscheidung über die Leistung sollte getroffen werden, sobald ein Geschwindigkeitsproblem mit einem Profiler identifiziert wurde - der Wurzel allen Übels und all dem.
Sehen Sie sich einige der Funktionen beider an und verwenden Sie diese für Ihre Entscheidung, z.
Integer
kann null
sein, int
kann nicht. Ist also int
im FeldDBa Nullable
?Integer
?Ich persönlich entscheide mich immer für das Primitive über dem Wrapper. Aber das ist nur eine Vorzugssache und nicht auf einem technischen Wert.
Meiner Meinung nach hängt die Wahl zwischen der Deklaration von Int oder Integer lediglich davon ab, ob Null ein gültiger Wert ist oder nicht. Autoboxing (und Autounboxing) kümmert sich um alle Konvertierungsprobleme, bei denen die Anzahl einfach den einen oder anderen Typ haben muss. Die Performance wird (wie bereits erwähnt wurde) in fast allen Fällen unwahrscheinlich.
Außerdem sollte int die natürliche Wahl sein und ist wahrscheinlich die leistungsfähigste, sollte dies trotzdem ein Problem sein. Wenn Sie in der Lage sein müssen, NULL-Werte zu speichern, müssen Sie haben, um Integer zu verwenden (und sicherstellen, dass für eine Methode, die einfach Ints verwendet, keine NULL-Referenzen aufgehoben werden, da dies zu einer NullPointerException führt).
Integer
ist theoretisch langsamer als int
. Die Auswirkungen auf die Leistung sollten jedoch minimal sein, es sei denn, Sie zahlen die Zahlen. Auch JIT-Optimierungen reduzieren den Leistungsverlust.
Verwenden Sie diejenige, die in Bezug auf den primitiven Typ oder Referenztyp am besten zu Ihrer Situation passt.
int ist 10x schneller als eine ganze Zahl
wir testen diesen Code mit der Jetm Performance Library
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());
und die Ergebnisse:
test: objekte 10.184
test: primitives 1.151
Um Ihnen eine Idee zu geben, würde 2000 Integer Ihre Abfrage um etwa 0,5 ms erhöhen. Wenn Sie diese Daten serialisieren müssen, können Sie einiges mehr hinzufügen.
Die Korrektheit sollte jedoch an erster Stelle stehen. Es hat keinen Sinn, sehr schnell zu sein, aber falsch. Sie müssen Nullwerte berücksichtigen und wie Sie damit umgehen. (Wenn die Spalte NICHT NULL ist) Sie können Integer.MIN ___ VALUE oder ein long Feld anstelle von int verwenden und Long.MIN_VALUE für null verwenden. Obwohl es größer als int ist, wäre es immer noch viel kleiner und effizienter als Integer.
Ich denke, es hängt unter anderem davon ab, was Sie für den Zugriff auf die Datenbank verwenden. Mit einfachem alten JDBC könnten Sie int
s verwenden, während ein ORM sie ohnehin unbemerkt in Integers
konvertieren könnte. Und mit Integer können Sie mit nulls umgehen.
int wird von Java für die meisten Berechnungen verwendet. Integer wird in allen Kollektionsformen verwendet, außer bei primitiven Arrays.
verwenden Sie viele temporäre Integer-Werte, um den Garbage-Collector zu zerstören, und verwenden Sie im Hintergrund eine unprofilierbare CPU, die zu allgemeinen Verzögerungen bei allem führt. Wenn zu viele temporäre Dateien pro Sekunde verworfen werden, wechselt der CG in den Notfallmodus "Ich brauche jetzt Speicher", der zum Stillstand in für die Latenzzeit wichtigen Anwendungen führen kann (z. B. interaktive Echtzeitgrafik, physische Gerätesteuerung oder Kommunikation)
Wenn ich also viele verschachtelte Aufrufe habe, die keine Berechnungen durchführen, aber auf viele Sammlungen zugreifen, z. B. Schlüssel für Karten verwenden, verwende ich Integer, um massenweise automatisches Boxen zu vermeiden, wenn Argumente übergeben werden.
Wenn die Operationen mathematikintensiv sind oder als Schleifenzähler oder andere mathematikorientierte Operationen verwendet werden und nicht in Sammlungen (außer primitiven Arrays) gespeichert werden, verwende ich das Primitiv. Dasselbe gilt für alle anderen Grundelemente außer String, bei dem es sich um ein vollwertiges Objekt handelt.
Wenn Sie nach einem null
-Wert suchen möchten, ist Integer
am besten. Wenn Sie jedoch die ganze Zahl vergleichen möchten, ist int möglicherweise besser. Im folgenden Beispiel verwende ich die Ganzzahl c = 1000 und d = 1000 und vergleiche es mit false, aber im Fall von int geben sie true zurück.
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");
}
}
}
int
kann nicht mit String
oder (String)
in toString
umgewandelt werden.
Integer
kann mit String
oder (String)
in toString
umgewandelt werden und null
verarbeiten.
Ein abzudeckendes Szenario wäre die Validierung.
Stellen Sie sich vor, wir haben folgende Klasse:
class Foo{
@Min(value = 10)
int val;
}
Wenn der Benutzer in der Anforderung keinen Wert für val
angibt, wird eine böse NumberFormatException
ausgegeben.
Wenn int
durch Integer
ersetzt wird, können wir @NotNull
verwenden und dieses Problem eleganter lösen.