WOKs Java-Tipps

Eigene Machwerke...

Kostenlose Java-Tools mit "WOK-Gütesiegel"TM

WOKs Java-Tips (nicht nur) für Expäddn

Alle ausklappen Alle Antworten ausklappen oder Alle einklappen alle Antworten einklappen

Aus/Einklappen Was muss ich beim Wiederverwenden eines StringBuffer berücksichtigen (OutOfMemoryException durch Memory-Leak!)?
   StringBuffer sb = new StringBuffer(einGanzLangerString);
   sb.setLength(10); // nur 10 Zeichen aufheben
   String s = sb.toString(); // Inhalt in String speichern
   sb.append(nochEinLangerString);
Auch wenn das Wort "memory-leaks" hier nicht wirklich passt: aus Geschwindigkeitsgründen passieren hier zwei Dinge: 1.) wird der hinter dem StringBuffer stehende Puffer durch verkürzende Methoden nicht neu allokiert (sondern behält seine Größe) wobei der hintere Bereich halt nicht genutzt wird und 2.) teilen sich durch String s und StringBuffer sb sogenanntes "lazy-copy" zunächst diesen (viel zu großen Puffer!). Erst wenn der StringBuffer sb jetzt verändert wird, wird der Puffer wirklich kopiert. Nun hat aber der String eine evtl. sehr kurze Zeichenkette in einem riesigen Puffer stehen. So kann es durch ein Zusammenwirken von lazy-copy und Wiederverwenden von StringBuffers zu massivem verschwendetem Speicherplatz kommen.
Abhilfe würde hier statt einem sb.toString() besser ein:
   String s = new String(sb);
schaffen. Denn damit wird ein neuer String angelegt, der exakt den minimal benötigten Speicher für den momentan in sb gespeicherten String belegt.
Aus/Einklappen Wie verhindere ich den Aufruf von System.exit (z.B. beim Aufruf fremden Codes)?
  1. Von SecurityManager neue Klasse MySecMan ableiten und Methode checkExit() überschreiben (z.B. throw new SecurityException()).
  2. System.setSecurityManager(new MySecMan());
Aus/Einklappen Wie geht Suchen und Ersetzen innerhalb eines Strings mit regulären Ausdrücken?
  1. Alle Spezialzeichen ('\t') bekommen im Quellcode 2 Backslashes: \\t
  2. String neu = alt.replaceAll("([0-9\\,]*) DM", "$1 Euro");
  3. String neu = Pattern.compile(myRegExp).matcher(myString).replaceAll(myNewStuff);
  4. boolean stimmt = Pattern.compile(myRegExp).matcher(myString).matches();
  5. String[] fragmente = Pattern.compile(myRegExp).matcher(myString).split();
Aus/Einklappen Wie kann ich Ausgaben auf STDOUT abfangen (z.B. beim Aufrufen fremden Codes)?
  1. ByteArrayOutputStream b = new ByteArrayOutputStream();
  2. System.setOut(new PrintStream(b));
  3. // ... fremder Code...
  4. String theOutput = b.toString();
Aus/Einklappen Wie steuere ich einen horizontalen Scrollbar eines JScrollpanes?
JScrollpane.getVerticalScrollbar().setValue()
und mit einem AdjustmentListener kann man auf Veränderungen lauschen...
Aus/Einklappen Wie kann ich abprüfen, ob eine JCheckBox an oder aus ist?
boolean JCheckBox.isSelected();
Aus/Einklappen Wie bekomme ich eine Zufallsreihenfolge in eine Collection? Wie sortiere ich eine Liste? Wie kann ich eine binäre Suche durchführen?
Die Klasse java.util.Collections stellt viele statische Methoden für den Umgang mit Collections/Listen/Maps bereit.
static void shuffle(List l);
static void sort(List l);
static int binarySearch(List l, Object key);
Aus/Einklappen Wie kann ich ohne printf() Zahlen hübsch formatieren?
'#' = Ziffer, evtl. unsichtbar
'0' = Ziffer, wenn nicht gebraucht, dann '0'
  1. Mit Default-Local (DE)
    DecimalFormat df = new DecimalFormat("###.00");
    String result = df.format(3.14159265); // 3.14
  2. Mit bestimmter Locale
    DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(new Locale("de", "DE"));
    df.applyPattern("###.00");
    String result = df.format(3.14159265); // 3.14
Aus/Einklappen Wie bekomme ich eine eindeutige ID (so eine Art "Speicheradresse") für ein Objekt?
public static int System.identityHashCode(Object x)
liefert nach Kräften eine "unique" ID zu einem Objekt. Trotzdem ist wirkliche Eindeutigkeit laut JavaDoc nicht garantiert.
Aus/Einklappen Was genau macht eigentlich der Modulo-Operator (%) - Kann das Ergebnis von (x%y) auch negativ sein?
In Java: "JA, ES KANN!"
Der %-Operator ermittelt den Rest einer ganzzahligen Division. Also (7 % 3 == 1). Soweit klar. Was passiert aber, wenn einer der Operanden negativ wird? Ist dann das Ergebnis des %-Operators auch negativ?
Dafür gibt es zwei "Sichtweisen". Und diese stützen sich auf eine unterschiedliche Interpretation der ganzzahligen Division DIV ab.
Laut Donald Knuth ("The Art of Computer Programming") gilt: x DIV y = floor (x/y) mit floor(z) ist größte ganze Zahl <= z. Also z.B. floor (-4/3) = floor(-1.333) = -2
Laut Nicolaus Wirth ("Pascal Programmiersprache") gilt: x DIV y = trunc (x/y) mit trunc(z) ist z ohne Nachkommastellen. Also z.B. trunc(-4/3) = trunc (-1.333) = -1
Sind x und y positiv, so liefern die beiden dasselbe Ergebnis!

Da aber nach beiden Schulen (Knuth und Wirth) der Rest der ganzzahligen Division definiert wird durch:
x MOD y = x - ((x DIV y) * y) gilt:
nach Knuth: -4 MOD 3 = -4 - (-2 * 3) = -4 - (-6) = -4 + 6 = +2
nach Wirth: -4 MOD 3 = -4 - (-1 * 3) = -4 - (-3) = -4 + 3 = -1

Vorteil Knuth: Solange y>0 ist auch immer (x MOD y) > 0. Das ist eine wichtige Eigenschaft
Vorteil With: Die ganzzahlige Division ist hier symmetrisch: (-x) div y = x div (-y) = -(x div y) (nicht bei Knuth! Da gilt: (-x) div y = x div (-y) <> -(x div y)!).

Programmiersprachen mit Knuth-Modulo-Operator (-4%3==+2): z.B. perl
Programmiersprachen mit Wirth-Modulo-Operator (-4%3==-1): z.B. Pascal, Java, C#, C, C++

Valid HTML 4.01! Valid CSS!

[Zurück]