Versuchen Sie einfach, es so zu formulieren, wie es ist. Ich weiß nicht, ob es nützlich sein wird. Ich denke auch nicht, dass es unbedingt Java-spezifisch ist.
Sie können mehreren Variablen denselben Wert zuweisen.
int x, y;
x = y = 10;
System.out.println(x); // 10
System.out.println(y); // 10
Dies scheint wie folgt interpretiert zu werden. 10 wird y zugewiesen, aber in Java wird auch der Wert des Zuweisungsausdrucks zurückgegeben, was bedeutet, dass der gesamte Auswertungswert von "(y = 10)" x zugewiesen wird.
x = (y = 10);
Ich denke, dass die Hauptmethode im Allgemeinen wie folgt geschrieben ist.
public static void main(String[] args) {
System.out.println("Hello world!");
}
Wenn es sich um Java 5 oder höher handelt, können Sie wie folgt schreiben.
public static void main(String... args) {
System.out.println("Hello world!");
}
Der einzige Unterschied ist "String []" oder "String ...". Ersteres ist ein Array und letzteres ist ein Argument variabler Länge, aber die Hauptmethode scheint beides zu sein.
Sie können einen neuen Bereich mithilfe der if-Anweisung oder der for-Anweisung erstellen, aber Sie können auch einen einfachen Bereich ohne bedingte Verzweigung oder Schleife erstellen.
{
int x = 10;
System.out.println(x); // 10
}
{
int x = 100;
System.out.println(x); // 100
}
// System.out.println(x); //Kompilierungsfehler
x
wird zweimal definiert, verursacht jedoch keinen Kompilierungsfehler, da es einen anderen Bereich hat. Da der Gültigkeitsbereich von "x" nur der von der Klammer eingeschlossene Bereich ist, handelt es sich um einen Kompilierungsfehler, wenn Sie versuchen, außerhalb der Klammer auf "x" zu verweisen.
HashSet ist eine Klasse, die HashMap einfach als Implementierung umschließt. (* Dies ist eine detaillierte Implementierung, daher kann sie sich in Zukunft ändern.)
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
AbstractStringBuilder
Obwohl StringBuilder
und StringBuffer
in JavaDoc so geschrieben sind, als wären sie Unterklassen direkt unter der Object-Klasse, sind sie tatsächlich Unterklassen von AbstractStringBuilder
.
AbstractStringBuilder
ist ein privates Paket (keine öffentliche API) und darf nicht in JavaDoc geschrieben werden.
(* Dies ist eine detaillierte Implementierung, daher kann sie sich in Zukunft ändern.)
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
{
//Unterlassung
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{
//Unterlassung
Normalerweise erlaubt Ihnen Java nicht, eine Methode innerhalb einer Methode zu definieren. Sie können dies jedoch mit dem in Java 10 eingeführten var
tun. (Ich habe es in einem anderen Artikel geschrieben)
Main.java
public class Main {
public static void main(String[] args) {
// func.capitalize()Kann mit angerufen werden
//func ist eine lokale Variable und kann von außerhalb dieser Methode nicht aufgerufen werden
var func = new Object() {
private String capitalize(String s) {
return s.substring(0, 1).toUpperCase() + s.substring(1, s.length()).toLowerCase();
}
};
System.out.println(func.capitalize("tokyo")); // => Tokyo
System.out.println(func.capitalize("TOKYO")); // => Tokyo
}
}
Ich habe dies in einem anderen Artikel geschrieben, aber seit Java 11 können Sie die Quelldatei angeben und mit dem Befehl java
ausführen, ohne javac
zu verwenden. Dies kann für eine kleine Funktionsprüfung nützlich sein.
Nun, ich denke nicht, dass es wirklich ohne Kompilierung läuft, aber es kompiliert hinter den Kulissen.
In Java können Sie anonyme Klassen verwenden, um die Verarbeitung in vorhandene Methoden einzubetten.
List<String> list = new ArrayList<>() {
@Override
public boolean add(String s) {
System.out.println("add called. arg: " + s);
return super.add(s);
}
};
list.add("hello"); // add called. arg: hello
list.add("world"); // add called. arg: world
System.out.println(list); // [hello, world]
Sie können instanceof
für null
verwenden.
System.out.println(null instanceof Object); // false
Es ist natürlich, dass es nicht "wahr" sein wird, aber ich denke, der Punkt von Interesse ist, dass "NullPointerException" nicht ausgelöst werden kann. Das gleiche Ergebnis kann mit einer Variablen erzielt werden, der "null" zugewiesen ist, so dass es nicht erforderlich ist, "null" vor "instanceof" zu überprüfen.
null
to throw
Wenn eine Ausnahmetypvariable "null" enthält, löst "throw" unabhängig vom Variablentyp "NullPointerException" aus.
RuntimeException e = null;
throw e; // NullPointerException
null
Es macht nicht viel Sinn, aber ich kann vorerst keine Ausnahmen machen.
Object obj = null;
String str = (String)obj;
System.out.println(str); // null
Wenn Sie "instanceof" verwenden, ist dies auch dann "true", wenn der Instanztyp eine Unterklasse der angegebenen Klasse ist.
System.out.println("str" instanceof Object); // true
Wenn Sie für Unterklassen "false" festlegen möchten, können Sie die "Class" -Typen wie unten gezeigt mit "equals" vergleichen.
System.out.println(new Object().getClass().equals(Object.class)); // true
System.out.println("str".getClass().equals(Object.class)); // false
Ein Array ist mit einem Array eines Typs und einem Array einer Unterklasse dieses Typs kompatibel. Daher wird der folgende Code kompiliert und zur Laufzeit tritt ein Fehler auf.
Object[] array = new String[3];
array[0] = new Integer(10); // ArrayStoreException
Wenn es sich um eine Liste handelt, die Generika verwendet, tritt das oben genannte Problem nicht auf, da ein Kompilierungsfehler auftritt.
List<Object> list = new ArrayList<String>(); // incompatible types: ArrayList<String> cannot be converted to List<Object>
Wenn während eines Vorgangs ein Überlauf auftritt, ist das Ergebnis fehlerfrei. In der Klasse "Math" gibt es eine Dienstprogrammmethode, die beim Auftreten eines Überlaufs eine Ausnahme auslöst, sodass Sie den Überlauf erkennen können, indem Sie die Ausnahme abfangen.
System.out.println(Integer.MAX_VALUE + 1); // -2147483648
Math.addExact(Integer.MAX_VALUE, 1); // ArithmeticException: integer overflow
Nun, ich denke, ich sollte von Anfang an "BigInteger" verwenden.
Ich würde mich freuen, wenn es einen Artikel gibt, der als Referenz verwendet werden kann. Wenn Sie sich etwas anderes einfallen lassen, können Sie es hinzufügen oder auch nicht.
Recommended Posts