文字列の比較に==を使ってはいけない理由【Java入門講座】6-3 Stringクラス

แชร์
ฝัง
  • เผยแพร่เมื่อ 26 ธ.ค. 2024

ความคิดเห็น • 38

  • @zun.d.a
    @zun.d.a 10 หลายเดือนก่อน +3

    すごい これが無料で見れる時代に感謝

    • @SekaChan
      @SekaChan  10 หลายเดือนก่อน

      Javaは入門レベルから実務レベルまで幅広く動画を作ってあります。
      さらに授業ノート(PDF)やプログラムも無料でダウンロードできるので、ぜひ活用してJavaを楽しく学んでもらえたら😄

  • @kezuharo
    @kezuharo ปีที่แล้ว +4

    今Java silverの資格を取るため勉強しています。テキスト本、いわゆる「紫本」を使って勉強しているのですがいまいち理解できず…。TH-camでたまたま見このチャンネルを見かけて視聴しましたが丁寧でかつすごくわかりやすい説明で見ていて楽しかったです。またちょこちょこ視聴させていただきます。

    • @SekaChan
      @SekaChan  ปีที่แล้ว +2

      かずひさん、コメントありがとうございました!
      紫本は良い試験対策本ですが、ここからスタートすると理解するのは難しい部分もあるかもしれませんね。
      動画と本をあわせて使ってもらうと、理解と演習がかみ合って勉強が進みやすいかなと思います。
      また、こちらでJavaSilverのオススメ対策方法を話してるので、時間があるときに見てみてください😄
      th-cam.com/video/l2ne1CUPsbM/w-d-xo.html

  • @yukio4069
    @yukio4069 ปีที่แล้ว +6

    便利が故にあまり考えずに使っていましたが、この動画で理解できました!
    勉強し始めはメモリなんて気にしていなかったし、Stringをインスタンス化すること自体知らなかったです💦
    動画を見始めてメモリについて考えるようになりました。結果、Javaの動きを考慮する癖がついて、ステップアップできた気がします!
    無料でこんなに勉強できていいのか…本当に助かります!
    これからも沢山動画拝見させていただきます!ありがとうございます☺️

    • @SekaChan
      @SekaChan  ปีที่แล้ว +3

      Yukioさん、コメントありがとうございました!
      僕もJavaを勉強し始めたときは、まったく同じ感じでした😄
      でも、勉強を進めるたびにメモリの動きが分かったりしてJavaが楽しくなりました!
      無料で勉強できるのがTH-camの良いところですよね。
      これからも有料講座を上回るレベルの動画を出していくので、一緒に楽しく勉強していきましょう!

  • @shinyatateishi9831
    @shinyatateishi9831 7 หลายเดือนก่อน +2

    とてもわかりやすい解説、ありがとうございます。
    Object.equals()と「==」演算子が同じ役割、つまり
    格納されているアドレスを比較することになり、
    アドレスが等しい、つまり参照先のインスタンスが同一であるかどうかを検証することに役立つことがよくわかりました。
    一方でこのStringクラスでは、格納されている文字列が同じ(s1=「Java」とs2=「Java」)かどうかをequals()メソッドではっきりさせてくれるわけですね。
    ログインID、PWの話は理解しやすかったです。

    • @SekaChan
      @SekaChan  7 หลายเดือนก่อน

      そうですね。書いてくれたコメントを読むと、この動画の内容をよく理解できている様子が伝わってきます。
      ログインIDやパスワードの話は、研修をしているとほんっとうによく起きるエラーなので気をつけておきたいですね😄

  • @ytmi1230
    @ytmi1230 ปีที่แล้ว +4

    初心者用参考書ですと「文字列の比較はequals()メソッドを使って下さい」しか書いてないことが多いです。
    理由まで丁寧に解説してくれるので分かりやすかったです。
    なぜ?と考えると理解しようとする力が付くので理由の解説はとてもありがたいです。

    • @SekaChan
      @SekaChan  ปีที่แล้ว +2

      コメントありがとうございました!
      たしかに、「文字列比較はequals()メソッド」とだけ書かれてるケースが多いですよね。
      僕がJavaを勉強したときも、この理由が気になって調べたのを覚えてます。
      【なぜ?と感じて解決すること】は必ずスキルアップにつながるので、ぜひその調子で勉強を進めていってください!

  • @tetete307
    @tetete307 ปีที่แล้ว +3

    条件分岐が思った通りにできず、サイトで提示されていた==と===でもエラーかおかしな結果しか表示されませんでしたが、この動画で推奨されているメソッドを使ったら成功しました!!
    せかチャンにでしか知れていないことが他の動画にもたくさんあって、いつも重宝しております。
    せかチャンしか勝たん!

    • @SekaChan
      @SekaChan  ปีที่แล้ว +1

      てててさん、コメントありがとうございました!
      文字列のequals()メソッドはいろんな場面で使えるので、知っておくと便利ですよ。
      「せかチャンしか勝たん!」は嬉しいですね✨

  • @ミルク-e3x
    @ミルク-e3x 2 ปีที่แล้ว +2

    分かりやすかったです
    ありがとうございます

    • @SekaChan
      @SekaChan  2 ปีที่แล้ว

      米村美咲さん、コメントありがとうございました!
      分かりやすかいと感じてもらえて良かったです。こちらこそありがとうございます😄

  • @ちよあゆ
    @ちよあゆ ปีที่แล้ว +6

    いつもわかりやすい授業をありがとうございます!
    サンプルコードを実際に打って、コンパイルしてみたところ、下記2行の実行結果が、両方falseでした。
    System.out.println(" s1 == s2 : " + s1 == s2);
    System.out.println(" s1 == s3 : " + s1 == s3);
    カッコをつけ忘れてしまって、正しくは
    System.out.println(" s1 == s2 : " + (s1 == s2));
    System.out.println(" s1 == s3 : " + (s1 == s3));
    こうだと気付き、修正実行したら、False、tureでサンプルプログラミング通りでした。
    ()がないとfalseになるのはどうしてですか?
    もしコメント場所が違ってたらすみません。
    深く理解したいと思ってますので、宜しくお願い致します(><)

    • @SekaChan
      @SekaChan  ปีที่แล้ว +3

      ちよあゆさん、コメントありがとうございました!
      これはとても良い質問ですね✨
      ()がないとfalseになるのは、演算子の処理順序が + → == になるためです。
      こちら(th-cam.com/video/RqOtRQAiD5M/w-d-xo.html)で解説した通り、各演算子は処理する順番が決まっています。
      + と == は + を先に処理することになっているため、
      > "s1 == s3:" + s1 == s3
      では「"s1 == s3:" + s1」を先に処理して、連結文字列("s1 == s3:"Java)と s3("Java") が等しいかを調べます。
      一方、()は優先順位を上げる記述のため
      > "s1 == s3:" + (s1 == s3)
      では「s1 == s3」を先に判定して、"s1 == s3:"と"true"を連結しているわけですね。
      質問の内容や文面から、よく理解できている様子が伝わってきます。
      ぜひこの調子で勉強していってください!

  • @ちょにー-b1n
    @ちょにー-b1n 10 หลายเดือนก่อน +2

    とても分かりやすい講座でお世話になっております🙇‍♂
    文字列比較の使用例として、ログイン画面の処理など、イメージしやすくとてもわかりやすかったです。
    オブジェクトを生成した際のメモリ内の動き、参照型であるString型の理解がより深まった気がします🙏
    あと、概要欄にある授業ノート6-3.pdf、ファイル名がDivede1.javaになっているみたいです(細かいところみません💦)

    • @SekaChan
      @SekaChan  10 หลายเดือนก่อน +1

      同じようなミスが多くてすみません🙏
      どのファイルをコピペして作っているかがバレバレですね‥
      修正版をアップしたのでご活用ください。
      入門講座はあと少しでゴールです。その調子で最後まで頑張ってください!

    • @ちょにー-b1n
      @ちょにー-b1n 10 หลายเดือนก่อน +1

      @@SekaChan 数年前の動画にもコメントを返してくれる+修正してくれるだけでも感無量です。。。😭
      java講座をここまで見れたのは、せかチャンあってのことだと思います。本当にありがとうございます🙏

  • @忍野カルラ
    @忍野カルラ ปีที่แล้ว +3

    いつもありがとうございます。
    オブジェクト指向の理解が不安定のため曖昧な認識になっていますが、
    equals() メソッドはObjectクラス型とStringクラスで使い方が異なる認識になりました。
    この使い方が変わるのは、どちらのクラス同士を比較しようとしているのかで決まるイメージになりました。
    Objectクラス型で使う場合(オリジナルのequalsメソッド?)
    アドレス値の比較になる。
    Stringクラスで使う場合(オーバーライドされたequalsメソッド?)
    文字列同士の比較になる。
    equalsメソッドをアドレス値の比較で使おうとすると、オーバーライドにより文字列同士比較するようになっているため使えないから、
    オブジェクトでアドレス値を比較する時は「==」を使う。
    現在、上記の理解になっていますが間違いをご指摘頂けたらと思います。

    • @SekaChan
      @SekaChan  ปีที่แล้ว +2

      忍野カルラさん、コメントありがとうございました。
      特に間違いはありませんよ👍
      Objectクラスのequals()メソッドはメモリ上のインスタンスそのものが等しいかどうかをみて、Stringクラスでは文字列の内容を比較するわけですね。
      「==」の考え方も良いと思います。

  • @コーヒーアンド塩パンマン
    @コーヒーアンド塩パンマン ปีที่แล้ว +3

    わかりやすい動画ありがとうございます。質問です。
    前回の動画のequalsメソッドでは
    s1.equals(s2)がアドレス値を比べているということでfalseでした。
    しかしこの動画ではtrueとなっています。
    オーバーロードしているということでしょうか。だとしたら引数もObject型で同じで違和感があります。
    もしくはオーバーライドでしょうか。
    見分けが難しくて少し混乱してます。
    よろしくお願い致します。

    • @SekaChan
      @SekaChan  ปีที่แล้ว +1

      コーヒーアンド塩パンマンさん、コメントありがとうございました。
      Stringクラスのequalsメソッドは、Objectクラスのメソッドを【オーバーライド】してますね😄
      詳しくは、5:32あたりの解説を参考にしてください。

    • @コーヒーアンド塩パンマン
      @コーヒーアンド塩パンマン ปีที่แล้ว

      早くに返信頂きありがとうございます。
      なるほど、納得しました。
      普段equalsメソッドを使う上ではStringクラスでのほうがより一般的だという認識であっているでしょうか?

  • @mondai40
    @mondai40 ปีที่แล้ว +3

    いつもありがとうございます。
    以下の場合trueと出力されるのですが、これは「nameの参照値」と「再利用"john"の参照値」がイコールだからという認識であっていますでしょうか?
    String name = "john";
    System.out.println(name == "john");

    • @SekaChan
      @SekaChan  ปีที่แล้ว +2

      mondai40さん、コメントありがとうございました。
      はい。その認識で合っています👍

    • @mondai40
      @mondai40 ปีที่แล้ว +1

      @@SekaChan 理解できました。ありがとうございます

  • @user-zunatuna
    @user-zunatuna ปีที่แล้ว +3

    いつもわかりやすい本当に動画ありがとうございます。
    菅原さんの動画のおかげで継続して学習を進めていけております。
    質問(確認)なのですが、前回・今回内容を踏まえて、オブジェクトが同オブジェクトであるかを確認する場合(同アドレス値のオブジェクトかどうかを確認する場合)につきまして
    自分の中では「==演算子」を使っていくほうが良い(「equals()メソッド」はサブクラスでオーバーライドされていることが多いため)とように理解したのですが認識あっておりますでしょうか?
    あえてequals()メソッドを利用しなければならないパターンなどあれば、教えていただければ幸いです。

    • @SekaChan
      @SekaChan  ปีที่แล้ว +3

      ツナマヨネーズさん、コメントありがとうございました。
      「同じオブジェクトであるかを確認する場合は==演算子を使う方が良い」という認識は正しいです👍
      equals()メソッドを利用しなければならないパターンは、クラスごとに変わります(オーバーライドされた処理内容によるため)。
      文字列の内容を比較するときには、動画内で説明した通りStringクラスのequals()メソッドを使わなければなりません。
      例えばログイン処理を実装するとして、
       String inputPass = (ユーザが入力したパスワード)
       String registerPass = (DBに登録されている正しいパスワード)
      という2つの文字列を比べる際に
       if( inputPass == registerPass ){~}
      と書いても、if文の条件式は常にfalseになってしまうわけですね。
       if( inputPass.equals( registerPass ){~}
      と書いてはじめて2つの文字列の中身を比べられるようになります。

    • @user-zunatuna
      @user-zunatuna ปีที่แล้ว +3

      @@SekaChan
      ご回答ありがとうございます!独学だと自分の理解が正しいか確かめられる機会がないまま進めることが多くなってしまうため大変助かります。
      >equals()メソッドを利用しなければならないパターンは、クラスごとに変わります(オーバーライドされた処理内容によるため)
      ⇒ここは適宜APIドキュメント等で確認しながらということですね・・!色々試しながらこちらのチャンネルで学習続けていきたいと思います。

  • @kenchannel71
    @kenchannel71 9 หลายเดือนก่อน +1

    Javaのオラクルシルバーの勉強をしていますが、StringBuilderとStringクラスの違いがわからないので、いずれ動画にしていただけますでしょうか?
    また25問解きましたが、11問しか解けておらず、パーセンテージ的にも4割でした。4割しかできていないのかと嘆くしかないのでしょうか?それとも4割できているのかとポジティブに考えるべきでしょうか?合格ラインまであとx割だから努めますが、エンジニアとしてポジティブに取り組むかネガティブに取り組むかで悩んでます。

    • @kenchannel71
      @kenchannel71 9 หลายเดือนก่อน +1

      すいません🙇本来なら80問解けと言われますが、私用の都合で予定が入り中途半端な問題数になりました。いきなり80問解き切るのは言い訳で申し訳ございませんが、きついので1日20問解いてみるようにします。

    • @SekaChan
      @SekaChan  9 หลายเดือนก่อน

      StringとStringBuilderは似ているので、最初は違いがややこしいですよね。
      モコモコのオブジェクトがどうなってるかを調べてもらうと、違いが分かりやすいかなと思います。
      Java Silverの問題は結構深い&ひっかけめいた問題も出たりするので、4割でも気にしないで良いと思います。
      得点率は【解けない問題と解けるようにすること】によって確実に上がります。
      1日に何問解くかはそれほど重要ではなく、なぜ間違えたのかを理解したり、次間違えないようにするための勉強が大切ですよ😄
      簡単じゃない資格だからこそ、合格したときに実力を信用してもらえます。
      ぜひ前を向いて頑張ってください!

    • @kenchannel71
      @kenchannel71 9 หลายเดือนก่อน +1

      @@SekaChan ありがとうございます。なぜ間違えたのかを確かめるようEclipseを用いて着実に理解するよう努めてまいります。
      仕事をしながら勉強しなければならないので、1日3時間80問解いてから間違いの理解するのは多くの時間を要します。なので最低1時間の中でどのくらい解けば良いのかこだわっていました。菅原さんのコメントを見て問題数と合格率に過信していた自分自身に過ちと反省を感じました。たとえ間違いが多くても前向きに捉えるよう努めてまいります。

    • @kenchannel71
      @kenchannel71 9 หลายเดือนก่อน +1

      @@SekaChan あとJava関係ないですがどのプログラム言語も継続力や忍耐力が必要なので、毎週2回はジムで汗流してます💦

  • @カズキチ-r3m
    @カズキチ-r3m 9 หลายเดือนก่อน

    6-2でequalメソッドは変数の中身(アドレス値)を比べると記載されていたと思うのですが、
    今回どうしてs1.equals(s2)はtrueになるんでしょうか?
    中身は一緒だけどアドレス値は違うからfalseになるんじゃないかなと思いました。
    差し支えなければお答えしていただけると幸いです。

    • @SekaChan
      @SekaChan  9 หลายเดือนก่อน +1

      この質問は5:21あたりから説明してる内容なので、もう一度見直してみてください。

    • @カズキチ-r3m
      @カズキチ-r3m 9 หลายเดือนก่อน +1

      @@SekaChan見逃してました!ありがとうございます