更多干货见博主个人网站:https://blog.zhenglin.work

运用简单的超市购物车系统,理解重写equals、hashcode的意义,以及map的学习

商品类:

  • 先编写一个商品类,要有编号、名称、价格三个成员变量,然后把getter、setter都写好(可以用ide生成)
package com.zhengling.work;import java.util.HashMap;
import java.util.Map;public class Shopping {String no;String name;double price;public Shopping() {}public Shopping(String no,String name,double price) {this.name = name;this.no = no;this.price = price;}public void setName(String name) {this.name = name;}public  void setNo(String no){this.no=no;}public void setPrice(double price) {this.price = price;}public String getName() {return name;}public String getNo(){return  no;}public double getPrice() {return price;}@Overridepublic String toString() {return "Shopping{" +"编号:'" + no + '\'' +", 名称是:'" + name + '\'' +", 单价是:" + price +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Shopping shopping = (Shopping) o;return no.equals(shopping.no);}@Overridepublic int hashCode() {return no.hashCode();}
}

这个商品类,里面重写了toString方法,方便打印,构造器必须有编号、名称、价格三个参数。为什么要重写equals方法呢,所有类默认都是继承Object类的,Object的equals方法是比较两个对象的内存地址,如果相同则是同一个对象,我们这里商品编号相同 就是同一个东西;

Object里面判断方法:

if (this == o) return true

  • 重写equals只需在上面代码基础上继续丰富就行。

    if (o == null || getClass() != o.getClass()) return false;Shopping shopping = (Shopping) o;return no.equals(shopping.no);

还有一种常见的写法:

if (o instanceof Shopping) {Shopping shopping = (Shopping) o;return no.equals(shopping.no);
}

推荐第一种写法,第一种写法限制对象必须是当前类型及Shopping类型。第二种方法风险在于如果有两个类都继承了Shopping,都有成员变量no,且都没有重写equals,就会判断失误。

  • 为什么要同时重写hashCode方法呢,两方面原因1:如果子类重写的equals方法中判断两个对象是否相等既包括了父类的equals方法,又进行了扩展,hashCode又没有重写,很容易误判为同一个对象(如果用getClass来判断对象类型可以避免这个问题 instanceof来判断类型是避免不了的,上面例子有说明);原因2: 创造出来的对象实例,存放到HashSet、HashMap等集合、map中;首先比较的是hash值(散列值),如果没有重写hashCode,影响效率,并且map中的key是否相同是通过hash值+equals方法来判断的,只重写equals方法、造成未知异常。所以就约定俗成重写equals方法同时重写hashCode方法。举个栗子:有A B两个对象,A.name == B.name,就断定A B是同一个对象,可能不准确,name相同很常见,如果此时A 和B 的hashcode一样,就确定了 是同一个对象。
  • hashCode 最简单的一个重写就是:返回用于比较两个对象是否相等的成员变量的hash值
public int hashCode() {return no.hashCode();
}

也可以参照String Integer源码 里面hashCode的写法。

购物车

购物车用HashMap表示,key表示存放商品,value表示数量。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class ShoppingCart {Map<Shopping,Integer> map = new HashMap<>();public void add(Shopping s){add(s,1);}public  void add(Shopping s,Integer num){map.put(s,num);}public  void deleteShopping(Shopping s){deleteShopping(s,1);}public  void deleteAllShopping(Shopping s){map.remove(s);}public  void deleteShopping(Shopping s,Integer num){if(num < map.get(s)){map.put(s,map.get(s)-num);}else{map.remove(s);}}public void clear(){map.clear();}public void printTotalItem(){Set<Shopping> set  = map.keySet();if(set.size() == 0) System.out.println("购物车为空!!!!!");Iterator<Shopping> it = set.iterator();Shopping sp;double total=0.0;while (it.hasNext()){sp=it.next();System.out.println(sp.no+"\t"+sp.name+" 单价:"+sp.price+"\t数量:"+map.get(sp)+"\t 小计:"+(double)(sp.price*map.get(sp).intValue()));total += (double)(sp.price*map.get(sp).intValue());}System.out.println("\t\t\t\t\t\t\t\t合计:"+total+"元");}public void printShopping(){Set<Map.Entry<Shopping,Integer>> myset = map.entrySet();if(myset.size() == 0) System.out.println("购物车为空");Shopping p;int number;double total=0.0;for (Map.Entry<Shopping,Integer> ent: myset) {p= ent.getKey();number=ent.getValue().intValue();System.out.println(p.name+"的单价是:"+p.price+"\t 数量是 "+number+"\t 小计:"+(double)(p.price*number));total += (double)(p.price*number);}System.out.println("\t\t\t\t\t\t 商品总价是:"+total);}}

里面有增加商品、清除商品、清空购物车、打印清单等功能。

最后写一个简单的测试方法

package com.zhengling.work;public class ShoppingCartTest {public static void main(String[] args) {Shopping sp1 = new Shopping("1001","西瓜",1.0);Shopping sp2 = new Shopping("1002","黄瓜",12.0);Shopping sp3 = new Shopping("2001","苹果",2.0);Shopping sp4 = new Shopping("3001","菠萝",12.0);System.out.println(sp1);System.out.println("-----");ShoppingCart spc = new ShoppingCart();spc.add(sp1);spc.add(sp2,2);spc.add(sp3,4);spc.add(sp4);//spc.printShopping();spc.printTotalItem();System.out.println();spc.printShopping();}
}

然后运行,并验证通过。

运用简单的超市购物车系统,理解重写equals、hashcode的意义相关推荐

  1. JAVA中list.contains()方法,要重写equals(),hashcode()方法

    今天动力节点java培训机构小编为大家介绍"JAVA中list.contains()方法,要重写equals(),hashcode()方法",希望能够帮助正在学习java的零基础学 ...

  2. 重写equals方法(未完)

    equals方法是我们日常编程中很常见的方法,Object中对这个方法的解释如下: boolean equals(Object obj) 指示其他某个对象是否与此对象"相等". 查 ...

  3. 重写equals方法的hashcode_Java equals 和 hashCode 的这几个问题可以说明白吗?

    前言 上一篇文章 如何妙用Spring 数据绑定机制,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦于 ...

  4. 重写equals就必须重写hashCode的原理分析

    因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下. 如果不被重写(原生Object)的hashCode和equals是什么 ...

  5. 不同时重写equals和hashCode又会怎样?

    作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...

  6. why在重写equals时还必须重写hashcode方法

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...

  7. 为什么重写equals时必须重写hashCode方法?

    2019独角兽企业重金招聘Python工程师标准>>> 首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashco ...

  8. Java 细品 重写equals方法 和 hashcode 方法

    前言 在我们需要比较对象是否相等时,我们往往需要采取重写equals方法和hashcode方法. 该篇,就是从比较对象的场景结合通过代码实例以及部分源码解读,去跟大家品一品这个重写equals方法和h ...

  9. 用Java实现一个简单的考试系统

    用Java实现一个简单的考试系统 需求分析 设计思路 编码实现 需求分析 该考试系统可以实现的功能和系统要求应该包括: 学生:登录.考试.考试后查看成绩 老师:出题目(往题库中添加新题目).批阅卷子( ...

最新文章

  1. Linux Wi-Fi 编程API介绍
  2. 关于学习Python的一点学习总结(52->模块就是程序)
  3. 63.不同的路径II
  4. leetcode 454 四数相加
  5. [软考]2013年系统架构设计师备考
  6. 绘制电路图风格的纠结
  7. lodop打印不显示页码_CAD上明明有图,但是打印的时候不显示怎么办?原来要这样设置...
  8. webpack使用教程 翻译自阮一峰(机翻)
  9. C#并发编程之异步编程(二)
  10. SmartSVN for Mac 使用说明
  11. 第十七篇 --ANDROID DisplayManager 服务解析一
  12. python爬虫架构师之路_一位资深 架构师大牛给予Java技术提升的学习路线建议
  13. 在iOS平台使用libcurl
  14. nginx常见配置详解
  15. android 倒计时 动画下载,我的倒计时软件下载-我的倒计时 安卓版v1.1.50-PC6安卓网...
  16. 小米wifi显示无网络连接到服务器,小米路由器wifi连接上不能上网怎么办?
  17. Summary: Rendering Pipeline简单总结一下渲染管线流程图
  18. CISCO ASA思科防火墙常用命令
  19. /home/wxl/jdk1.8.0_91/jre/lib/i386/libawt_xawt.so: libXext.so.6: cannot open shared object file: No
  20. 安卓实现微信阅读桌面式的网格布局

热门文章

  1. 万字干货!核心用户获取和运营策略
  2. 搜索引擎:检索技巧(Google谷歌,百度)+ 常用的资源网站及技巧
  3. FactoryBean of Spring
  4. Scrapy 抓取指数基金6个月前10 名 存到mongodb 中
  5. Kindle电子书整理脚本
  6. window.XMLHttpRequest
  7. 2021年美国大学生数学建模竞赛D题思路分析
  8. 信息学奥赛一本通1278:复制书稿(evd)
  9. Unity3D用状态机制作角色控制系统
  10. python里面入门基础(路漫漫其修远兮,吾将上下而求索)