Java における一般的なトラップの質問と回答

高洛峰
リリース: 2017-01-16 16:20:18
オリジナル
1668 人が閲覧しました

1. 奇数を見つける:

public static boolean isOdd(int i){
 return i % 2 == 1;
 }
ログイン後にコピー

上記の方法は本当にすべての奇数を見つけることができますか?

A: 負の数の問題は考慮されません。i が負の場合、それは不正解です。 i%2 == 0

2 を返す必要があります。浮動小数点減算

System.out.println(2.0-1.9);
ログイン後にコピー

A: Java の単純な浮動小数点型 float および double は演算できません。 Java だけでなく、他の多くのプログラミング言語にもこの問題があります。ほとんどの場合、計算結果は正確ですが、何度か試行すると (ループを作成できます)、上記のようなエラーが発生する可能性があります。もちろん、加算、減算、乗算、除算で問題が発生する可能性があります。例:

System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
ログイン後にコピー

これは、桁数が限られた一部の小数が、浮動小数点では表現できない 2 進数で無限に繰り返される小数になる可能性があるためです。数値が大きくなり、精度が損なわれます。

解決策:

1. a-b が c に等しいかどうか、または a+b が c に等しいかどうかを判断したい場合は、

if(0.05+0.01-0.06 < 0.0000001)
{
}
ログイン後にコピー

2 という本に原理が記載されています。 float と double 科学計算または工学計算にのみ使用できます。商用計算では、java.math.BigDecimal を使用して解決する必要があります

System.out.println((new BigDecimal("2.0")).subtract(
 new BigDecimal("1.9")).doubleValue());
ログイン後にコピー

3. 無限ループの理由は次のとおりです。 i が Integer.MAX_VALUE の場合です。 このとき、for ループは最初に ++ を実行し、次に i <= END であるかどうかを判定します。その後、i が Integer.MAX_VALUE の場合、i は負の数になります。したがって、サイクルは継続します。

が負の数になるのは、intがオーバーフローしたためです。ここで、<=END を

4. 具体的には何が返されますか?

public static final int END = Integer.MAX_VALUE;
 public static final int START = END - 2;
 
 public static void main(String[] args) {
 int count = 0;
 for (int i = START; i <= END; i++)
 count++;
 System.out.println(count);
 }
ログイン後にコピー

A: false を返します。現時点では、return true は到達不可能なステートメントであり、コンパイル段階で最適化されて削除されます。

3. 面接で遭遇する可能性のある罠の質問を共有しましょう

コードを見てください:

public static boolean decision() {
 try {
 return true;
 } finally {
 return false;
 }
}
ログイン後にコピー

出力結果は次のとおりです:

A 上記の答えはどれもありません。は正しい。


実行結果は次のようになります:

int a=5;
  System.out.println("value is"+((a<5)? 10.9:9 ));
ログイン後にコピー

because ((a<5) ? 10.9) 演算子の精度に従って自動的に変換する 10.9java があります。したがって、次の 9 も 9.0 になります。

それでは D を選択してください。


a

value is9.0
ログイン後にコピー

結果は次のとおりです: str1.notequalsstr2 これは、StringBuffer が、equals メソッドをオーバーライドしないことを示しています。

StringBuffer str1=new StringBuffer("123");
  StringBuffer str2=new StringBuffer("123");
  if(str1.equals(str2)){
   System.out.println("str1.equalstr2");
  }else{
   System.out.println("str1.notequalstr2");
  }
ログイン後にコピー

結果は次のとおりです:

Float fa=new Float(0.9f);
  Float fb=new Float(0.9f); //Float fb=new Float("0.9f");
  Double db=new Double(0.9f);
  if(fa==fb){ //false
   System.out.println("fa==fb");
  }else{
   System.out.println("fa!=fb");
  }
  if(fa.equals(fb)){ //true
   System.out.println("fa.equalfb");
  }else{
   System.out.println("fa!equalfb");
  }
  if(db.equals(fb)){ //false
   System.out.println("db.equalfb");
  }else{
   System.out.println("db!equalfb");
  }
ログイン後にコピー

他に何かありましたら、追加してください。

参考:

1. http://blog.csdn.net/ol_beta/article/details/5598867

2. http://zhidao.baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1K V wBvmlR0UZGHSjD4f6A1yD0d65JL_


3. http://bbs.csdn.net/topics/300023952

4. http://z466459262.iteye.com/blog/739300

概要

以上がこの記事の内容となります。この記事は誰にとっても役立ちます。あなたの勉強や仕事に役立つでしょう。ご質問がある場合は、メッセージを残して連絡してください。

Java の一般的なトラップの質問と回答に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート