takelab.note

釣りと一人旅と冒険と少々の技術の記録

Tag: Java

プログラムのコメントアウトにはFIXME、TODOの他にXXXがある

プログラミング言語のコメントアウトに”XXX”というコメントがあるということをご存知でしょうか

Continue reading

docker attachしてctrl+cを押すとコンテナごと削除される罠

こんにちは、11月6日付けで社会復帰を果たしました。
さすがに3ヶ月も家なき子状態を続けていると、社会復帰した時に辛いんだなってことに気づきました。
そして恥ずかしながらこの年齢にして、やっとdockerを業務で触る機会が訪れまして、四苦八苦しつつハマった罠を紹介したいと思います。

Continue reading

Androidアプリ「TwitMorse」version1.6.1をリリースしました。

こんにちは。絶賛就職活動中の元社畜です。

先日とあるWeb系の会社の最終選考で、Twitterアカウントばれして、

「Twitter名、『ハイパーポエムクリエイター』さん、なんですね、何か唄ってみてください」

と言われ、

突然のことで頭が真っ白になってしまってシドロモドロになったので、もう就職活動が嫌になってきています。

Continue reading

プログラミング初心者におすすめしたいプログラミング関連の情報

最近、技術関連の記事書いてないな、って先程思いまして、ネタはないのですが、個人的にプログラミングを始めるにあたってすごくタメになった書籍とかWebサイトとか紹介しようと思いました。

Webサービスと書籍に分けて紹介してみます。
Continue reading

Android ArrayAdapterからstartActivityする方法

AndroidのListViewでは独自のAdapterを作ってListViewにセットすることができます。
今回、独自のAdapterを作ってその中からあるアイコンをタップした時に別画面へ遷移させる方法がわからなかったので調べてみました。

Continue reading

?と思ったJavaでInt型をString変換する方法

あるコードを見ていたら下記のような記法を見かけたことがあったので「??」と思い、調べてみたのでメモします。
[java]
if(s.equal(""+i)) {
[/java]
Continue reading

Java .equalsメソッドの罠

Javaの.equalsメソッドの罠にひっかかって2週間くらいなやんだのでメモります。
開発してるTwitMorseの逆変換機能の実装の時に直面しました。

equalsメソッドは時折同じ文字列の比較をしてもfalseを返すことがあります。

私が引っかかったコード
[java]
protected String convertMorseToText(String text) {
String[] morse = text.split(" ", 0);
for (String moji : morse) {
if (moji.equals("--・--")) {
convertText += moji.replaceAll("--・--", "ア");
}
return convertText;
}
[/java]

何をしたかったかというと、
textで入ってきたモールス信号を全角空白で分割し、”ーー・ーー”という文字列があった場合に「ア」に変換して返す
というものでした。

[java]
if (moji.equals("--・--")) {
[/java]
しかし、この一文はfalseとなりスルーされてしまいます。何度”ーー・ーー”を入力しても一致しないものとして処理されていました。
これに2、3週間悩みました。

デバッガで調べていたところどこでfalseになっていたかというと、
Stringクラスのequalsメソッドのある部分でfalseが返されていました。
[java]
@Override public boolean equals(Object other) {
if (other == this) {
return true;
}
if (other instanceof String) {
String s = (String)other;
int count = this.count;
if (s.count != count) {
return false;
}
// TODO: we want to avoid many boundchecks in the loop below
// for long Strings until we have array equality intrinsic.
// Bad benchmarks just push .equals without first getting a
// hashCode hit (unlike real world use in a Hashtable). Filter
// out these long strings here. When we get the array equality
// intrinsic then remove this use of hashCode.
if (hashCode() != s.hashCode()) {// ここにひっかかる
return false;
}
[/java]

どうもhashCodeの違いでequalsを使っても一致しなかったらしい。

そこで以下のように書き換えてみたところうまく機能した。
[java]
protected String convertMorseToText(String text) {
String[] morse = text.split(" ", 0);
for (String moji : morse) {
String enc = new String(moji);
if (enc.equals("--・--")) {
convertText += enc.replaceAll("--・--", "ア");
}
return convertText;
}
[/java]
入力されたtextを全角空白で分割する所までは一緒。
違いは、新しくencという文字列をmojiを使って生成して比較するという部分でした。
これでhashCodeの違いを解消できました。

equalsメソッドをオーバーライドしたりhashCodeメソッドをオーバーライドしたりという解決方法もあるにはあったのですが、自分はこの方法でequalsメソッドの罠を回避しました。

後学のためにメモとして残しておきます。

© 2018 takelab.note

Theme by Anders NorenUp ↑