Java规范备忘录
一些非常私人的备忘录,并没有打算与他人分享。
原始类型
-
- 数値型にunsignedはない
- NaNや +0.0 と -0.0 の比較のため、浮動小数点は == じゃなくて Double.compare を使う
继承
继承的例子:
interface Foo {
void bar();
}
class Foo extends Bar implements Foo {
...
}
多重继承
- C++と違ってクラスの複数継承はできない
运算符
- C++と違ってoperator overloadingはできない
重写equals方法
-
- 以下の規則を満たすように実装する:
反射的 (reflexive): x.equals(x) は true
対称的 (symmetric): y.equals(x) が true の場合のみ、x.equals(y) も true
推移的 (transitive): x.equals(y) 、y.equals(z) が true ならば、x.equals(z) も true
整合的 (consistent): 情報が変更されなければ、x.equals(y) の結果は不変
hashCodeもオーバーライドする
最后, 最终, 定稿
最终
-
- クラス: 継承できる
-
- メソッド: オーバーライドできない
- 変数: 変更できない
最后
-
- return, continue, breakや例外など、通常は何をやってもfinallyは実行される
スレッドやVMが突然死んだ場合は実行されない
System#exit や Runtime#exit でも実行されない
完成
-
- JVMがオブジェクトをGCする前に走らせるメソッド
- Java 9でdeprecatedなので覚えておく必要はない
修飾子
摘要
-
- クラス: abstractメソッドを持つ。instantiateできない。
-
- インターフェース: 全てのinterfaceは非明示的にabstractになっているので、abstractは書かなくてもよい
- メソッド: 定義を持たないメソッド。クラスもabstractでないといけない。
受保护的 hù de)
-
- メソッド、変数にのみ付与可能
- 同一クラス、サブクラスから参照できる
私密的
-
- コンストラクタをprivateにするとそのクラス外でクラスをinstantiateできなくなる。
Factory Method パターンでstatic publicメソッドからのみ作るのに使われる。
継承は不可能になる
静态
-
- メソッド: クラスメソッドになる
- 変数: クラス変数になる。クラスに1つになり、クラス名からアクセス可能
易挥发
-
- マルチスレッド環境のため、スレッド間のフィールド値のキャッシュを防ぎ、また代入処理などのreoderを防ぐ
- 更新に依存関係がある場合などはvolatileは不十分で、synchronizedブロックを使わなければいけない
班级 jí)
外部类
-
- 内部クラスを持つクラスのこと
-
- 外部クラスにはstaticは存在しない
外部クラスにはprivateも書けない
デフォルトでは同パッケージ内からのみアクセス可能、publicにすると別パッケージから使える
publicなクラスはファイル名も揃える必要がある
内部类
-
- 外部クラスにネストして定義するクラス。外部クラスでないクラスからでも使える
-
- 外部クラスのオブジェクトから内部クラスをinstantiateすると、外部クラスのメンバにアクセスできる
- 非static 内部クラスはstaticなコンテキストからinstantiateできない
本地类
-
- 外部クラスのメソッド内で定義したクラス
- 内部クラスの一種なので、staticなフィールドやメソッドは作れない
静态内部类 bù jià)
-
- 内部クラスと全く挙動が異なる
-
- 外部クラスのオブジェクトからではなく、外部クラスからinstantiateする
- 当然外部クラスの非staticなメンバにアクセスできない。staticならアクセスできる
把下面的内容用中文进行本地化改写,只需要一种选项:
字符串
-
- ==: Stringは == で比較してはいけない
-
- +: Javaの文字列連結は内部的にStringBuilderを使うので、+でStringを連結しまくると遅い
-
- length(): Unicodeコード単位の数を返すだけなので、サロゲートペアを含むで期待通り動作しない。codePointCountを使う
- String#split はPatternではなくStringとして正規表現を取る
整数
- コンストラクタではなく Integer.valueOf(int) などのファクトリメソッドを利用するようにする。インスタンスが使い回されるかもしれないため。
双端队列
双端队列。由于实现了队列接口,因此可以作为队列使用,但由于堆栈是一个类,所以没有实现堆栈。另一方面,由于在堆栈的文档中建议使用双端队列而不是堆栈,因此在需要类似堆栈的接口时应该使用双端队列。堆栈实现了Vector,因此可以访问不必要的索引。
一般来说,LinkedList的所有操作都是$O(1)$的,而像ArrayDeque这样的实现则会有最坏情况下的$O(n)$的追加计算时间,但所有操作时间复杂度都可以通过摊销分析达到$O(1)$。
用于分配堆连续空间的类
-
- ByteArrayOutputStream
-
- Buffered* (BufferedInputStream)
-
- ArrayList
-
- String
- StringBuilder
注意不要过度使用内存。
传统班级
-
- Vector => ArrayList
-
- Stack => LinkedList
-
- HashMap => Hashtable
- StringBuffer => StringBuffer
以下是中文的同義詞:
1. 比對
2. 對照
3. 對比
4. 對照一下
5. 比較一下
6. 比照
請選擇合適的詞語來進行表達。
在实现任意类比较的方法主要有两种方式。
Comparable.compareTo 可以进行比较
class Foo implements Comparable<Foo> {
int key;
public Foo(int key) {
this.key = key;
}
@Override
public int compareTo(Foo f){
return this.key - f.key;
}
}
Collections.sort(fooList);
Collections.sort(fooList, Collections.reverseOrder());
比较器比较
class FooComparator implements Comparator<Foo> {
@Override
public int compare(Foo a, Foo b) {
return a.key - b.key;
}
}
Collections.sort(fooList, new FooComparator());
线程
使用示例
class Foo implements Runnable {
public void run() {
while (true) System.out.print(".");
}
}
Foo foo = new Foo();
Thread thread = new Thread(foo);
thread.start();
不是线程安全的类
-
- SimpleDateFormat
- …
在同时访问时需要使用synchronized等处理
以下是中文的释义选项:
1. 参考
2. 引用
3. 观照
4. 照着做
在参考中有以下类型:
-
- Strong: 普通の参照
-
- Weak: String referenceがなくなるとGCされる参照
-
- Soft: Weakと違い必ず消えるとは限らず、本当にメモリが必要な場合のみ消される。GCはOutOfMemoryErrorになる前にこれはクリーンアップする必要がある
- Phantom: finalizeを自分でスケジューリングするために使う https://qiita.com/yoshi389111/items/66448f9a013eee4be035
泛型
-
- クラスもメソッドもジェネリックにできる
-
- Primitive Typeはパラメータにできない
? super Xxx や ? extends Xxx を書いて bounded type parameter を定義できる
Parameter Typeはinstantiateできない
staticなメソッドや変数にParameter Typeを利用できない
我还想调查其他事项。
-
- object reflection: Class.forName など
-
- class loader
- dependency injection