大数据之路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循环。