Skip to content

Instantly share code, notes, and snippets.

@bobbyjam99-zz
Last active August 29, 2015 13:57
Show Gist options
  • Save bobbyjam99-zz/9732922 to your computer and use it in GitHub Desktop.
Save bobbyjam99-zz/9732922 to your computer and use it in GitHub Desktop.
Upgrade to Java SE 7 Programmer [1Z0-805] 自分用勉強メモ。内容の整合性は担保しませんのでAPIなり書籍なりでご確認下さい。

1. 言語の拡張

switch文の条件式

switch文の条件式に記述できる

  • byte
  • short
  • int
  • enum
  • String

2進数の整数リテラル表記

  • 接頭辞として0bもしくは0Bを値の前につける。
  • 内部的にはint型として解釈。先頭ビットを富豪として扱うかどうかで値が変更になる場合、明示的にキャストしない限りコンパイルエラー。

数値リテラルのアンダースコア

  • リテラルの先頭と末尾には記述できない
  • 記号の前後には記述できない

2. デザインパターン

  • シングルトンパターン
  • コンポジション
  • DAOパターン
  • ファクトリパターン

3. JDBC

JDBCバージョンと規格

  • JDBC 2.0 : SQL92
  • JDBC 3.0 : SQL99
  • JDBC 4.0 : SQL:2003

JDBCドライバが最低限サポートしなければならないのはSQL92である。

JDBC 4.0から自動ロード機能が追加。DriverManager#getConnectionで取得可能。

JDBC 4.0からWarpperインタフェースが導入。JDBC APIによって隠蔽された独自機能を利用出来るようになる。

public interface Wrapper {

	// オブジェクトが引数で指定したインタフェースを実装していたり、ラッパーであったりする場合にtrue
	public boolean isWrapperFor(Class<?> iface);

    // 引数で指定されたインタフェースを実装するオブジェクトを戻す
    public <T> T unwrap(Class<T> iface);
}

SQLException

JDBC 4.0から例外が細分化された。

SQLException
	BatchUpdateException // バッチ更新中にエラーが発生した時にスローされる例外
    SQLClientInfoException // データベースとの接続を確立しようとした時に、クライアント情報を設定できずにスローされる例外
    SQLTransientException // 一時的な例外
    SQLNonTransientException // 一時的ではない例外
    SQLRecoverableException // 回復可能な例外

Statement/PreparedStatement

package java.sql;
public interface PreparedStatement {

	// 文字データをASCIIコードと解釈して格納
	public void setAsciiStream(int parameterIndex, InputStream x)

	// 文字データをASCIIコード以外で解釈して格納
	public void setCharactorStream(int parameterIndex, Reader reader)
}

自動コミットモードのコミットタイミング

  • DDLの場合は、実行直後
  • SELECT文の場合は、ResultSetが閉じられるとコミット
  • CallableStatementオブジェクトの場合は、ResultSetが閉じられ、すべての更新カウントと出力パラメータが取得されるとコミット
  • 自動コミットモードが変更されたとき

分離レベル

  • TRANSACTION_NONEはトランザクションそのものが対象データベースでサポートされていない

RowSet

RowSetはResultSetを継承して特徴を引き継ぎ、さらにJavaBeansコンポーネントとして扱えるようにしたインタフェース。

RowSetFactory factory = RowSetProvider.newFactory();
RowSet rowSet = factory.createJdbcRowSet(); // or RowSet rowSet = factory.createCachedRowSet();

RowSetの継承関係

RowSet
    CachedRowSet : メモリ内にデータをキャッシュ
        FilteredRowSet : キャッシュされているデータに対しフィルタ処理を提供するRowSet
        JoinRowSet : Joinのように結合されたRowSet
        WebRowSet : XMLフォーマットで読み書き出来るRowSet
    JdbcRowSet : JavaBeansコンポーネントとして扱うためのラッパー
  • デフォルトでは1つのStatementオブジェクトの結果を保持できるResultSetオブジェクトは1つだけ

4. 並列処理

  • オブジェクトの可変なステートをカプセル化しそのステートにアクセスするpublicメソッドを同期化することでステートにアクセスするスレッドが常に1つだけになることを保証するように設計されている。
  • イテレーション処理の開始後にコレクションの内容が変更されたことを検知した場合には、直ちに java.util.ConcurrentModificationException をスローします。
    • 例外を発生させないためにはsynchronizedでクライアントサイトロックをする必要がある
    • ただしパフォーマンス劣化やデッドロック等注意が必要

並行処理ユーティリティ(Concurrent Utilities)

  • スレッドプール
  • 並行コレクション
  • アトミック変数
  • カウンティングセマフォ
Lockインターフェイス
    ReentrantLockクラス
ReadWriteLockインターフェイス
    ReentrantReadWriteLockクラス
public interface ConcurrentMap {
    V putIfAbsent(K key, V value);
    boolean remove(Object key, Object value);
    V replace(K key, V value);
    boolean replace(K key, V oldValue, V newValue);
}

CopyOnWriteArrayList

  • 書き込みに対してコピーを作成するため java.util.ConcurrentModificationException は発生しない
  • 大量のデータ更新処理が発生するような場合にはCollections.synchronizedListメソッドを使用
package java.util.concurrent;
public class CopyOnWriteArrayList {
}

ThreadLocalRandom

java.util.Randomクラスをマルチスレッドアプリケーションで利用するとスレッド間の競合によってパフォーマンスが劣化する。その問題を解決するためにThreadLocalRandomが導入された。

package java.util.concurrent;
public class ThreadLocalRandom {
    public static ThreadLocalRandom current(){}
    public int nextInt(int least, int bound){}
    public long nextLong(long n){}
}

Executor

Runnable task = new MyTask();
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(task);
public class MyTask implements Runnable {
    public void run() {
        // do something.
    }
}
Executor
    ExecutorService
        AbstractExecutorService
            ThreadPoolExecutor
                ScheduledThreadPoolExecutor
            ForkJoinPool
        ScheduledExecutorService    
            ScheduledThreadPoolExecutor

Executors

public class Executors {
    // 可変サイズのスレッドプールを実装するExecutorServiceオブジェクトを返す
    static ExecutorService newCachedThreadPool() {}
    // 固定サイズのスレッドプールを実装するExecutorServiceオブジェクトを返す
    static ExecutorService newFixedThreadPool(int nThreads) {}
    // 指定された遅延時間後、または周期的にコマンドの実行をスケジュールできる、スレッドプールを作成
    static ExecutorService newScheduledThreadPool(int corePoolSize) {}
    // 単一のワーカースレッドを作成してタスクを逐次処理する
    static ExecutorService newSingleThreadPool() {}
}

ExecutorService

public interface ExecutorService {
    public boolean awaitTermination(long timeout, TimeUnit unit);
    public boolean isShutdown();
    public boolean isTerminated();
    public void shutdown();
    public List<Runnable> shutdownNow();
    public <T> Future<T> submit(Callable<T> task)
}

戻り値を返す、もしくはチェック例外をスローする場合、RunnableインターフェイスではなくCallableインターフェイスを使用する。Callableインタフェースのsubmitメソッドを実装する。

Fork/Joinフレームワーク

  • 分割統治法によって大きなタスクを分割し複数のCPUコアで同時並列的に実行することで全体のパフォーマンスを向上させることが出来る。
  • スレッド間におけるタスクキューの競合を減らすため、Work-stealingアルゴリズムを採用。

ForkJoinTask

ForkJoinTaskを実行するためのメソッド

void execute(ForkJoinTask<?> task) : 非同期タスクを実行する。実行結果は受け取らない。
<T> T invoke(ForkJoinTask<T> task) : タスクの実行が終了するまで待機し、処理結果を受け取る。
<T> ForkJoinTask<T> submit(ForkJoinTask<T> task) : 非同期でタスクを実行し、処理結果をタスクから受け取る
ForkJoinTask
    RecursiveTask : 戻り値が必要な場合
    RecursiveAction : 戻り値が必要ない場合

スレッドスタベーション(Thread starvation)

BlockingQueue

要素の格納および取り出しにおけるブロッキング機能をサポート。

ArrayBlockingQueue
DelayQueue
LinkedBlockingDeque
LinkedBlockingQueue
LinkedTransferQueue
PriorityBlockingQueue
SynchronousQueue

5. ローカライズ

Locale

Localeコンストラクタ

public Locale(String language) {}
public Locale(String language, String country) {}
public Locale(String language, string country, String variant) {}
Locale ja = new Locale("ja", "JP");
Locale fr = new Locale("fr", "CA");
Locale locale = Locale.getDefault(); // user.country, user.language, user.variant
  • ResourceBundleクラスのgetBundleメソッドで指定したリソースバンドルは「クラス」→「プロパティファイル」の順で検索。
  • ResourceBundleクラスのgetBundleメソッドで指定したリソースが見つからない場合、java.util.MissingResourceExceptionがスローされる。

NumberFormat

NumberFormatのインスタンスの取得方法

static NumberFormat getInstance()
static NumberFormat getInstance(Locale inLocale)
static NumberFormat getCurrencyInstance()
static NumberFormat getCurrencyInstance(Locale locale)

SimpleDateFormat

  • 書式パターン「M」「MM」を指定した場合には月が表示。「MMM」で指定された場合にはその月を洗わず文字列の省略形。4つ以上の「M」を指定した場合には省略形ではない完全な文字列。
  • 書式パターン「z」は一般的なタイムゾーン。「z」の指定が3文字以下の場合には省略形が表示。4文字以上の場合には完全系が表示。

6. JavaのファイルI/O(NIO.2)

java.io.Fileクラスの欠点

  • シンボリックリンクのようなUNIX系のファイルシステムに固有の機能を利用することは出来ない。
  • ディレクトリ内でファイルやサブディレクトリが作成/削除/変更されたといったようなイベントを監視するための仕組みがない。
  • ファイルサイズや最終更新日時のような基本的なファイル属性を取得することはできましたが、その他の詳細なファイル属性の取得や設定を行うためにはプラットフォーム固有のネイティブコードを利用する必要がありました。
  • Fileクラスの多くのメソッドにおいて、なんらかの理由で処理が失敗した場合でも適切な例外がスローされない

java.nio.file.FileSystemオブジェクトを返すファクトリメソッド

package java.nio.file;
public class FileSystems {
	public static FileSystem getDefault() {}
	public static FileSystem getFileSystem(URI uri) {}
	public static FileSystem getFileSystem(Path path, ClassLoader loader) {}
	public static FileSystem getFileSystem(URI uri, Map<String, ?> env) {}
	public static FileSystem getFileSystem(URI uri, Map<String, ?> env, ClassLoader loader) {}
}

Pathオブジェクトを取得する方法

package java.nio.file;
public class FileSystem {
	public Path getPath(String first, String... more) {}
}
package java.nio.file;
public class Paths {
	public static Path get(String first, String... more) {}
	public static Path get(URI uri) {}
}
Path path = Paths.get("c:\\x\\y\\z");
path.getRoot() // Result is c:\\
path.getName(0) // Result is x
path.getFileName() // Result is z
path.getNameCount() // Result is 3
path.subpath(1,2) // Result is y

normalize 現在のパスに含まれる冗長なパス表現を正規化したパスを返します。

Path path = Paths.get("C:\\home\\zaikin\\..\\..\\foo");
Path p = path.normalize(); // Result is C:\foo

resolveSibling 引数に渡されたパスが相対パスの場合には、現在のパスの親ディレクトリからのパスとして解決したパスを返します。相対パスの場合、もしくは引数に渡されるパスが絶対パスの場合には、このメソッドは引数に渡されたパスそのものを返すこと。

Path path = Paths.get(""C:\\home\\zaikin\\foo"");
Path p = path.resolveSibling("bar"); // Result is C:\home\zaikin\bar

relativize 渡されたパスを現在のパスからの相対パスとして解決したパスを返します。現在のパスからの相対パスとして解決出来ないパスが渡された場合には、 java.lang.IllegalArgumentException がスローされる。

Path p1 = Paths.get("home");
Path p2 = Paths.get("home/zaikin/foo");
Path p1_p2 = p1.relativize(p2); // Result is zaikin\foo
Path p2_p1 = p2.relativize(p1); // Result is ..\..

resolve 引数に渡されたパスを返します。相対パスの場合には2つのパスを結合したパスを返しますが、絶対パスの場合には、渡されたパスそのものを返します。また、渡されたパスが空の場合には自分自身を表すパスを返します。

Path p3 = Paths.get("C:\\home\\zaikin\\foo");
System.out.format("%s%n", p3.resolve("bar")); // Result is C:\home\zaikin\foo\bar
Path p4 = Paths.get("bar");
System.out.format("%s%n", p4.resolve("C:\\home\\zaikin\\foo")); // Result is C:\home\zaikin\foo

java.nio.file.StandardOpenOption

Filesクラスにおける書き込み用メソッドでStandardOpenOptionを指定しなかった場合、デフォルトでCREATE,TRUNCATE_EXSISTINGWRITEが指定されたものとして処理される(ファイルが存在しない場合には新規作成し、ファイルが存在するなら内容を上書きする)

  • READ
  • WRITE
  • APPEND
  • TRUNCATE_EXSITING
  • CREATE
  • CREATE_NEW
  • DEL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment