Javaのまとめサイト
Javaプログラミング、サーブレット、JSPのまとめ資料。

- Java -言語についてのまとめ
- Java -クラス設計についてのまとめ
- Java -サーブレット、JSPについてのまとめ
- Java -JDBC、データベースについてのまとめ
- シスコ CCNA対策はこちら
- ITILファンデーション対策はこちら




■JDKインスコ
JDK.exe実行(ver5を使う) 設定デフォ

■環境設定
cmd
path //パス一覧がでる
パスは評価は前から、なのでオラクルより前にJavaのパスを追加
マイコンピュータ>プロパティ>詳細設定>環境変数>システム環境変数
Pathを選択し>編集>以下を先頭に追加
C:\Program Files\Java\jdk1.5.0_09\bin;

//bk
c:\>pathPATH=C:\Oracle\product\10.1.0\Client_1\bin;C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin\client;C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem

■さくらエディタインスコ
さくらで開くメニューの追加
さくらエディタの関連付けアプリ>Java、チェック入れる

■Java
拡張子.java
コンパイルjavac(ファイル+拡張子) c:\src\lesson1>javac Sample1.java
実行java(クラス名) c:\src\lesson1>java Sample1
保存フォルダ c:\src

ケースセンシティブ
ファイル名とクラス名を同じにする、クラスは先頭大文字がよい
(クラス名とファイル名を同じにするため、ファイル名も大文字にしておく)
{ から } をブロックと呼ぶ、{ は同一行に書く
クラス名は大文字で始める
変数名とメソッド名は、hogeHogeの形で表す、定数は大文字で、HOGE_HOGEで表す
mainメソッドから原則として実行される
1行の文字数は80文字程度で改行
cmd タブキーで候補表示
printlnのLNは改行
文字'a'と文字列"string"a"は扱いが違う
javaではUnicode、8進数と16進数での表記がある
変数名は数字で始められない
+で文字を結合する
変数は基本型(プリミティブ型:intなど)、参照型(クラス型、配列、インターフェイス型)。
参照型はメモリのアドレスを持ち、入れ物の変数を別の変数に代入してもインスタンスは複製されず参照のコピーだけが渡される、実体は一つ
Stringはクラス(クラス型の変数)で文字列、charは(基本型の)変数で文字(1文字)
String型はnewせずオブジェクトを作成できる、String str = "Hello"; 配列も
Stringの比較はequalsを使う if (str.equals("end")) {
newする必要がないクラス:Stringクラス、基本型のクラス、配列クラス(書き方により)
キャスト(double)変数, Integer.parseInt(str), Double.parseDouble(str)
数値から文字列への変換 String str=String.valueOf(num)
315L(ロング)、3.14D(ダブル)と表記する
ある処理ブロック(例:IF文内)で宣言した変数は、そのブロック内でしか使用できない
obj.lengthはインスタンスのフィールドを表し、 obj.length()はメソッドを表す
str.substring(0,2) 引数は開始位置と最終位置から一つ前までの文字列を返す
if(str.equals("Hello")){ は文字列strとHelloが等しいかどうか
\がESCコード、"C:\\workspace\\JavaApp\\test1.txt"
StringBuffer sb = new StringBuffer(str); res = sb.reverse(); 文字を逆順に
整数のとき小数点以下を削るif(result%1==0){ strResult = String.valueOf((int)result); }

配列の宣言方法は3つ
1)初期化 int[] test={1,2,3}
2)1行 int[] test=new int[5]
3)2行 int[] test; test=new int[num];
test.lengthで要素数(1次元)、test[添字].lengthで"2次元目"の該当するリストの要素数

//2次元配列
定員[階][部屋番号]=データ
データ(定員人数)だけを配列に入れられる。階や部屋番号の内容はデータで持てない。
階や部屋番号の添え字もデータで持てない。
すべて持たせたい場合は、以下のようにして持たせることができる。
ビル[部屋インデックス][個別情報]=データ
{ {1,5階,503号,5人,有},{2,5階,502号,10人,無} };
ただし、階数、号数、定員、風呂有無の個別情報の内容のデータは持てないので、別に用意するか固定で打ち込む。
//3次元配列
テスト点[学年][組][科目]

()で計算を促す。例(1+2)
インクリメントに後置と前置がある(インクリが代入前か後か)、a++;b=a;と2行で書く、もしくは前置の++aを使う

文字列の評価 if(str.equals("あ")){ //strが"あ"の時
関係演算子 ==(等しい) !=(等しくない) >=(以下、=は後ろ)\
キーボードからの入力は文字列として入力される
break 一番近いループ(switch文を含む)を抜ける,IF文は適応されない
continue その時だけ処理をせずループに戻る
&&(AND論理積) ||(OR論理和) !(NOT否定)
(int)(Math.random()*10+1) 1から10までのランダム
import java.util.Random; Random random = new Random(); int n = random.nextInt(10)+1;
this.などを指定しない変数は一番近い同名の変数を指す
DecimalFormat("0000");
int n = "文字列".length()
new Menjan().getWord() とインスタンスメソッドを一行で呼出す
0.5を足して、小数点以下を切り捨てることで四捨五入できる
0.999を足して、小数点以下を切り捨てることで切り上げができる
---
setScale(桁数,BigDecimal.ROUND_HALF_UP).doubleValue();
切り上げ:RoundingMode.CEILING
切り捨て:RoundingMode.FLOOR
四捨五入:ROUND_HALF_UP
num = new BigDecimal(num).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
---
//1. BigDecimalを使う
BigDecimal bd = new BigDecimal(bmi);
bmi = bd.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
//2. Math.roundを使う
bmi = Math.round(bmi * 10) / 10.00;
//3. キャストを使う +0.5
bmi = (int)(bmi * 10 + 0.5) / 10.0;

//パッケージ
1.同じ役割をまとめると意味がわかりやすくなる
2.同じ名前を持つクラス・インタフェースの名前の衝突を避けられる
3.クラス・メンバ変数・メソッド・コンストラクタにアクセス制限をつけられる、public以外?
パッケージ名.クラス名
import パッケージ名.クラス名;

//クラスライブラリ
JDKにはよく使われる機能をまとめたクラスが添付されている
一文字切り取り 文字列変数.charAt(0番から)
int indexOf(int ch)
int length()

//オブジェクトの配列
2次元配列のように扱える
Car[] cars; cars = new Car[3]; Car型の配列を作成
cars[0] = new Car(); Car型配列の要素にインスタンスを生成
スーパークラス型の配列を作成しておけば様々なサブクラスのオブジェクトを扱える、但しサブクラス固有のメソッドはそのままでは呼び出せない(interfaceを使う)???
Car[] cars; cars = new Car[3];
cars[0] = new Car();
cars[1] = new RaceCar;
cars[2] = new Truck;

//Java2SEのクラスライブラリ
C:\Documents and Settings\b2-115\My Documents\funase\02java\Java_Tool\jdk-1_5_0-doc-ja\docs\ja\api\index.html

■イクリプスのインスコ(Pleiadesのディストリビューション)
C:\javaに解凍
C:\java\eclipse\eclipse.exeをデスクトップにショートカットを作成
ワークスペース c:\workspace

新規プロジェクト>Javaプロジェクト
プロジェクト名:JavaApp
実行環境:J2SE-1.5

JavaApp>srcで右クリック>新規作成>パッケージ
名前:lesson04

lesson04で右クリック>新規作成>クラス
名前:Sample1

修飾詞:default
public static void mainにチェック
継承された抽象メソッドにはチェック外す

文字コードの統一(全角日本語が正しく認識されない、Java:utf8,winos:sjisだから)
eclipse pleiadesのver3.3以降が日本語対応されてないため(標準入力のやり取りも変;)
http://mergedoc.sourceforge.jp/
C:\java\eclipse\eclipse.ini
-Dfile.encoding=utf-8 を設定

■イクリプス
ウィンドウ>ビューの表示>コンソール
コンパイルは自動
実行>実行>Javaアプリケーションで実行(アクティブなウィンドウに対して)
停止ボタンで処理を強制終了

ctrl+spaceで入力補完
ctrl+ALT+上or下で一行コピー
ALT+上or下で入れ替え,複数行化
ctrl+/ でコメント化、無効化
行選択しctrl+i でインデントで整形
行選択しctrl+shift+F でインデントで整形
ctrl+メソッド呼出をクリック メソッドを記述しているコード表示する

リファクタリング>名前の変更 で一斉変更
斜体:クラスメソッド

■デバッグ
コード行の先頭をダブルクリック(ブレークポイント)
実行>デバッグ
ステップオーバー(F6)で1行進める:他の関数の中までは追わない場合
ステップイン(F5)で1行進める:呼び出している関数の中まで調べる場合、ステップアウトで呼び出し元へ戻れる
サーブレット、JSPの場合はブレークポイントを置き、ブラウザでアクセスする

■例外
IOException,NumberFormatExceptionを自作例外で受けたい、無理、IOException等それぞれをキャッチするかExceptionでキャッチするしかない?

基本的にコンパイルで例外処理をしなさいと怒られたらその例外を処理するという方法でOK
例外がでる可能性のあるメソッドは原則として@Aどちらかの処理をする@メソッド内でtry-catchで受ける方法とAthrowsで投げて呼出し元でtry-catchする方法
例外がでる可能性のあるメソッドにはthrowsを付ける(try-catchを埋め込まない場合)
例外がRuntimeExceptionクラスのサブクラス、またはErrorクラスのサブクラスの場合は例外処理をしなくても可
Exceptionが例外の親玉クラス、全ての例外を拾うことができる
catch、finally後処理は続けられる
tryで例外が発生しcatchが見つからない場合、処理中のメソッドの呼出し元に戻りcatchが探される、main()まで戻っても無い場合は途中でプログラムが終了する、throwsに指定したクラスでtry-catchでなく呼出し元でtry-catch(throwsで指定されたクラスはcatchでそのクラスのobjが使われる)
catchは複数記述できる
例@)
void sample1(){
try{
//例外が発生する可能性がある処理
int[] test = new int[5];
test[10] = 80;
catch(ArrayIndexOutOfBoundsException e){
msg = e + "という例外が発生しました";
}
catch(IOException ie){
msg = ie + "という例外が発生しました";
}catch(Exception e){
//スーパークラスの変数を使うとその下のサブクラスの例外を拾うことができる
}finally{
//例外の発生にかかわらず最後に処理される、catchが無い場合でも処理される
}
}
ThrowableクラスからErrorクラスとExceptionクラスが拡張されている、Errorクラスはプログラム実行の続行できないエラーを表し通常例外処理は行わない、Exceptionクラスの例外を拾う
Throwableクラスを拡張して例外クラスを作ることができる
Aの自作例外例)
class HogeException extends Exception{
//Exceptionを継承して独自の例外クラスに処理を作る、一般化できる
HogeException(){ //コンストラクタ
System.out.println("error");
}
hogeMeth(){
System.out.println("OUTCH!");
}
}
class Hoge{
//throwsを記述して呼出し元に投げるメソッドにする、これは例外を自分で定義している(Java既定の例外の場合はnew文は不要)、throwsに指定したクラスでtry-catchするわけではなく呼出し元でtry-catch
void setHoge(int n) throws HogeException{
if(n<0){
hogeException e = new HogeException();
throw e;
//1行で書いても良い throw new HogeException();
}
}
}
class Main{
public static void main(String[] args){
Hoge h = new Hoge();
try{
//例外がでるメソッドはtryに書く、呼出し側で処理
h.setHoge(-100);
}
catch(HogeException e){
//処理を書く、ここで独自クラスのオブジェクトを使える
e.hogeMeth();
}
}
}

■スレッド
長い時間がかかる処理が行われている間に、別のスレッドで他の処理を行う仕組み
obj.start()でobj.run()を別スレッド実行させる、その間もメイン処理は動いている、run()が終わればスレッドは終了する
sleep(ミリ秒)でスレッドを停止できる(Threadクラスを継承したクラス内)、Thread.sleep(10)だとThreadクラスの継承は不要
//Threadクラスの継承の場合
class OtherThread extends Thread{
public void run(Add add){
//別のスレッドで行いたい処理をrun()メソッドで定義、Threadクラスを継承
//addは同期がかかっているので複数スレッド同時に処理されることはない
add.add();
}
}
Class Main{
public static void main(String[] args){
OtherThread ot = new OtherThread();
OtherThread ot2 = new OtherThread();
//スタートメソッドで別スレッドを起動し、run()メソッドを実行する
ot.start();
ot2.start();
//ジョインメソッドは、別スレッドが終わるまでメインフローの処理を止める
ot.join();
}
}
//Runnableの実装の場合(他で継承されているのでインプリしかない)
class OtherThread extends Other implements Runnable{
public void run(Add add){
//別のスレッドで行いたい処理をrun()メソッドで定義、Runnableクラスを実装
//addは同期がかかっているので複数スレッド同時に処理されることはない
add.add();
}
}
Class Main{
public static void main(String[] args){
//別スレッドの処理オブジェクトを作成し、スレッドクラスのオブジェクトを作成する
OtherThread ot = new OtherThread();
Thread th1 = new Thread(ot);
//スタートメソッドで別スレッドを起動し、run()メソッドを実行する
th1.start();
}
}
//同期
class Add{
synchronized void add(){
//メソッドにシンクロを付けるとスレッド排他がかかり処理中は1スレッドのみになる
}
}

■ファイルの入出力
try{
BufferedReader br = new BufferedReader(new FileReader("C:\\words.txt"));
String line1;
String line2;
while((line1 = br.readLine()) != null){ //readLine()で一行進む
line2 = br.readLine();
map.put(line1, line2);
}
br.close();
}catch(IOException e){
System.out.println("入出力エラーです");
}
try{
//trueで追記,falseで削除し先頭に書込
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("C:\\words.txt",true)));
pw.println(key);
pw.println(meaning);
pw.close();
}

■コレクションクラス
サイズ可変長でどんなオブジェクトも格納できる、基本的に同じ型を一纏めにして取り扱う
ArrayList(配列)、HashMap(連想配列)、スタック(LIFO)、キュー(FIFO)
ArrayList<引数1つ>、HashMap<Key,実データ>は引数2つ
import java.util.*; インポートする
TreeMapはキーの昇順にならぶ、HashMapは順序が定まらない、HashMapはTreeMapよりも処理が若干早い、違うのは宣言だけでTreeMapとHashMapは同じ使い方
integerはintをオブジェクトにラップする、intは基本型でobjでないため扱えない

<●●>ジェネリック型で事前に型を宣言しておくことで、キャストをかけることなく直接適切な値を入れられる、Java Ver5以降、型パラメータの指定には参照型のみ使用可、基本データ型はダメ、ジェネリック型の引数<>にはIntegerの他にStringや任意のクラス型等も指定できる、クラス型にするとクラスの配列/連想配列のようになる

■java.util.AllayList(配列、アクセスは要素インデックス)
ArrayList<Integer> obj = new ArrayList<Integer>();
obj.add(0,"@@@"); obj.add(100); //
obj.indexOf(atai) //値と一致する要素の番目を返す
obj.remove(0) //リストから0番目の要素を削除
obj.size()

---イテレータ繰り返しを使ったアクセス
Iterator<Integer> itr = obj.iterator(); //Integer型のイテレータクラス型のitr変数でイテレータを受ける
while(itr.hasNext()){
Integer num = (Integer)itr.next();
---イテレータを使わないアクセス(この場合ジェネリック型にはクラス型の引数)
for(int i=0;i<obj.size();i++){
Hoge h = obj.get(i); //ArrayListに入っているi番目のHogeクラスのオブジェクトを受け取る
---For拡張を使ったアクセス
for(Integer atai:obj){
//objに入っているInteger型のものの値を変数ataiに順次入れていく、全取得、一つ飛び等の処理は難しい
---For拡張を使ったアクセス(ジェネリック型にはクラス型の引数)
for(HogeClass h:obj){
int num = h.getHoge;

■java.util.HashMap(連想配列、アクセスはキー)
import java.util.*;
HashMap<String,HogeClass> obj = new HashMap<String,HogeClass>();
obj.put("1",hogeObj);
HogeClass hogeObj = obj.containsKey("1");
obj.get("1");
obj.remove("1");
Set<String> set = obj.KeySet(); //キー一覧をセットで取得
Iterator<String> it = set.iterator(); //キーのデータセットのイテレータを扱うために変数にセット
Iterator<String> it = obj.keySet().iterator(); //上の2行と同じ
while(it.hasNext()){
String strKey = it.next();
HogeClass strVal = obj.get(strKey);
ツリーマップはハッシュマップとキー順序がつくか付かないかだけで他は同じ
TreeMap<String,String> tm = new TreeMap<String,String>();

■フォーマット
BigDecimal bdvalue = new BigDecimal(sum);
DecimalFormat decimalformat = new DecimalFormat("###,###");
String sumStr = decimalformat.format(bdvalue);
//整数なら小数点以下なしにする
if(num%1==0){
strNum = String.valueOf((int)num);
}else{
strNum = String.valueOf(num);
}

■ラベル
ラベル有りのbreak文はそのラベルがつけられた制御文までを終了
bingo:
for (int i = 0; i < slot.length; i++) {
for (int j = 0; j < slot[i].length; j++) {
if (slot[i][j] == award ) {
judgment = true;
break bingo;
}
}
}

■キューとスタック(リストで実装できるので不要?)
オブジェクトの後入れ先出し(LIFO)スタックを表すStackクラス
オブジェクトの先入れ先出し(FIFO)を表す待ち行列(キュー)のQueueインターフェイス
キューの基本操作は、要素の追加、取り出し、検査 検査というのはキューから取り出さないまま要素を取得
String[] item = {"Apple", "Banana", "Cocoa"};
Queue<String> q = new LinkedList<String>();
Stack<String> s = new Stack<String>();
for(String i: item){
q.offer(i);
s.puch(i);
}
while(q.size()>0){
Syste.out.println("Queue: " + q.poll());
}
while(s.size()>0){
System.out.println("Stack: " + s.pop());
}

待ち行列のブロッキング 要素の追加と削除put()とtake()は処理可能になるまで待機します
両端キューのDequeは「デック」と発音、キューから要素を取り出す「デキュー」ではありません
Dequeは本来はスタックとしてもキューとしても使える構造で、Java6以降StackではなくDequeインタフェースを推奨

java webアプリケーション プログラミング サーブレット JSP データベース DB ゲーム script ダウンロード sun 入門 講座 vm eclipse アプレット ジャバザハット コンチェ ブーシ クラス メソッド コンストラクタ 実装 スプリクト アプレット オブジェクト 呼び出し 初歩 例外 リシュモン コンパス 入門 プログラミング 言語 スウォッチ 変数 bufferedreader stringbuffer stringtokenizer extends inputstream hashmap javaworld synchronized applet class equals iterator tostring boolean resultset applets constructor javadoc specified implements arraylist interface hashtable arrays documentation jfilechooser 遅い exceptions vector tutorial import