優しい夜
第6章 java.langのMathクラス、Stringクラス、ラッパー(SJC-P 1.4)
2007-05-11-Fri  CATEGORY: Java
≫目次
■Stringクラス
■StringBufferクラス
■Mathクラス(public final)
■ラッパークラス
■==演算子
■equals()メソッド


■Stringクラス
Javaでは、文字列をオブジェクトとして扱う。
ほかのオブジェクトと同様に、newキーワードを使ってStringインスタンスを作成することも可。

String s = new String("abc");
この場合オブジェクトは2つ作成される。
変数sによって参照される新しいStringオブジェクトが、標準のメモリー上に作成される。
さらに、Stringリテラル"abc"を値とするStringオブジェクトが、「String定数プール」に収められる。


String s = "hello";
String t = "hello";
String u = new String("hello");
上記の場合、
s == t //true
sとtは同じオブジェクトを参照している。
コンパイル時に、同じStringリテラルが「String定数プール」に既に存在する場合は、新たなStringリテラルは作成されず、変数の参照先を既存のStringリテラルに結びつける。

s != u //true
変数uは、newで生成された標準メモリー上のStringオブジェクトを参照している。

s.equals(t) //true
s.equals(u) //true
異なるオブジェクトを参照していても、文字列が意味的に等しければ、trueを返す。

Stringオブジェクトそのものは不変。変更不可。
ただし、Stringオブジェクトを参照する変数の参照先は不変でない。変更可能。

Stringオブジェクトそのものは変更不可の為、Stringオブジェクトに変更を加えようとすると、新しくStringオブジェクトが作成される。

新しく作成されたStringオブジェクトが参照変数に代入されなければ(どこからも参照されなければ)すぐに失われる(ガーベジ対象となる)。

Stringクラスはfinalとして宣言されている。
Stringクラスのメソッドの動作をオーバーライドすることは誰にも出来ない。

□Stringクラスの主なメソッド
public char charAt(int index) //指定位置の文字をStringから取り出す。先頭は0番目。
public int compareTo(String anotherString) //2つの文字列を辞書式に比較する。
public String concat(String s) //引数sのStringを後ろに連結する。
public int indexOf(char c) //最初にcが現れる位置を返す。なければ-1を返す。
public int indexOf(String str) //最初に文字列strが現れる位置を返す。なければ-1を返す。
public boolean equalsIgnoreCase(String s) //大文字小文字を無視して、文字列が等しいかどうかを調べる。
public int length() //Stringの長さを返す。引数なしメソッド。
public String replace(char old, char new) //文字oldを文字newに全て置換。
public String substring(int begin) //指定位置から終わりまでの文字列を返す。頭は0。
public String substring(int begin, int end) //begin+切り取りたい文字数=end
public String toLowerCase() //大文字を全て小文字に置換。
public String toUpperCase() //小文字を全て大文字に置換。
public String toString() //このメソッドを呼び出したStringオブジェクトの値をそのまま返す。
public String trim() //Stringの先頭や末尾の空白文字を切り捨てて返す。

public boolean equals(Object anObject) //Stringオブジェクト同士が意味的に等しいかを比較
public boolean contentEquals(StringBuffer sb) //StringBufferオブジェクトとStringオブジェクトが意味的に等しいかを比較

※連鎖メソッドは、左から順に評価される
例)String y = x.concat("def").toUpperCase().replace('C','x');

■StringBufferクラス
ファイル入出力など、絶えず変化する大規模なストリームを扱う時に良く使われる。
StringBufferオブジェクトは、変更可能である。
StringBufferオブジェクトを参照する変数に代入しなくても、実体そのものが変更される。

コンストラクタ:
StringBuffer sd = new StringBuffer() //空のStringBufferオブジェクト作成
StringBuffer sd = new StringBuffer(int c) //バッファサイズcの空のオブジェクト作成
StringBuffer sd = new StringBuffer(String s) //sの文字列を持つオブジェクト作成
※StringBufferクラスには、Stringを引数に取るコンストラクタがある。

StringBufferクラスは、オーバーライドされたequals()メソッドを持たない。
「==演算子」とObjectに定義されている「equals()メソッド」は、両者とも「同じオブジェクトを参照しているかどうか」を判定する。
つまりStringBufferクラスは、オブジェクトが「意味的に同じか」を調べる仕組みを持たない。

□StringBufferクラスの主なメソッド
public synchronized StringBuffer append(StringBuffer s) //Stringクラスのconcat()と同じ。ただし、StringBufferだから戻り値を変数に代入しなくても、実体が更新される。
public synchronized StringBuffer append(String s) //appendは様々な引数をとる。
public synchronized StringBuffer insert(int offset, String s) //指定位置に文字列を挿入する。先頭は0。挿入するデータは様々な型を指定できる。
public synchronized StringBuffer reverse() //文字列内の文字の順序を逆にする。

public char charAt(int index) //指定位置の文字をStringから取り出す。先頭は0番目。
public int indexOf(String str) //最初に文字列strが現れる位置を返す。なければ-1を返す。
public int length() //字列バッファの長さを返す。引数なしメソッド。
public void setCharAt(int i, char c) //位置iの文字をcに置き換える。
public void setLength(int l) //文字列の長さをlにする。短くなる場合は削り、長くなる場合はnull文字('\u0000')で埋められる。
public String toString() //このメソッドを呼び出したStringBufferオブジェクトの値をStringに変換し返す。

※String型をStringBuffer型へキャストすることは出来ない。
※StringBuffer型をString型へキャストすることは出来ない。
※==演算子でお互いにキャストできない型同士を比較するとコンパイルエラーとなる。

■Mathクラス(public final)
Mathクラスには数値定数のpi(円周率/パイ)やe(自然対数の底)の近似値も定義されている。
public final static double Math.PI //3.141…
public final static double Math.E //2.718…

Mathクラスのコンストラクタはprivateなので、Mathクラスのインスタンスは作成不可。
Mathクラスのメソッドや定数は、全て静的(static)なので、クラス名.メソッド名/定数名で直アクセスする。
例)result = Math.abs(-5);

□Mathクラスのメソッド
<戻り値double型>
double ceil(double a) //小数点以下を切り上げる。1.0は1.0、-1.0は-1.0を返す。
double floor(double a) //小数点以下を切り下げる。1.0は1.0、-1.0は-1.0を返す。

double random() // 0.0以上で、1.0より小さい正のdouble値を返す。

double toDegrees(double angleInRadians) //ラジアン単位⇒角度
double toRadians(double angleInDegrees) //角度⇒ラジアン単位
double sin(double a) //引数はラジアン単位
double cos(double a)
double tan(double a)

double sqrt(double a) //平方根(squareroot)を返す。引数が負数かNaN場合は、NaNを返す(実際の数学では複素数となる)。コンパイルエラーにはならない。

double exp(double a) //オイラー数eをdouble値で累乗した値を返す。指数関数eのa乗。
double log(double a) //指定されたdouble値の自然対数値(底はe)を返す。対数関数(log[e]a)
double pow(double a, double b) //1番目の引数を、2番目の引数で累乗した値を返す。

<戻り値4型>…3種
double abs(double a)
float abs(float a)
int abs(int a)
long abs(long a)
引数の絶対値を返す。戻り値は常に正。
最小のint値(Integer.MIN_VALUE)か最小のlong値(Long.MIN_VALUE)が引数の時のみ、abs()メソッドは負数を返す。

double max(double a, double b)
float max(float a, float b)
int max(int a, int b)
long max(long a, long b)
2つの引数の大きい方を返す。
2つの引数が同じ値の場合、その数値をそのまま返す。
引数は同じ型同士を比較するが、ビットが増える方向ならば、暗黙的にキャスト可能。

double min(double a, double b)
float min(float a, float b)
int min(int a, int b)
long min(long a, long b)
2つの引数の小さい方を返す。
2つの引数が同じ値の場合、その数値をそのまま返す。
引数は同じ型同士を比較するが、ビットが増える方向ならば、暗黙的にキャスト可能。

<戻り値2型>…1種
int round(float a)
long round(double a)
四捨五入。0.5は1.0。-0.5は0.0。
※暗黙的なキャスト
                       char
                       ↓
ビット小→byte, short, int, long, float, double→ビット大
byteは数値の基本型であれば、どの型にも暗黙的にキャストできる。
floatはdoubleにしか、暗黙的にキャストできない。

□Mathクラスの定数(public static final)
浮動小数点の特別なフィールド(ラッパークラスから持ってくる)
double a = Double.POSITIVE_INFINITY; //正の無限大
float af = Float.POSITIVE_INFINITY;
double b = Double.NEGATIVE_INFINITY; //負の無限大
float bf = Float.NEGATIVE_INFINITY;
double c = Double.NaN; //Not a Number
float cf = Float.NaN;

double d = Double.MAX_VALUE; //最大値
float df = Float.MAX_VALUE;
double e = Double.MIN_VALUE; //最小値
float ef = Float.MIN_VALUE;
(上記の最大値・最小値は、Boolean型を除き、それぞれのラッパークラスが持つ。整数4+小数2+文字1)

NaN != NaN はつねにtrue。
NaNは何と比較しても(自分自身と比較しても)「==」が真にならない。

DoubleとFloatには、引き数がNaNかどうかをテストするメソッドがある。
Double.isNaN(c) //⇒true
Float.isNaN(cf) //⇒true

Math.sqrt(b) //負(の無限大)の平方根⇒NaN

■ラッパークラス
基本型の値をオブジェクトと同様に操作できるようにするクラス。
基本型にユーティリティ機能一式を提供する。
ラッパーオブジェクトはStringオブジェクトと同じく変更不可。
ラッパークラスはfinal。
Stringクラスとラッパークラスはいずれもfinalなので、それぞれのクラスが持つメソッド(equals()も含む)は一切オーバーライドできない。

□ラッパークラスとそのコンストラクタ引数
(6種の数値ラッパークラス)
基本型 ラッパークラス コンストラクタ引数
byte Byte byte, String 引数にint型は不可
short Short short, String 引数にint型は不可
int Integer int, String
long Long long, String
float Float float, double, String 引数にdouble型も可
double Double double, String
(他2種)
基本型 ラッパークラス コンストラクタ引数
char Character char 文字のみ
boolean Boolean boolean, String Stringで受け取る時は大・小文字を区別しない

≪ラッパーオブジェクトの作成≫
1)コンストラクタに引数をわたす。数値, String, 文字, 真偽値⇒ラッパーオブジェクト
例:
Integer i1 = new Integer(42);
Integer i1 = new Integer("42");
Float f1 = new Float(3.14f);
Float f1 = new Float("3.14f");
Character c1 = new Character('c'); //Characterクラスのコンストラクタは1種のみ
Boolean b = new Boolean(true);
Boolean b = new Boolean("false"); //Stringで受け取る時は大・小文字を問わない。Booleanオブジェクトをブール式に使うことは出来ない。

2)valueOf()…静的メソッド。String(,基数可)⇒ラッパーオブジェクト
6種の数値ラッパークラスとBooleanクラスに各1個ずつ。
CharacterクラスはStringを扱えないので持たない。
基数を取る場合は4種の整数ラッパークラスに1つずつ。
例:
Float f2 = Float.valueOf("3.14f"); //クラス名.静的メソッド
Double d5 = Double.valueOf("3.14"); //String⇒ラッパーオブジェクト
Integer i2 = Integer.valueOf("101011", 2) //10進数に変換され代入される。

引数Stringが不適切な場合、ランタイムエラー(NumberFormatException)が発生する。
例:
Integer i3 = Integer.valueOf("10.0"); //Integerで小数は不適切なのでランタイムエラー。

≪ラッパーオブジェクトを『元に戻す』≫
1)xxxValue()…非静的メソッド。ラッパーオブジェクト⇒数値, 文字, 真偽値
6種の数値ラッパークラスそれぞれに6種のメソッドがある。
Characterクラスは、charValue() だけを持つ。
Booleanクラスは、booleanValue() だけを持つ。
例:
Integer i2 = new Integer(42); //コンストラクタで新しいラッパーオブジェクトを作成
byte b = i2.byteValue(); //IntegerのbyteValue()メソッド。 byte型に変換。
short s = i2.shortValue(); //IntegerのshortValue()メソッド。 short型に変換。
int i = i2.intValue(); //IntegerのintValue()メソッド。 int型に変換。
long l = i2.longValue(); //IntegerのlongValue()メソッド。 long型に変換。
float f = i2.floatValue(); //IntegerのfloatValue()メソッド。 float型に変換。
double d = i2.doubleValue();//IntegerのdoubleValue()メソッド。double型に変換。

例:
Float f2 = new Float(3.14f); //コンストラクタで新しいラッパーオブジェクトを作成
short s = f2.shortValue(); //FloatのshortValue()メソッド。short型に変換。
『縮小変換時の型のキャスト』も自動で行われる。この場合、小数点以下は切り捨てられる。
この寛容さが「非静的メソッドxxxValue()」の持ち味。

2)parseXxx()…静的メソッド。String(,基数可)⇒数値
6種の数値ラッパークラスに各1個ずつ。
基数を取る場合は4種の整数ラッパークラスに1つずつ。
Characterクラス、Booleanクラスは持たない。
例:
double d4 = Double.parseDouble("3.14"); //String⇒数値
int i2 = Integer.parseInt("101011",2); //10進数に変換され代入される。

引数Stringが不適切な場合、ランタイムエラー(NumberFormatException)が発生する。
例:
int i3 = Integer.parseInt("10.0"); //Integerで小数は不適切なのでランタイムエラー。

≪その他のメソッド≫
0)Character型のみ
static boolean isDigit(char ch)
⇒Character.isDigit(char ch) //引数が数字ならtrueを返す。

static boolean isLetter(char ch)
⇒Character.isLetter(char ch) //引数が文字ならtrueを返す。

1)toString()…オブジェクトがラップしている基本型の値をStringで返す。
ラッパークラスは、引数のない、非静的な、インスタンスメンバーとしてのtoString()メソッドを持つ。
例:
Double d = new Double("3.14");
System.out.println("d="+ d.toString()); //出力 d=3.14。ラッパーオブジェクト⇒String

2)また各数値ラッパークラスは、オーバーロードした「静的」なtoString()メソッドも持つ。
例:
System.out.println("d="+ Double.toString(3.14)); //出力 d=3.14。数値⇒String

またIntegerクラスとLongクラスだけは、基数を取る「静的」なtoString()メソッドも持つ。
何進数で出力するか指定できる。
例:
System.out.println("hex="+ Long.toString(254, 16)); //出力 hex=fe。数値(,基数可)⇒String

3)toXxxString()…静的メソッド。数値⇒基数表記String
引数にint値かlong値を受け取り、それを基数に変換してStringを返す。
IntegerかLongのみの静的メソッド。
2進, 8進, 16進→toBinaryString(), toOctalString(), toHexString()
例:
String s3 = Integer.toHexString(254); //s3="fe"。数値⇒String
String s4 = Long.toOctalString(254); //s4="376"。数値⇒String


■==演算子
基本型変数の比較…同じ値を持てばtrue

参照変数の比較…同じオブジェクトを参照していればtrue。
比較できるのは、同じクラスまたはクラス階層に属するオブジェクトを指す参照変数のみ。
別々のクラス階層に属するオブジェクトを参照する参照変数(お互いにキャストできない型同士)を比較しようとすると、コンパイルエラー。

■equals()メソッド
基本型変数…比較は出来ない。コンパイルエラー。

参照変数の比較…参照変数が指す実体を比較する。「意味的に同じ」であればtrueを返す。
構文)x2.equals(x1)

デフォルトの(オーバーライドされていない)equals()メソッドでの比較
ObjComp oc = new ObjComp();
Object o = oc;
で、
o.equals(oc)
oc.equals(o)
はどちらもtrue。

Objectクラスに定義されている「equals()メソッド」は、「==演算子」と同様に「同じオブジェクトを参照しているかどうか」を判定する。
Stringクラス(意味的に同じ)やラッパークラス(型と値が等しい)は、オーバーライドされたequals()メソッドを持っている。
StringBufferクラスは、オーバーライドされたequals()メソッドを持たない。

□ラッパーオブジェクトの比較
ラップされた基本型の値が等しいかを調べるには、equals()メソッドを使う。
trueを返すのは、双方の「基本型の値」と「ラッパークラスの型」の両方等しい場合のみ。

Trackbacks0 Comments0
Comments

Only the blog author may view the comment.
 
Trackbacks
TB*URL
ページトップへ
Copyright © 2009 優しい夜. all rights reserved.