学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails

Javaプログラミング入門その18 StringBufferを用いたプログラム(2020年1月更新)

<<前  [TOP]  次>>


StringBufferは文字列をアクティブに加えられるメソッドです。


StringBufferを使うにはインスタンスを生成しなければなりません。


インスタンスとはクラスをデータ型とした変数のことを言います。


今までクラスのメソッドを違うクラスのメソッドで呼び出して使ってきましたが、これは使っていたメソッドを全部staticで宣言していたからできたのです。
staticで宣言されたメソッドは、インスタンスを生成しなくてもそのまま使用することができます。
しかし他のクラスからメソッドを使用し、かつ変数の書き換えなどを行うにはstaticを宣言できません。
staticを宣言すると他のクラスからの書き換えができなくなるからです。


そこでstaticを宣言していないメソッドでは、インスタンスを生成する必要があります。
これはメソッドだけではなくフィールドにも同じことが言えます。


メモ帳を開いて次のプログラムを作ってみましょう。


【BufferTest.java】

public class BufferTest {

	public static void main( String[] args ) {

		int x = 0;
		StringBuffer sb = new StringBuffer( "0" );

		add( x );
		System.out.println( x );

		add( sb );
		System.out.println( sb );
	}

	public static void add( int x ) {
		x = x + 1;
	}

	public static void add( StringBuffer sb ) {
		sb.append( "1" );
	}
}



staticを宣言したフィールドやメソッドを静的フィールド・静的メソッドといい、staticを宣言していないのを動的フィールド・動的メソッドと言います。


StringBufferはjavaのパッケージに含まれているものです。


パッケージにはプロトタイプというのが決められています。
「使いたいメソッドがstaticなのかどうか」などが書いてあります。


ではインスタンスを生成するにはどの様にしたらよいのでしょうか?


StringBuffer sb = new StringBuffer( "0" );
このようにnew演算子を使用します。


メソッド名 インスタンス名 = new メソッド名("文字列");
これでインスタンスの生成ができました。


ここでStringBufferのことをメソッドと言いましたが、正確にはコンストラクタと呼ばれるものです。
書き換えると次のようになります。


コンストラクタ名 インスタンス名 = new コンストラクタ名("文字列");


コンストラクタとはインスタンスを初期化する機能を提供するメソッドです。


コンストラクタの名前は、クラスと同じにする約束になっています。
StringBufferクラスのコンストラクタは、StringBuuferという名前のメソッドです。


StringBufferクラスにはコンストラクタが3つあります。


プロトタイプ機能
StringBuffer()16文字サイズのからの文字列の入れ物を確保する。
StringBuffer( int length )lengthで指定されたサイズのからの文字列の入れ物を確保する。
StringBuffer( String str )strという文字列の格納された文字列の入れ物を確保する。


今回は、一番下のStringBuffer( String str )のコンストラクタを使っているわけです。
StringBufferクラスだけではなくjavaのクラスライブラリが提供するクラスの中には、インスタンスを宣言するときにコンストラクタで初期値を代入するものが数多くあります。


コンストラクタは初期値を決めるメソッドです。
自分の目的に合わせて使うことができるようになっています。
プロトタイプや機能を見て、自分が使いたいものを探していきます。


StringBufferクラスには他にも、appendメソッドやinsertメソッドがあります。


appendメソッドには文字列の入れ物に文字列を追加する機能があります。
insertメソッドは、文字列を挿入する機能があります。


このメソッドを使うには、次のようにします。


インスタンス名.append("文字列");


今回は、str.append("文字列");です。


str.insert(何文字目に挿入するか, "文字列");
str.insert(3, "文字列");


プロトタイプはこのようになっています。
StringBuffer append(String str)


インスタンスを作成して、「インスタンス名.append("文字列")」として使います。


最後に作成したインスタンスをメソッドで引数に使う場合を説明します。

public static void add( StringBuffer sb )

このように作成したインスタンスの型というのはコンストラクタ名になります。
(コンストラクタ名 インスタンス名)として使います。


出力結果です。


BufferTest.java実行結果
BufferTest.java実行結果


メモ帳を開いて次のプログラムを作ってみましょう。


【BufferTest2.java】

public class BufferTest2 {

	public static void main( String[] args ) {

		int x = 0;
		StringBuffer sb = new StringBuffer( "0" );
		
		x = x + 1;
		System.out.println( x );

		sb.append( "1" );
		System.out.println( sb );

		add( x );
		System.out.println( x );

		add( sb );
		System.out.println( sb );
	}

	public static void add( int x ) {
		x = x + 1;
	}

	public static void add( StringBuffer sb ) {
		sb.append( "1" );
	}
}



どのような記述でどの様な処理になるのかというのを理解しておいてください。


出力結果です。


BufferTest2.java実行結果
BufferTest2.java実行結果


メモ帳を開いて次のプログラムを作ってみましょう。


【BufferTest3.java】

public class BufferTest3 {

	public static void main( String[] args ) {

		StringBuffer sb = new StringBuffer();

		System.out.println( sb );
		System.out.println( "大きさ:" + sb.length() );
		System.out.println( "容量:" + sb.capacity() );
		System.out.println("");


		sb.append( "0123456789" );
		System.out.println( sb );
                System.out.println( "大きさ:" + sb.length() );
                System.out.println( "容量:" + sb.capacity() );
		System.out.println("");

		sb.insert( 0, "abcdefg" );
		System.out.println( sb );
                System.out.println( "大きさ:" + sb.length() );
                System.out.println( "容量:" + sb.capacity() );
		System.out.println("");

		sb.insert( 7, "hijklmnopqrstuvwxyz" );
		System.out.println( sb );
                System.out.println( "大きさ" + sb.length() );
                System.out.println( "容量" + sb.capacity() );
		System.out.println("");

		sb.delete( 26, 36 );
		System.out.println( sb );
                System.out.println( "大きさ:" + sb.length() );
                System.out.println( "容量" + sb.capacity() );
		System.out.println("");
	}
}



sb.delete( 26, 36 );
これは26文字目から36文字目までの間を消すメソッドです。
しかし一度増えた容量は減っていません。
文字が足されただけで容量は増え続けます。


出力結果を見てみましょう。


BufferTest3.java実行結果
BufferTest3.java実行結果


<<前  [TOP]  次>>