A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

       之前学过C,开课两天了。感觉Java前两天的基础跟C很像,于是就想着打一份之前用C打过的案例。
       其他不多说了,先上遇到麻烦的部分:                System.out.println("\n\n请输入购买的商品及其数量,于购物完成后输入提交订");
                String s0 = "提交订单";
                while (true)
                {
                        String s1 = sc.next();
                        b == s0;
                                if (b)//判断是否完成购物
                                        break;
                                if (!b)
                                        {
                                                number = sc.nextInt();
                                                if (s1==renNam))//判断购买的是什么商品
                                                {
                                                        renNumber = renNumber + number;
                                                        xiang1 =1;
                                                }
                                                if (s1==yaoName)
                                                {
                                                        yaoNumber = yaoNumber + number;
                                                        xiang2 =1;
                                                }
                                                if (s1==douName)
                                                {
                                                        douNumber = douNumber + number;
                                                        xiang3 =1;
                                                }
                                        }

                }
               
                System.out.println("\n购物完成\n");

以上是有问题的部分,别问我是咋找出来的
   然后竟然怀疑通过scanner输入的字符串和源代码中的字符串不同,为了证明这个命题还专门做了个实验————>(别笑我)<————
    import java.util.Scanner;
    public class demo
    {
            public static void main(String[] args)
            {
                    Scanner sc = new Scanner(System.in);
                    String a = "真";
                   String a1 = "真";
                  //String a2 = "假";
                   String b = sc.next();
                   boolean c = b==a;
                   boolean c0 = b.equals(a);
                   boolean c1 = a1==a;
                  //boolean c2 = a2==a;
                  //System.out.println(a);
                  System.out.println(b);
                  System.out.println(c);
                  System.out.println(c0);
                  System.out.println(c1);
                //System.out.println(c2);
                //以上证明通过Scanner输入的字符串与源代码中的字符串不同

  然后拿着这个实验去找老师了,这时候才知道竟然还有equals这么一回事,然后老师讲了好长的时间存储方式的事,
可能是之前有C的基础,有种先入为主的习惯,所以感觉好难理解。我就只好死记硬背成equals比较字符串内容,==比较int型了。
至于比较地址什么的,也许用到的时候就能懂了。经过修改后的代码就成了下面这样:
                System.out.println("\n\n请输入购买的商品及其数量,于购物完成后输入提交订单");
                String s0 = "提交订单";
                while (true)
                {
                        String s1 = sc.next();
                        b = s1.equals(s0);
                                if (b)//判断是否完成购物
                                        break;
                                if (!b)
                                        {
                                                number = sc.nextInt();
                                                if (s1.equals(renName))//判断购买的是什么商品
                                                {
                                                        renNumber = renNumber + number;
                                                        xiang1 =1;
                                                }
                                                if (s1.equals(yaoName))
                                                {
                                                        yaoNumber = yaoNumber + number;
                                                        xiang2 =1;
                                                }
                                                if (s1.equals(douName))
                                                {
                                                        douNumber = douNumber + number;
                                                        xiang3 =1;
                                                }
                                        }

                }
               
                System.out.println("\n购物完成\n");

   然后就能运行出来了。可是还是感觉有点稀里糊涂的,可能是有点钻牛角尖的小毛病吧,第一次发帖好激动,不知道说什么了,233333。有没有
  把equals和==理解透的跟我通俗的讲讲。还有就是什么时候可能用到==比较String字符串,有没有一些简单的案例用到了这个,
  让我敲一敲呗!!!感谢各位大神了!!!

捕获.PNG (109.13 KB, 下载次数: 41)

错误程序

错误程序

5 个回复

倒序浏览
我所知道的是equals比较的是字符串的内容,而 == 比较的是字符串的地址值
回复 使用道具 举报
liangsai 发表于 2016-3-19 19:53
我所知道的是equals比较的是字符串的内容,而 == 比较的是字符串的地址值

恩,老师也是这样说的,但感觉Java的没存处理方式有点怪怪的
回复 使用道具 举报
其实equals底层用的就是==号进行判断,首先判断两个String类型的对象的地址是否相等,相等则返回true,否则在比较String中每个字符的值是否对应相等,如果其中有一个不相等,就返回false,否则返回true

点评

原来还有这么一步,但第一步有啥用呢?地址肯定不一样呗  发表于 2016-3-20 12:34
回复 使用道具 举报
Newsir 发表于 2016-3-19 23:40
其实equals底层用的就是==号进行判断,首先判断两个String类型的对象的地址是否相等,相等则返回true,否则 ...

不好意思这几天课程太紧了没来的即回复,至于第一步。首先String类型的数据是存放在常量池中的,也就是String类型数据是常量,比如String str = "a"+"b"; String str2 = "ab"; System.out.println(str==str2) 返回true,==比较的就是地址值,说明他们的地址是相同的。但是String str3 = str+"c";String str4 ="abc";System.out.println(str3==str4)返回值是false,说明地址值不一样,为什么会这样呢?这就和字符串的常量池优化有关,意思就是说第一种情况时在编译器就将a和b合并成常量相连的结果然后创建了一个指向ab值地址的字符串变量,而后一句其实就是再将ab的地址值给str2,。第二种情况并没有优化情况,简单点说就是创建了两个String对象,地址值当然也就不一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马