大数据之路day04_2--经典bug(equals与==比较不同,break的跳出不同)

一、equals与==比较不同

在实现某个人去5个商场去购物,控制台输入是否购物(Y/N)的时候,在比较出了问题,发现无论输入什么都是false,后来查阅资料发现,字符串的比较,==和equals不一样。

先看下面的例子:

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,故相等。

我们发现,

一、对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

 1、“==”比较两个变量本身的值,即两个对象在内存中的首地址。

(java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属性)

 2、“equals()”比较字符串中所包含的内容是否相同。

购物的例子:有幸的朋友可以看看我敲的代码,欢迎进行补充。

 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 }

二、break的跳出不同

在敲代码的过程中,当我们遇到两个for循环,内部要判断的时候,有时候会在判断不符合的时候跳出循环,进行for循环外的代码,因为不知道break的作用范围,导致实现的效果不如题意。

例子:

 在这里我特地将if()里面写的是一个真使其执行break,在第一个for循环内,第二个for循环外添加一条输出语句,结果我们发现,当执行了break语句,在嵌套for循环中,跳出的是本for循环。

猜你喜欢

转载自www.cnblogs.com/wyh-study/p/11815293.html