Heim > Java > javaLernprogramm > Häufige Fragen und Antworten zu Fallen in Java

Häufige Fragen und Antworten zu Fallen in Java

高洛峰
Freigeben: 2017-01-16 16:20:18
Original
1684 Leute haben es durchsucht

1. Ungerade Zahlen finden:

public static boolean isOdd(int i){
 return i % 2 == 1;
 }
Nach dem Login kopieren

Kann die obige Methode wirklich alle ungeraden Zahlen finden?

A: Das Problem der negativen Zahlen wird nicht berücksichtigt. Wenn i negativ ist, ist es falsch. Sollte i%2 == 0 zurückgeben

2. Gleitkommasubtraktion

System.out.println(2.0-1.9);
Nach dem Login kopieren

A: Die einfachen Gleitkommatypen float und double in Java können nicht betrieben werden. Nicht nur Java, sondern auch viele andere Programmiersprachen haben dieses Problem. In den meisten Fällen sind die Berechnungsergebnisse korrekt, aber wenn Sie es ein paar Mal versuchen (Sie können eine Schleife erstellen), können Sie Fehler wie die oben genannten machen. Natürlich kann es bei Addition, Subtraktion, Multiplikation und Division zu Problemen kommen.

Zum Beispiel:

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);
Nach dem Login kopieren

Dies liegt daran, dass einige Dezimalzahlen mit einer begrenzten Anzahl von Stellen zu unendlich wiederkehrenden Dezimalzahlen werden können Binärzahlen können nicht dargestellt werden und die Genauigkeit ist beeinträchtigt.

Lösung:

1. Wenn Sie feststellen möchten, ob a-b gleich c ist oder ob a+b gleich c ist, können Sie

if(0.05+0.01-0.06 < 0.0000001)
{
}
Nach dem Login kopieren

verwenden 2. In „Effektiv“ Ein im Buch „Java“ erwähntes Prinzip ist, dass Float und Double nur für wissenschaftliche Berechnungen oder technische Berechnungen verwendet werden können. In kommerziellen Berechnungen müssen wir java.math.BigDecimal verwenden, um

< zu lösen 🎜>
System.out.println((new BigDecimal("2.0")).subtract(
 new BigDecimal("1.9")).doubleValue());
Nach dem Login kopieren
3 . Endlosschleife

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);
 }
Nach dem Login kopieren
A: Der Grund für die Endlosschleife hier ist, dass, wenn i gleich Integer.MAX_VALUE ist, die for-Schleife zuerst ++ ist und dann bestimmt, ob i < ist ;=END. Wenn i eine ganze Zahl ist. Wenn .MAX_VALUE in ++ geändert wird, wird i zu einer negativen Zahl. Der Zyklus geht also weiter.

Der Grund, warum es eine negative Zahl wird, ist, dass int überläuft. Hier kann das Problem durch Ändern von <=END in

4. Was genau wird zurückgegeben?

public static boolean decision() {
 try {
 return true;
 } finally {
 return false;
 }
}
Nach dem Login kopieren
A: Rückgabe falsch. Zu diesem Zeitpunkt ist return true eine nicht erreichbare Anweisung und wird während der Kompilierungsphase optimiert und entfernt.

3. Lassen Sie uns einige Fallenfragen teilen, auf die Sie in Interviews stoßen könnten

Sehen Sie sich den Code an:

int a=5;
  System.out.println("value is"+((a<5)? 10.9:9 ));
Nach dem Login kopieren
Das Ausgabeergebnis ist:


A. Kompilierungsfehler B10.9 C.9 D Keine der oben genannten Antworten ist richtig.


Das Ausführungsergebnis ist:

value is9.0
Nach dem Login kopieren
Weil ((a<5) ? 10.9) es eine 10.9java-automatische Transformation gibt, die auf der Operatorgenauigkeit basiert. Daher werden die folgenden 9 auch zu 9.0.


Wählen Sie also D.


a

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");
  }
Nach dem Login kopieren


Das Ergebnis ist: str1.notequalsstr2 Dies zeigt, dass StringBuffer die Methode equals nicht überschreibt.

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");
  }
Nach dem Login kopieren
Das Ergebnis ist:

fa!=fb
fa.equalfb
db!equalfb Float 型与Double 型肯定不相等
Nach dem Login kopieren
Wenn Sie noch etwas haben, können Sie es gerne hinzufügen.

Referenz:

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


2. baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1KVwBvmlR0UZGHSjD4f6A1yD0d65JL_

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

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

Zusammenfassung

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für das Studium oder die Arbeit von Nutzen sein kann Hinterlassen Sie eine Nachricht, um zu kommunizieren.

Weitere Artikel zu häufigen Fallenfragen und -antworten in Java finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage