こんにちは、運営者のハックです。
今回はJava Silver対策編「第2章の対策」の学習記録を紹介します
第2章 Javaの基本データ型と文字列操作
第2章では「プリミティブ型のデータ」「リテラル」「varを使ったローカル変数の型推論」「Stringクラス、Stringクラスのメソッド」「文字列同士の連結」「StringBuilderクラス、StringBuilderクラスのメソッド」について出題されます。まずは各分野を自習し、その後問題を解いていきます。
引き続き解説の参考と例題の引用は【黒本】と呼ばれる「徹底攻略Java SE 11 Silver問題集」から行っていきます。
プリミティブ型のデータとリテラル
プリミティブ型というのはJavaの基本データ型のことです。基本データ型についてはこちらの記事で詳しく解説しています。
ここではリテラルについて解説します。
整数リテラル
整数リテラルとは、プログラムの中で直接書かれた数値のことを指します。
この数値を書く際のルールがいくつかありますが、簡単に言うと「どのように数値を書けばコンピューターが理解できるか」です。
具体的には以下のようなルールがあります。
- 基本的な数字の書き方:普通に数字を書くことができます(例:
100
,200
)。 - 長い数字の区切り:非常に長い数字は、アンダースコア(
_
)を使って見やすく区切ることができます(例:1_000_000
で「100万」)。ただし、リテラルの先頭と末尾、記号の前後には記述できません。 - 16進数:数字の前に
0x
や0X
をつけると、16進数(0から15までを表す数値体系)であることを示せます(例:0xFF
で「255」)。 - 8進数:数字の前に
0
をつけると、8進数(0から7までを表す数値体系)であることを示せます(例:075
で「61」)。 - 2進数:数字の前に
0b
や0B
をつけると、2進数(0と1のみで数を表す数値体系)であることを示せます(例:0b1010
で「10」)。 - 数値の型:数値の後ろにLやl(長い整数を表すlong型)、Dやd(小数点数を表すdouble型)、Fやf(小数点数だが精度が低いものを表すfloat型)をつけることで、その数値の「型」(データの種類)を示せます(例:
100L
で長い整数の「100」)。
文字リテラルと文字列リテラル
文字リテラルと文字列リテラルは、プログラミングにおいて「文字」や「文字の並び(つまり、言葉や文)」を直接コードに書くための方法です。
文字リテラルはシングルクォーテーションを使い一文字だけを表します。改行文字(\n)やタブ(\t)のような特殊な文字も、文字リテラルとして扱います。
文字列リテラルはダブルクォーテーションを使い文字の並び(一文字以上)を表すことができます。空の文字列を表すために""
という形で、何も文字がない状態を表現することもできます。
次は実際にJavaSilverの例題を解いてみましょう。
char型の変数の初期値として、正しいものを選びなさい。(1つ選択)
A. chat a = “a”;
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. char b = ‘abc’;
C. char c = 89;
D. char d = null;
char型は文字リテラルを表すデータ型だったのにゃ。
Aは文字リテラルなのにダブルクォーテーションで囲っているから間違いなのにゃ。
Bは文字列リテラルなのにシングルクォーテーションで囲っているから間違いにゃ!
Dは基本データ型で宣言した時はnullの代入ができないから間違いだにゃ。
ということは正解はCかにゃ?
あにゃ?でもchar型って文字リテラルを表す型なのに数値も入力できるのかにゃ?
char型で扱うことができるのは、世界中のさまざまな文字を表すことができる「Unicode」という国際的な文字セットの文字です。char型はシングルクォーテーションで囲った文字リテラルの他に、Unicodeで定義された特定の文字を‘\uXXXX’の形式(Xは16進数)で書くことができます。
また、16進数4桁の数値で文字を表現できることから、0~65535(65535は16の4乗)までの数値を代入することができます。
なので選択肢Cが正解です。この場合「System.out.println(c);」を実行するとコンソールにはラテン文字の大文字「Y」が表示されます。
varを使ったローカル変数の型推論
Javaのvarを使うと、変数を宣言する際にその型を明示的に書かなくても、コンパイラがその変数が初期化される値から型を推測してくれます。これを「ローカル変数の型推論」と言います。
varを使って変数を宣言するときは、変数を初期化する必要があります。初期化とは、変数やオブジェクトに最初の値を設定することです。
これにより、コンパイラがその初期化の値から変数の型を推測できるからです。
例えば、以下のように記述します。
var number = 10; // int型と推論される
var message = "Hello, World!"; // String型と推論される
この場合、number変数は10
という整数からint
型であると推論され、message変数は“Hello, World!”という文字列からString型であると推論されます。varを使う主な利点は、コードがより読みやすく、書きやすくなることです。特に変数の型が長く複雑な場合や、型を繰り返し書く必要がある場合に便利です。
Javaでvarを使ったローカル変数の型推論は、コードを書く際に非常に便利ですが、いくつかのルールがあります。これを守らないとコンパイルエラーになることがあります。具体的に注意すべき点は以下の通りです。
- 初期化が必須:varを使って変数を宣言するときは、必ず初期化する必要があります。コンパイラは初期化時の値をもとに変数の型を推論します。初期化せずに
var
を使うと、コンパイラはその変数の型を推測できず、エラーになります。(エラー例:var number;) - nullで初期化はできない:nullはどの型にも属することができるため、varを使ってnullで変数を初期化することはできません。これもコンパイラが型を推論できないためです。
(エラー例:var something = null;) - ラムダ式を直接代入できない:varを使ってラムダ式を直接代入することはできません。ラムダ式の型はコンテキストに依存するため、コンパイラはその型を自動で推論できません。
(エラー例:var myLambda = () -> System.out.println(“Hello”);)
ラムダ式の説明については「Javaコース初級 基礎編Day10 StreamAPIとラムダ式」の記事を参考にするのにゃ!
ちなみにJava SE 10から変数宣言時のデータ型を推論する機能が追加されたそうです。
次は実際にJavaSilverの例題を解いてみましょう。
次のプログラムをコンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)
1. public class Sample{ 2. private var value; 3. public Sample(var value) { 4. this.value = value; 5. } 6. public void test() { 7. System.out.println(value); 8. } 9. }
1. public class Main{ 2. public static void main(String[] args) { 3. Sample s = new Sample("sample"); 4. s.test(); 5. } 6. }
A. 「sample」が表示される。
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. 「null」が表示される。
C. コンパイルエラーが発生する。
D. 実行時に例外がスローされる。
「private var value;」だけじゃどんな型か分からないのにゃ。
でも、その後「Sample(var value)」って引数宣言しているし…うーん…
Javaでは、varはローカル変数の型推論にのみ使えます。クラスのフィールドやメソッド、コンストラクタのパラメータでvarを使用することはできません。
このコードでは「private var value;」のようにフィールド宣言時に型推論しており、また、「 public Sample(var value)」のように引数の型宣言で型推論を使用しています。
このような場合コンパイルエラーになるため、選択肢Cが正解です。
StringクラスとStringBuilderクラス
StringクラスとStringBuilderクラスは、Javaで文字列を扱うためのクラスですが、その性質と使用目的が異なります。
Stringクラス
Javaで最も基本的な文字列を扱うクラスで、テキストなどの不変の文字列を表します。不変(immutable)とは、一度作成されたStringオブジェクトの内容を変更できないという意味です。Stringオブジェクトに対して変更を加える(例えば、文字列を結合する)と、新しいStringオブジェクトが作成されます。この特性は、読み取り専用の文字列を扱う際に便利で、セキュリティやシンプルな文字列操作が必要な場面でよく使用されます。
StringBuilderクラス
文字列が動的に変更される可能性がある場合に使われるクラスです。StringBuilderは変更可能(mutable)で、一度作成されたインスタンスの内容(文字列)を自由に変更できます。例えば、文字列を追加したり、特定の部分を置換したりすることがこのオブジェクトに直接行われます。文字列の追加、削除、置換などの操作が頻繁に行われる場合、StringBuilderを使うと性能が向上します。これは、新しい文字列オブジェクトを何度も作成する必要がなく、メモリの使用効率が良いからです。
簡単に言うと、Stringクラスは一度決めたら変えられない、書き換えが不要な場合や、不変の値を扱いたい時に適しています。StringBuilderクラスは、文字列が動的に変わるような場合に適しており、パフォーマンスを考慮する必要がある場合に特に便利です。
StringクラスのメソッドとStringBuilderクラスのメソッド
StringクラスのメソッドとStringBuilderクラスのメソッドについて、それぞれの代表的なメソッドについて紹介します。
Stringクラスの代表的なメソッド
- length(): 文字列の長さ(文字数)を返します。
- charAt(int index): 指定された位置(index)にある文字を返します。
- substring(int beginIndex, int endIndex): 文字列の指定された範囲の部分文字列を返します。
- indexOf(String str): 指定された文字列が最初に登場する位置のインデックスを返します。見つからない場合は-1を返します。
- toLowerCase(): 文字列中の全ての大文字を小文字に変換した文字列を返します。
- toUpperCase(): 文字列中の全ての小文字を大文字に変換した文字列を返します。
- equals(Object anObject): 指定されたオブジェクトとこの文字列が等しいかどうかを判断します。
- replaceAll(String regex, String replacement): 文字列内の一部を正規表現にマッチするすべての文字列を、指定した文字列に置換します。
StringBuilderクラスの代表的なメソッド
- append(String str): 指定された文字列をこの文字列ビルダーの末尾に追加します。
- insert(int offset, String str): 文字列ビルダーの指定された位置に文字列を挿入します。
- delete(int start, int end): 文字列ビルダーから指定された範囲の文字を削除します。
- reverse(): 文字列ビルダーの文字列の順序を逆にします。
- length(): 文字列ビルダーの現在の長さを返します。
- setCharAt(int index, char ch): 指定された位置の文字を、指定された文字で置き換えます。
- toString(): 文字列ビルダーの内容を文字列として返します。
全部覚えられる気がしないのにゃ…
英語の意味からある程度メソッドの意味は推測できるので、あとは実際に自分でコードを書いて実行しながら覚えていく感じでしょうかね。
次は実際にJavaSilverの例題を解いてみましょう。
次のプログラムをコンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)
1. public class Main{ 2. public static void main(String[] args) { 3. StringBuilder sb = new StringBuilder("abcde"); 4. System.out.println(sb.capacity()); 5. } 6. }
A. 0が表示される。
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. 5が表示される。
C. 16が発生する。
D. 21が発生する。
capacityってことは容量のことかにゃ?
「abcde」の五つの文字があるから正解はBだにゃ!
残念ですが、正解は選択肢Dです!
capacity()メソッドは、そのStringBuilderインスタンスが内部的に持つ文字配列のサイズ、つまり、現在の文字列を格納できる最大容量を返します。
StringBuilderは、文字列を追加するたびに自動的にその容量を増やすことができますが、最初にインスタンスを作成する時点である程度の初期容量が設定されています。StringBuilderのデフォルトの初期容量は16文字です。
この例題では、StringBuilderに”abcde”(長さは5)を初期文字列として渡しています。そのため、StringBuilderの内部配列の初期容量は5 + 16 = 21となります。
capacity()メソッドはこの容量を返すため、結果としてコンソールには21
が表示されます。
(ひっどーい!?
デフォルトの初期容量とか事前に説明していなかったのにゃあ!)
まとめ 自力で解けてくると楽しい
今回はJava Silver対策編第2章「第2章 Javaの基本データ型と文字列操作」について学習しました。
Javaを最初学習した時は全然理解できなかったことも、何度もコードを書いたりChatGPTで内容を細かく聞いたりしている内に、だんだんと例題の問題が自力で解けるようになってきました。
自分の予想が当たっていた時は嬉しいですね、解けると途端に学習が楽しくなってきます。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント