大數據之路day04_2--經典bug(equals與==比較不一樣,break的跳出不一樣)

1、equals與==比較不一樣java

在實現某我的去5個商場去購物,控制檯輸入是否購物(Y/N)的時候,在比較出了問題,發現不管輸入什麼都是false,後來查閱資料發現,字符串的比較,==和equals不同。spa

先看下面的例子:code

1 String s1,s2,s3 = "abc", s4 ="abc" ;
2 s1 = new String("abc");
3 s2 = new String("abc");
4 
5 s1==s2   是 false      //兩個變量的內存地址不同,也就是說它們指向的對象不 同樣,
6 
7 s1.equals(s2) 是 true    //兩個變量的所包含的內容是abc,故相等。

咱們發現,對象

1、對於字符串變量來講,使用「==」和「equals()」方法比較字符串時,其比較方法不一樣。

 一、「==」比較兩個變量自己的值,即兩個對象在內存中的首地址。

(java中,對象的首地址是它在內存中存放的起始地址,它後面的地址是用來存放它所包含的各個屬性的地址,因此內存中會用多個內存塊來存放對象的各個參數,而經過這個首地址就能夠找到該對象,進而能夠找到該對象的各個屬性)

 二、「equals()」比較字符串中所包含的內容是否相同。

購物的例子:有幸的朋友能夠看看我敲的代碼,歡迎進行補充。blog

 1 package day04;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Shop_bug {
 6     public static void main(String[] args) {
 7         //5家店,每家店限制購買3件衣服
 8         int[] shops = new int[5];
 9         int count = 0;
10         Scanner sc = new Scanner(System.in);
11         
12         for(int i = 0;i<shops.length;i++) {
13             System.out.println("歡迎進入"+(i+1)+"店進行購物!");
14             for(int j = 0;j<3;j++) {
15                 System.out.println("是否選擇購買商品?(Y/N)");
16                 String a = sc.next();
17                 if(a.equals("Y") || a.equals("N") ) {
18                     if(a.equals("Y")) {
19                         count++;
20                     }else{
21                         break;
22                     }     
23                 }else {
24                     System.err.println("上一個的輸入方式有問題而且購買失敗!");
25                     j-=1;
26                 }
27                  
28             }
29             System.out.println("歡迎下次光臨第"+(i+1)+"家店");
30             System.out.println();
31             
32         }
33         System.err.println("您總共購買了"+count+"件衣服!");
34         
35         
36     }
37 
38 }

2、break的跳出不一樣內存

在敲代碼的過程當中,當咱們遇到兩個for循環,內部要判斷的時候,有時候會在判斷不符合的時候跳出循環,進行for循環外的代碼,由於不知道break的做用範圍,致使實現的效果不如題意。字符串

例子:for循環

 

 在這裏我特意將if()裏面寫的是一個真使其執行break,在第一個for循環內,第二個for循環外添加一條輸出語句,結果咱們發現,當執行了break語句,在嵌套for循環中,跳出的是本for循環。class

相關文章
相關標籤/搜索