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
广告
将在 10 秒后关闭
bannerAds