アットウィキロゴ

Java FAQ

どれをダウンロード・インストールすればいいのかわかりません。

単に Java で書かれたプログラムを実行したいのなら JRE をインストールすればOK。

Java プログラムを開発したり、ソースからコンパイルしたい場合は SDK をダウンロードしましょう。SDK はバージョン 1.4 以前は JDK と呼ばれていたものです。SDK をインストールした場合は JRE は不要です。

ダウンロードページ

インストールのやり方がわかりません。

まず、Oracle のインストールガイドを読んでください。

JRE と SDK(JDK) の違いが分からない場合は上記参照。

なお、ディストリビューションによっては独自にカスタマイズされた専用パッケージの配布があります。その場合には、そのパッケージを利用することをおすすめします。

日本語フォントが「□」で表示されてしまいます。

以下の設定でフォントの設定ができます。

JDK/JRE 5.0(1.5) 以降の場合

JREインストールディレクトリ lib/fonts (JDKの場合は jre/lib/fonts) に fallback というディレクトリを作成し、そこにフォントファイルへのシンボリックリンクを作成しましょう。

例(fedora core 5):

# cd [JREインストールディレクトリ]/lib/fonts
# mkdir fallback
# cd fallback
# ln -s /usr/share/fonts/japanese/TrueType/sazanami-* .

fontconfig.properties.src を編集するという方法もあります。

ちなみに font.properties.ja_JP というファイル名だと font.properties.ja よりも優先されるので自作設定のファイル名は font.properties.ja_JP にしておくと何かと便利。
Red Hat 8, 9 の人は font.properties.ja.Redhat8.0 を font.properties.ja_JP にコピーして使えばいいでしょう。
Google で検索すると色々出るので同じディストリを使っている人のものを拝借するのもいいかも。

入っているはずのフォントが選択できません。

Java が フォントの入っているディレクトリを知らないのが原因です。
環境変数 JAVA_FONTS に問題のフォントが入っているディレクトリ (例では /usr/local/share/fonts/ttf) を追加してください。

$ export JAVA_FONTS=/usr/X11R6/lib/X11/fonts/TrueType:
/usr/X11R6/lib/X11/fonts/Type1:
/usr/X11R6/lib/X11/fonts/75dpi:
/usr/X11R6/lib/X11/fonts/misc:
/usr/local/j2sdk1.4.2_04/jre/lib/fonts:
/usr/local/share/fonts/ttf

上記例は長いので複数行に分けていますが実際は一行です。
ユーザの ~/.bashrc, ~/.bash_profile ファイルに設定を書いておくといちいち設定せずにすみます。

Java アプリケーションだけ妙にフォントがでかくてダサいんですが。

ひょっとすると dpi の設定が変になっているのかも。
大きく表示される場合は 72dpi、小さく表示される場合は 96dpi にしましょう。

設定の仕方はdpi を強制的に指定するを参照の事。

Java を PATH に追加したいんですが

ユーザの ~/.bashrc, ~/.bash_profile ファイル、または /etc/profile ファイルにこんな感じで追加。

## for Java
export JAVA_HOME=/usr/java/j2re1.4.2_01
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
export PATH="$PATH:$JAVA_HOME/jre/bin:$JAVA_HOME/bin"

JAVA_HOME で指定しているディレクトリは環境とバージョンに合わせて変更してください。

RPM で入れた Java はどこにインストールされますか?

rpm コマンドで調べることで分かりますが、/usr/java とかにあります。

キャッシュなどの設定をしたいのですが

収録されているプログラム ControlPanel を実行してください。
アプレットなどのキャッシュサイズの設定、キャッシュの個別削除などをする事ができます。

データベースと並列処理

RDBMSにおいて、SQLを用いたリレーションにより、テーブルを自動的に作成できる。テーブルの主キーは行を一意に特定するが、別のテーブルの主キーを含む列のことを外部キーと呼ぶ。たとえば、学部と名前、名前と電話番号の2つのテーブルがあった時、名前を外部キーとして2つのテーブルを結合し、学部、名前、電話番号のテーブルを自動的に作成する。これを結合と呼ぶ。結合はデータベース操作の基本である関係演算のひとつで、ほかに選択と射影がある。
実際には、同姓同名の場合があるため、名前は外部キーにはできない。同一の項目を入れられないように制約をかけることもできる。
また、テーブルの重複要素を排除し、正しい状態でテーブルを整理することを正規化と呼ぶ。テーブルには、エンティティとリレーションシップがあり、これをE-R図で表す。たとえば、1対1、1対多(ひとつのスレッドにたくさんのコメントがつくような場合)、多対1、多対多のリレーションシップがある。
このようなSQLによるデータベースは、プログラムの中ではデータ構造として格納・構築・参照・変更される。主なデータ構造に、配列(順番に要素を格納する)、連結リスト(要素とポインタを持ち、動的に変化させやすい)、ハッシュ(マップ、辞書、連想配列)、セット(集合)、検索テーブル、行列、スタック(最後に入れたものが最初に出てくる)、キュー(最初に入れたものが最初に出てくる)、ツリー(木構造、たとえば二分探索木などは既出の単語検索の効率化のために使われる)、そしてグラフ(ひとつひとつのノードがエッジと呼ばれる繋がりを表す線で繋がる)などがある。C言語の構造体を用いるときは、データのマッピングだけではなく、効率やパフォーマンスも考える必要がある。
C++のSTLやJavaでは、こうしたデータ構造をテンプレート(ジェネリクス)とともに使う。ArrayListなどのObject型とキャストを用いたプログラミングでは、もしStringを想定しておきながらIntegerが入った場合に、コンパイルエラーにならず、実行時に失敗する。JavaではすべてのクラスがObject型を継承しているため、Object型に頼るプログラミングもできるが推奨されない。このような場合はジェネリクスを使うこと。すべてをObject型として扱う時点で、静的型付け言語を使っている意味がそもそもない。
逆に、RubyやPythonでは動的型付け言語であるため、配列にはどんな要素もミックスして入れることができるし、「アヒルのように振る舞うものはアヒルである」とするダックタイピングもできるが、これは大規模な開発では推奨されたスタイルではない。JavaScriptなどはあえて静的型付けをすることができる言語であるTypeScriptがMicrosoftによって開発されており、JavaScript開発ではTypeScriptを使うことが推奨される場合もある。JavaScriptは「自分でオブジェクトを構築してそれを量産する」というプロトタイプベースのオブジェクト指向を用いているが、TypeScriptを用いることでクラスベースのオブジェクト指向ができる。JavaScriptではthis参照を使うことで委譲もできるが、TypeScriptではクラス継承やジェネリクスやインターフェース(要素となるすべてのメンバと型を指定する)、タプル型(配列のそれぞれの要素に型を指定する。データベースなどを扱う際に有用)や型エイリアス(型の別名。stringをHogeTypeなどとできる)なども用意されている。蛇足だが、JavaScriptで書かれたモジュールは、当然ながら型宣言がない。このようなモジュールをTypeScriptで使うために、型宣言ファイルと呼ばれるものが提供されており、C/C++のヘッダファイルとよく似ている。JavaScriptではDOMを用いてHTML文書の編集はできるが、ファイル処理APIは標準では存在しない。ファイル処理のAPIはサーバーサイド向けのJavaScript環境であるNode.jsで同期・非同期のものが提供されている。
オブジェクト指向において、オブジェクトとRDBMSのマッピングを行うことをO/Rマッピングと呼ぶ。また、オブジェクトをファイルに書き出すことをシリアライズと呼ぶ。データを永続化するための常套手段なので覚えておこう。
データベースは、並列で動かした時のデータの矛盾を無くすため、排他制御やロックを行い、トランザクションが失敗すればロールバックする。同様のことをプログラミング言語でやるならば、Mutexによるロックを使う。
長い間C/C++には標準のマルチスレッドがなかった。そのため、UNIXではpthreadと呼ばれるPOSIXプラットフォーム依存のマルチスレッドを行う。Javaでは標準的にスレッドの機能があり、ThreadクラスまたはRunnableインターフェースを用いることでマルチスレッドのプログラミングができる。Javaではsynchronizedブロック・関数を用いることで、ひとつのスレッドしかアクセスできない(要するにロック)ようにできる。また、Javaではスレッドの一時停止や中断(割り込み)、待機などの機能もあり、例外などの機能とともに使う。
よくある並列処理として、単にマルチスレッドでそれぞれのスレッドが働く場合、マスター・スレーブにより主従関係を用いて複雑な処理を行う場合がある。あるいは、UNIXのパイプのように次々に順番で処理を行うパイプラインモデルがある。
最近では、Promiseやasync/awaitを用いて、非同期処理を行う仕組みもJavaScriptなどに存在する。コールバック関数を使うことでも非同期処理は実現できるため、Windows APIやC#のWindows.Formsなどではコールバック関数を多用するが、用途を考えず多用しすぎると、ネストが深くなり見通しが悪くなる(コールバック地獄)に陥ることがある。JavaScriptではPromiseなどの仕組みを使うことで、基本的には非同期で実行しながら、「この処理が終わったらこの処理をしてね」ということを、resolveとreject、thenとcatchの仕組みで実行できる。async/awaitは同期処理を書く場合と同じようにPromiseの非同期処理を書く記述のスタイル。
高速かつ効率的なアプリケーションを開発するには、ボトルネックとなっている部分を調べること、キャッシュを行うこと、並列処理を行うこと、データ構造を変えること、データを圧縮することなどが言える。言語を単にPythonからC++にすることでも高速化はするが、アルゴリズム的な部分は変わらないため、アルゴリズム的な改良も必要となる。
最近は、Kubernetesを用いることによるマイクロサービスという仕組みが流行している。ひとつのJava EEアプリケーションサーバですべての機能をもたせるのでなく、コンテナごとに機能をもたせてKubernetesを用いてオーケストレーションする。ひとつのサービスがすべてを行うわけでないため、テストなどが容易となる。

最終更新:2026年01月07日 23:04