# valueOf() vs. toString() Verwendung???



## Sindbad1983 (18. Nov 2004)

gibt es einen Unterschied zwischen valueOf und toString ? wenn ja, welchen?

String s = String.valueOf( myDouble );
String s = Double.toString( myDouble );


----------



## Sindbad1983 (18. Nov 2004)

und ich hab gleich noch eine Frage:

wann weiß ich, ob die Methode toString() zu implementieren ist?
oft genügt auch nur:
System.out.println(...)-> sie ruft ja automatisch toString() auf oder?


----------



## bygones (18. Nov 2004)

hihi - wenn du dir den Code von String.valueOf(d) anschaust erklärt das die Frage:

```
return Double.toString(d);
```

zur zweiten Frage: println ruft immer die toString methode des Objekts auf. bei eigenen Objekten sollte man immer die toString überschreiben, um nicht im Wust des hashCode sich zu verlieren


----------



## Sindbad1983 (18. Nov 2004)

> println ruft immer die toString methode des Objekts auf. bei eigenen Objekten sollte man immer die toString überschreiben



was verstehst du unter eigenem Objekt?


----------



## Illuvatar (18. Nov 2004)

Er meint, wenn du selber eine Klasse schreibst.

Ein Beispiel:

```
public class Irgendwas
{
  public static void main (final String[] args)
  {
    System.out.println (new KlasseA("test"));
    System.out.println (new KlasseB("test"));
  }
}
class KlasseA
{
  private String s;
  public KlasseA (String str)
  {
    s = str;
  }
}
class KlasseB
{
  private String s;
  public KlasseB (String str)
  {
    s = str;
  }
  public String toString()
  {
    return "KlasseB: " + s;
  }
}
```

Ausgabe:


> KlasseA@18d107f
> KlasseB: test


----------



## Sindbad1983 (18. Nov 2004)

ok..super
danke..ich checks!
aber warum gibt er da so komische Zeichen aus?
KlasseA@18d107f 
was bedeuten die?


----------



## Sindbad1983 (18. Nov 2004)

danke nochmal für dein anschauliches Beispiel!!!


----------



## bygones (18. Nov 2004)

Sindbad1983 hat gesagt.:
			
		

> ok..super
> danke..ich checks!
> aber warum gibt er da so komische Zeichen aus?
> KlasseA@18d107f
> was bedeuten die?


das ist die default toString ausgabe der Klasse Object - da jedes Objekt in Java automatisch von dieser Klasse erbt nutzt jede Klasse die toString Methode von Object (wenn die Methode nicht in der Klasse überschrieben wird)...

die Ausgabe ist der Klassennamen und der Hashcode des Objekts....


----------



## Guest (18. Nov 2004)

deathbyaclown hat gesagt.:
			
		

> das ist die default toString ausgabe der Klasse Object - da jedes Objekt in Java automatisch von dieser Klasse erbt nutzt jede Klasse die toString Methode von Object (wenn die Methode nicht in der Klasse überschrieben wird)...
> 
> die Ausgabe ist der Klassennamen und der Hashcode des Objekts....



Jetzt müsste man nur noch wissen, was ein Hashcode ist.


----------



## Sky (19. Nov 2004)

Anonymous hat gesagt.:
			
		

> Jetzt müsste man nur noch wissen, was ein Hashcode ist.





			
				http://www.galileocomputing.de/openbook/javainsel2/java_060008.htm hat gesagt.:
			
		

> Die Methode hashCode() soll zu jedem Objekt eine möglichst eindeutige Integerzahl (sowohl positiv als auch negativ) liefern, die das Objekt identifiziert. Inhaltlich gleiche Objekte (gemäß der Methode equals()) müssen denselben Wert bekommen. Eine spezielle Funktion berechnet diesen Wert, der Hashcode oder Hash-Wert genannt wird. Die Funktionen, die solche Werte berechnen, nennen sich Hash-Funktionen.
> 
> Hashcodes werden verwendet, um Elemente in Hash-Tabellen zu speichern. Diese sind Datenstrukturen, die einen effizienten Zugriff auf ihre Elemente erlauben. Die Klassen java.util.HashMap oder java.util.Hashtable bieten eine solche Datenstruktur an.


----------



## Bleiglanz (19. Nov 2004)

Fehlt der Hinweis, dass der hashCode im Allgemeinen NICHT eindeutig ist bzw. sein kann (z.B. weil es viel weniger ints gibt als mögliche Strings 

Er dient im Collections API dazu, die Elemente in sog Buckets vorzusortieren, damit später der Zugriff schneller ist

er soll - da die Eindeutigkeit praktisch nie zu erreichen ist - eine möglichst "gute" Verteilung der Objekte in die Buckets erlauben

ein besseres Zitat wäre da wohl in der API zu finden


> # Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
> # If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
> # It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.


----------



## Sindbad1983 (19. Nov 2004)

Mann oh Mann...was ihr alles wisst!
Das macht mir irgendwie Angst!
Aber nun sind diesbezüglich die meisten Unklarheiten beseitigt!
Vielen Dank!


----------



## bygones (19. Nov 2004)

Sindbad1983 hat gesagt.:
			
		

> Mann oh Mann...was ihr alles wisst!
> Das macht mir irgendwie Angst!


jahrelanges schwitzen und programmieren bringen dir das auch bei  8)


----------



## Sindbad1983 (19. Nov 2004)

ja hast eh Recht!
Bin ja grad erst am Anfang! 
Übung macht den Meister!


----------

