switch文の条件式に記述できる
- byte
- short
- int
- enum
- String
- 接頭辞として
0b
もしくは0B
を値の前につける。 - 内部的にはint型として解釈。先頭ビットを富豪として扱うかどうかで値が変更になる場合、明示的にキャストしない限りコンパイルエラー。
- リテラルの先頭と末尾には記述できない
- 記号の前後には記述できない
- シングルトンパターン
- コンポジション
- DAOパターン
- ファクトリパターン
- 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);
}
JDBC 4.0から例外が細分化された。
SQLException
BatchUpdateException // バッチ更新中にエラーが発生した時にスローされる例外
SQLClientInfoException // データベースとの接続を確立しようとした時に、クライアント情報を設定できずにスローされる例外
SQLTransientException // 一時的な例外
SQLNonTransientException // 一時的ではない例外
SQLRecoverableException // 回復可能な例外
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は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つだけ
- オブジェクトの可変なステートをカプセル化しそのステートにアクセスするpublicメソッドを同期化することでステートにアクセスするスレッドが常に1つだけになることを保証するように設計されている。
- イテレーション処理の開始後にコレクションの内容が変更されたことを検知した場合には、直ちに
java.util.ConcurrentModificationException
をスローします。- 例外を発生させないためにはsynchronizedでクライアントサイトロックをする必要がある
- ただしパフォーマンス劣化やデッドロック等注意が必要
- スレッドプール
- 並行コレクション
- アトミック変数
- カウンティングセマフォ
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);
}
- 書き込みに対してコピーを作成するため java.util.ConcurrentModificationException は発生しない
- 大量のデータ更新処理が発生するような場合にはCollections.synchronizedListメソッドを使用
package java.util.concurrent;
public class CopyOnWriteArrayList {
}
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){}
}
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
public class Executors {
// 可変サイズのスレッドプールを実装するExecutorServiceオブジェクトを返す
static ExecutorService newCachedThreadPool() {}
// 固定サイズのスレッドプールを実装するExecutorServiceオブジェクトを返す
static ExecutorService newFixedThreadPool(int nThreads) {}
// 指定された遅延時間後、または周期的にコマンドの実行をスケジュールできる、スレッドプールを作成
static ExecutorService newScheduledThreadPool(int corePoolSize) {}
// 単一のワーカースレッドを作成してタスクを逐次処理する
static ExecutorService newSingleThreadPool() {}
}
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メソッドを実装する。
- 分割統治法によって大きなタスクを分割し複数のCPUコアで同時並列的に実行することで全体のパフォーマンスを向上させることが出来る。
- スレッド間におけるタスクキューの競合を減らすため、Work-stealingアルゴリズムを採用。
ForkJoinTaskを実行するためのメソッド
void execute(ForkJoinTask<?> task) : 非同期タスクを実行する。実行結果は受け取らない。
<T> T invoke(ForkJoinTask<T> task) : タスクの実行が終了するまで待機し、処理結果を受け取る。
<T> ForkJoinTask<T> submit(ForkJoinTask<T> task) : 非同期でタスクを実行し、処理結果をタスクから受け取る
ForkJoinTask
RecursiveTask : 戻り値が必要な場合
RecursiveAction : 戻り値が必要ない場合
スレッドスタベーション(Thread starvation)
要素の格納および取り出しにおけるブロッキング機能をサポート。
ArrayBlockingQueue
DelayQueue
LinkedBlockingDeque
LinkedBlockingQueue
LinkedTransferQueue
PriorityBlockingQueue
SynchronousQueue
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のインスタンスの取得方法
static NumberFormat getInstance()
static NumberFormat getInstance(Locale inLocale)
static NumberFormat getCurrencyInstance()
static NumberFormat getCurrencyInstance(Locale locale)
- 書式パターン「M」「MM」を指定した場合には月が表示。「MMM」で指定された場合にはその月を洗わず文字列の省略形。4つ以上の「M」を指定した場合には省略形ではない完全な文字列。
- 書式パターン「z」は一般的なタイムゾーン。「z」の指定が3文字以下の場合には省略形が表示。4文字以上の場合には完全系が表示。
- シンボリックリンクのようなUNIX系のファイルシステムに固有の機能を利用することは出来ない。
- ディレクトリ内でファイルやサブディレクトリが作成/削除/変更されたといったようなイベントを監視するための仕組みがない。
- ファイルサイズや最終更新日時のような基本的なファイル属性を取得することはできましたが、その他の詳細なファイル属性の取得や設定を行うためにはプラットフォーム固有のネイティブコードを利用する必要がありました。
- Fileクラスの多くのメソッドにおいて、なんらかの理由で処理が失敗した場合でも適切な例外がスローされない
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
Filesクラスにおける書き込み用メソッドでStandardOpenOptionを指定しなかった場合、デフォルトでCREATE
,TRUNCATE_EXSISTING
、WRITE
が指定されたものとして処理される(ファイルが存在しない場合には新規作成し、ファイルが存在するなら内容を上書きする)
- READ
- WRITE
- APPEND
- TRUNCATE_EXSITING
- CREATE
- CREATE_NEW
- DEL