Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich möchte zwei Integer vom Typ int x1 und int x2 vergleichen. Normalerweise gibt es doch die equals() methode, aber eclipse sagt, die Methode gibt es bei primitiven Typen wie int nicht. Hat jemand eine Lösung?
Nein. == vergleicht die Referenz der beiden, also ob beide Variablen auf das selbe Objekt zeigen. Ich weiß zwar nicht, wie genau das bei primitiven Typen ist (ich denke, endweder gibt es einen Pool wie bei Strings, oder der Operator ist überladen), aber die werden so verglichen.
hier wird nicht das Objekt, sondern die Refernenz übergeben. Mit == würdest du also die referenzen prüfen. Um an die Attribute/Methoden zu gelangen, musst du erst dereferenzieren mit dem [c].[/c]
Java:
public void parse(IParseable parsableObject)
{
parseble./*hier wurde derefernziert und nun können wir hier weiterarbeiten*/toString();
}
== vergleicht quasi den exakten Inhalt der Variablen,
bei primiven Datentypen steht der Wert direkt drin (Speicherplatz 1 bis 8 Byte, boolean bis double)
bei Referenzen auf Objekte (immer 4 Byte) werden die beiden Referenzen verglichen, weil das eben die Werte direkt in den entsprechenden Variablen sind
weil primitive datentypen keine objekte sind vielleicht?? if (a=b) wird schonmal garnicht kompilieren, ausser a und b sind booleans.
wenn dir das nicht passt, arbeite doch allgemein mit wrapper . die kann man zwar, wenn nicht mit new instanziiert (autoboxing), auch referenziell vergleichen aber kannste wenn es dir spass macht auch equals nehmen
Inkonsistenz ist doch ein Zeichen von Schwäche oder Fahrlässigkeit oder beidem.
- Man wollte ums verr...... die C-Programmieren an Bord holen.
- Man wollte Performance erreichen - (Sorry, aber wenn ich performant sein will, programmiere ich sicher nicht auf einer VM! Auch dann nicht, wenn ich extrem wenig Memory habe!)
- Alles Käse: Man hat einfach nicht daran gedacht
Wenn ich auf einem gewissen abstrakten Niveau programmiere, will ich mich doch nicht mehr darum kümmern ob ich == oder .equals nehmen muss (Die Häufigkeit der Frage warum == bei Strings nicht funktioniert untermauert meine Einstellung - ebenso das Thema, dass == dummerweise manchmal eben doch das richtige Resultat liefert)
Warum gibt es überhaupt int und Konsorten? Die könnte man abschaffen (nein, bitte nicht mit Performance und Speicherbedarf kommen!)
ein Kriterium, welches du noch nicht genannt hast, ist einfacher lesbarer Code
> Warum gibt es überhaupt int und Konsorten?
es steht jedem frei, die primitiven Datentypen (nahezu) nicht zu verwenden,
stattdessen Integer bis BigDecimal oder komplett eigene entsprechende Klassen,
dann nur Methoden wie equals(), add() usw.
oft ist ja eher die Frage andersrum, warum man für Klassen nicht auch Operatoren wie + oder eben == neu definieren kann
ich weiß nicht, wo das problem ist. mit bisschen sprachverständnis weiß man doch genau, was zu tun ist. klar tappt da jeder anfänger erst mal in die falle - ging mir nicht anders.
ebenso das Thema, dass == dummerweise manchmal eben doch das richtige Resultat liefert)
das ist nicht "manchmal" so. wenn der referenzielle vergleich bei objekten true liefert, ist es ganz einfach ein und das selbe objekt im heap bzw. das selbe literal im pool. wenn man weiß warum das so ist, ist doch alles in butter
Wo ist das Problem damit, wenn es int und boolean nicht mehr gäbe? Mir fällt im Moment keine einzige relevante Einschränkung ein.
Und was Problem mit dem "du muss ja nicht, wenn ... " ist, dass Menschen dazu neigen den erst besten Weg zu gehen und nicht zu hinterfragen ob es auch wirklich der Beste ist. JEDE höhere Programmiersprache zwingt den Programmierer gewisse Regeln einzuhalten. C macht das zu viel wenig und Java in einigen Bereichen leider auch.
Das fehlende Operatoroverloading wurde mit Sicherheit begründet - mag ja sein, aber ich habe das noch nicht wirklich vermisst.
mit Autoboxing, was es noch gar nicht so lange gibt (ok, schon 6 Jahre oder so, aber gerademal die vorletzte große Version, weil Java ja kaum mehr Updates hat ), ist in der Tat auf die Schnelle kein großer Unterschied zu sehen,
wenn man die inneren Schmerzen der ständigen Umwandlung ausblenden kann
spontan fällt mir nur ein, dass Variablen, besonders Methodenparameter, null sein können,
manche würden sagen eine weitere Schwäche von Java
ohne Autoboxing mit beliebigen Klassen hätte man das Problem der schlechten Syntax,
so aber,wenn man jetzt noch weiterhin +, -, <, <= usw. einsetzt,
fällt es vielleicht schwer, ausgerechnet auf == zu verzichten und stattdessen equals() zu schreiben:
Java:
public class Test {
public static void main(String[] args) {
Integer a = 500;
Integer b = 500;
if (a <= b && a >= b) {
System.out.println("dann müsste a doch gleich b sein?");
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
}
edit:
selbst das elementare && in if und sonstigen Kontrollstrukturen setzt auf den primitiven Datentyp boolean auf