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

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

Java | 20 | StringBuffer

↓↓クリックして頂けると励みになります。



19 | 表の改良】 << 【ホーム】 >> 【21 | Frame


StringBufferを用いたプログラム
StringBufferを用いたプログラム




JavaのStringBufferクラスは、文字列を可変の文字列シーケンスとして扱うためのクラスです。
文字列を変更可能にするためのメソッドが提供されており、文字列の追加、挿入、削除、置換などの操作を効率的に行うことができます。

StringBufferクラスはjava.langパッケージに属しており、Javaの古いバージョンから存在しています。
Java 5以降では、StringBuilderクラスも導入され、StringBufferよりもパフォーマンスが向上していますが、StringBufferはスレッドセーフであるため、マルチスレッド環境での使用や、スレッドセーフ性が必要な場合には依然として役立ちます。

スレッドセーフ(Thread-safe)とは、複数のスレッドが同時に共有されるプログラムやデータ構造において、複数のスレッドが同時にそのプログラムやデータ構造にアクセスしても、予期せぬ副作用が発生しないことを指します。

マルチスレッド環境では、複数のスレッドが同時に実行され、共有されるデータへのアクセスが発生します。
このような状況では、異なるスレッドが同じデータを同時に変更しようとすると、競合状態(Race condition)が発生し、データが破損したり、期待しない結果が生じたりする可能性があります。

スレッドセーフなプログラムやデータ構造は、競合状態を防ぐために適切に同期され、データの整合性が保たれます。




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


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


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


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


Visual Studio Codeで以下のファイル「BufferTest.java」を作成します。


新規作成 【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のクラスライブラリが提供するクラスの中には、インスタンスを宣言するときにコンストラクタで初期値を代入するものが数多くあります。


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

Javaにおけるコンストラクタ(Constructor)は、クラスからオブジェクトが生成される際に、そのオブジェクトの初期化を行う特殊なメソッドです。
コンストラクタは、以下の特徴を持ちます。

  • メソッドのように見えるが、実は特別なメソッド: コンストラクタはメソッドのように見えますが、メソッドと異なり戻り値の型を持ちません。コンストラクタの名前はクラス名と同じであり、オブジェクトが生成されるときに自動的に呼び出されます。
  • オブジェクトの初期化: コンストラクタは、新しく作成されたオブジェクトの初期化を担当します。これは、フィールドの初期値の設定や必要な準備作業を行うことを意味します。
  • 引数を取ることができる: コンストラクタは引数を取ることができ、引数を用いてオブジェクトの初期化を行うことができます。引数の受け取り方や処理は、通常のメソッドと同様に定義されます。



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


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


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

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



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

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



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


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


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

public static void add( StringBuffer sb )

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


コンパイルして出力結果を確認して下さい。

~/Desktop/Programming/JP $ javac BufferTest.java 

~/Desktop/Programming/JP $ java BufferTest     
0
01



Visual Studio Codeで以下のファイル「BufferTest2.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" );
	}
}



ソースコードを読んで、どのような記述でどの様な処理になるのかというのを理解しておいてください。


プログラムをコンパイルして出力結果を確認します。

~/Desktop/Programming/JP $ javac BufferTest2.java

~/Desktop/Programming/JP $ java BufferTest2     
1
01
1
011



Visual Studio Codeで以下のファイル「BufferTest3.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文字目までの間を消すメソッドです。
しかし一度増えた容量は減っていません。
文字が足されただけで容量は増え続けます。


プログラムをコンパイルして出力結果を確認します。

~/Desktop/Programming/JP $ javac BufferTest3.java
~/Desktop/Programming/JP $ java BufferTest3     

大きさ:0
容量:16

0123456789
大きさ:10
容量:16

abcdefg0123456789
大きさ:17
容量:34

abcdefghijklmnopqrstuvwxyz0123456789
大きさ36
容量70

abcdefghijklmnopqrstuvwxyz
大きさ:26
容量70



19 | 表の改良】 << 【ホーム】 >> 【21 | Frame





↓↓クリックして頂けると励みになります。