Java

Last-modified: 2012-04-04 (水) 16:09:30

JavaはC++以上の豊富な標準ライブラリを持ち、標準ライブラリで多倍長演算に対応している事などが、競技プログラミングの言語として使う上での最大のメリットと言えるでしょう。
様々なGUIアプリも作れる便利な言語です。

 

導入方法

このサイトからJDKをダウンロードしてインストールすれば、Javaの実行用プログラム(java)とJavaのコンパイラ(javac)が使えるようになります。端末やコマンドプロンプトなどで作業をする人はこれだけあれば十分です。

Eclipseなどの統合開発環境もあります。(競技プログラミングには不向き?)

Eclipse

ここのEclipse Classicをダウンロード
いくらかメモリを積まないと使えないですが、それをクリアしてしまえば自動ビルド・補完・関数生成等いたれりつくせりです。

 

Javaのメリット・デメリット

Javaは問題によってはずいぶんと便利です。使えるようになって損することは無いと思われます。

Javaのメリット

  • 多倍長演算(C++のlong long型(64bit整数))に収まらないような大きい整数の計算がBigIntegerクラスで、実数の精密な計算がBigDecimalクラスで演算できます。*1
  • 配列外参照など、C++では実行時エラーが返るときと返らないときがあるものが、Javaでは必ず実行時エラーが返ってきます。
  • 平衡二分木、ソート、二分探索などもあらかじめ用意されているので実装の手間が省けます。
  • 文字列関連のメソッドがそこそこ揃っていて、正規表現も使えるので、単純な文字列操作系の問題は瞬殺できることも多いです。
  • 実行時間が遅いので、ジャッジ環境によっては、C++より実行時間制限が長めに取られていることがあります。それによって多少遅いプログラムを書いても正解できることがあります。
  • 配列は定義時にすべて0で埋められるので、初期化の手間を省いたり、初期化忘れによるミスを軽減できます。

Javaのデメリット

  • 演算子のオーバーロードが出来ない
    C++のmapやsetでは[]演算子が使えますが、Javaでは演算子オーバーロードがないためにHashMap.get()やString.charAt()で代用せねばならず、面倒です。(文字列の連結の+は使えます)
    • Stringに関して言えば、String.toCharArrayを使うことでchar[]に変換できます。*2
  • 構造体がない
    構造体がないので構造体を使いたいときはクラスを書かないといけません。また、比較関数を書くのがC++に比べ面倒です。
  • 実行時間が遅い
    C++で定数倍改善をしないと解けない問題は、Javaだとさらに厳しくなります。それが好きな人もいます。

サンプルコード

nを入力で受け取り、1からnまでの数字を表示します。

import java.util.*;
class Main{
  public static void main(String[]args){
    Scanner s=new Scanner(System.in);
    int n=s.nextInt();
    for(int i = 1; i <= n; i++) System.out.println(i);
  }
}

*1 BigInteger は mod p での逆元を求める (modInverse) とか、数字の小さい範囲で素数を列挙する (nextProbablePrime) といった使い道(ある意味裏ワザ)もあります。
*2 場合によっては、速度面でもかなり有利になります