序文
ヘッドのみが強くなることができます。
テキストは、私のGitHubリポジトリに含まれている、歓迎スター:https://github.com/ZhongFuCheng3y/3y
録音したら、コードを書くときにその愚かな操作、この関わる知識:文字列の不変性
一、交代背景
私はここにテキストメッセージを送信するためにRPCインターフェースを提供するシステムを持っています。私は、着信電話番号の外部インタフェースを呼び出し、そのパラメータに、私は、これらのパラメータの解決を担当しています、いくつかのビジネスの契約を行い、その後、SMSテキストメッセージのチャネルパートナーを送信するインターフェイスを呼び出す必要があります。
たびSMSチャネルインタフェースエンドコール、私は同様に、領収書を返し、(MySQLの中に格納されている)、着信、この文書を送信する私にSMSチャネル商工会議所や失敗を送信し、私は(ストレージに置く店MySQLで)。
その日は、誰かが私を見つけるために、電話番号がテキストメッセージを受信できないと言うと、ユーザーはSMS(延滞、シャットダウン)、およびテキストメッセージを受け取るので、いくつかの操作を遮蔽しません。
だから私はそれをトラブルシューティングするために行ってきました、私はDBの内側に発見するつもりですすべての最初は、このレコードが存在することが発見され、対応するレコードを送信していないが、DBで珍しい何も出てきません。
- (それはストレージに入れていたように、確かにSMSのオペレータ・インタフェースを介して呼び出します)ので、これは、傍受される例途中でこの操作を除外しました
その後Qulaoログの結果オブジェクトは、SMS演算子の戻りを呼ん情報を参照するには、その後、この問題の原因を表示されることがありますメッセージについてオペレーターに依頼してくださいはい。返事がありました:「それは、電話番号の一部である場合、このような状況を表示され、あなたの電話番号は何のトリムああではありませんか?」
だから、私は、ログインして、実空間との電話番号の背面が(心にカットし、前に見に失敗している)が見つかりQulao。この問題に対処するには、うまく内部入り口に私の携帯電話番号のトリム限り、非常に簡単になります。
第二に、コードを書きます
私がサポートするためにここにいる複数の電話番号に同じSMSを私はここに受け取るためにHashSetのを使用して、携帯電話の番号を。トリムの電話番号は、私は次のコードを書きました:
// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet
if (task.getKey() != null && task.getKey().size() > 0) {
for (String s : task.getKey()) {
s.trim();
}
}
コードはシンプルですが、私は2つのステップでそれを実行します。
- nullの場合、null値は、電話番号のコレクションを横断していないかどうかを確認
- 各電話番号をトリムすること
上記のコードは、問題ありますか?、ああ、私は何を書いても問題に問題があってはなりません。
小さなデモを書き、次の、我々は見つける:コードの11行で呼び出すtrim()
メソッドの後、次にライン12で出力、または状況が空白になります。
2.1なぜ、この錯覚はありますか?
実際には、我々は、Javaを学び始めたとき、確かにあなたは、Stringクラスを学びます。学習するときに明確な文字列でもある不変、常に変化に感じ、私たちStringオブジェクトを持っている、その理由は?
私は、最初のポイントはこれですと思う:当社の事業は、多くの場合、変数のオブジェクトであり、変更されたオブジェクトのプロパティのいくつかは、我々が変化したと思いました。たとえば、次のコード:
HashSet<Student> students = getStudent();
for (Student s1 : students) {
s1.setName("Java3y");
}
実行、我々はそれが内部の学生のHashSetの名前でJava3yを変更して、実際には真実であると思います。
私は2番目のポイントは、このだと思う:私たちは通常、Stringオブジェクトを操作し、過去の操作パスの直接の結果である、それは元のオブジェクトを変更すると同じように見えます。次のようなコード:
// 去重
String phone = " 137888888888 ";
sendPhone(phone.trim());
// 转成大写后输出
System.out.println(phone.toUpperCase());
// ... 等等
2.2を変更する方法
さて、問題は「一見」オリジナルStringオブジェクトが変更された、Stringオブジェクトは不変であり、文字列が動作するオブジェクトを、知られているが、実際には、新しいStringオブジェクトを生成しました。
私は、解決、問題に戻りtrim
、リストHashSetの上で電話番号を設定した方が良いです
// 说明:Task对象 有个 key属性,这个key属性的类型是HashSet
HashSet<String> hs = new HashSet();
if (task.getKey() != null && task.getKey().size() > 0) {
for (String s : task.getKey()) {
hs.add(s.trim());
}
}
task.setKey(hs);
遂に
Bは、彼が、本当に恥知らずな「合理的」であるバグを書いた方法を説明する記事を書きました。
喜んで出力乾貨物の Javaテクノロジ公共数の:Java3y。パブリック数200件の以上のオリジナルの記事技術記事、大量のビデオ資源、美しいマインドマップは、注意が得ることができます!
私はポイント、記事がよく書かれていると思う賞賛を!