私は、等価演算子は文字列への参照を比較することを理解しています。だから、それは彼らが、文字によって同じ文字列である場合には、同じオブジェクトを参照していないかどうかをチェックします。
検索アルゴリズムについての学習の最初のステップとして、私は私が名前の配列を持って、次のプログラムを設定し、特定の名前が配列に表示された場合、私は確認してください。
最初のアプローチ:
私は宣言し、名前の配列を初期化します。そして、私はそれが配列に表示されているかどうかを確認するために入力するユーザーに名前を尋ねます。
ここで私が使用するコードです -
import java.util.Scanner;
public class Strawman{
public static void main(String[] args){
System.out.println("Enter the name to search for:");
Scanner scanner = new Scanner(System.in);
String key = scanner.nextLine();
String[] names = {"alice", "bob", "carlos", "carol", "craig", "dave", "erin", "eve", "frank", "mallory", "oscar", "peggy", "trent", "walter", "wendy"};
for (int i = 0; i < names.length; i++){
if (key == names[i]) {
System.out.println("Index " + i + " has the name " + key);
}
}
}
}
このプログラムの実行の一つは、次のスクリーンショットに示されています -
予想通り、私は文字列を比較するために==演算子を使用していますので、これは最初の配列に登場していても、配列内の名前「オスカー」を見つけることができません。この出力は、等価演算子は、文字列の参照を比較する方法の私の理解に基づいて予想されます。
代わりに、ユーザーの入力を求め、私は文字列として検索する名前を宣言した場合、プログラムが動作しているようですしかし、なぜ、私は理解していません。
第二のアプローチ:
検索する名前「オスカー」が代わりにユーザーの入力を求めるの文字列として宣言されています -
public class Strawman2{
public static void main(String[] args){
String[] names = {"alice", "bob", "carol", "craig", "carlos", "dave", "eve", "fred", "greg", "gregory", "oscar", "peter"};
String key = "oscar";
for (int i = 0; i < names.length; i++){
if (names[i] == key){
System.out.println("Index " + i + " has name " + key);
}
}
}
}
私は、プログラムを実行する場合さて、名称「オスカー」は、配列中に発見されました -
誰かが2例の違いを説明できますか?
それはだからでは第二のアプローチ
String key = "oscar";
によって移入文字列定数プールからインスタンスを再利用
String[] names = {"alice", "bob", "carol", "craig", "carlos", "dave", "eve", "fred", "greg", "gregory", "oscar", "peter"};
あなたに重要な変数を開始する方法を変更します。
String key = new String("oscar");
それは同じように動作します最初のアプローチのString定数プールバイパスますようにとあなたのkey
変数は今、メモリ内の別のオブジェクトを参照します。
:文字列定数プールの詳細については、文字列定数プール