学习笔记---使用override注解

在学习或者做东西,都懒得动手记,得习惯记下来才好...

最近在看《Effective Java》,确实对我有很大的提高,把自己看到和想到的东西写下来,标记...

1. 坚持使用override注解.

 1 public class Bigram {
 2
 3     private final char first;
 4     private final char second;
 5     public Bigram(char first,char second) {
 6         this.first = first;
 7         this.second = second;
 8     }
 9
10     public boolean equals(Bigram bigram) {
11         return bigram.first == first && bigram.second == second;
12     }
13
14     public int hashCode() {
15         return 31*first + second;
16     }
17
18     public static void main(String[] args) {
19         Set<Bigram> bigrams = new HashSet<Bigram>();
20         for(int i=0;i<10;i++){
21             for(char ch=‘a‘;ch<=‘z‘;ch++){
22                 bigrams.add(new Bigram(ch, ch));
23             }
24         }
25         System.out.println(bigrams.size());
26     }
27
28 }

这是其中的一段例子.

260

结果很有意思,为什么是260而不是26呢?

bigrams采用的集合类型是HashSet,为什么没有去掉重复的元素呢?

 1     /**
 2      * Adds the specified element to this set if it is not already present.
 3      * More formally, adds the specified element <tt>e</tt> to this set if
 4      * this set contains no element <tt>e2</tt> such that
 5      * <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>.
 6      * If this set already contains the element, the call leaves the set
 7      * unchanged and returns <tt>false</tt>.
 8      *
 9      * @param e element to be added to this set
10      * @return <tt>true</tt> if this set did not already contain the specified
11      * element
12      */
13     public boolean add(E e) {
14     return map.put(e, PRESENT)==null;
15     }

看看HashSet的add方法的底层说明:3~5行说明了add元素e的条件:set中不存在元素e2( e==null;e2==null;e.equals(e2) )

在元素都不为null的情况下,说明 这行代码 e.equals(e2) 与我们想要的结果不一样.

那么再来看看源代码中,为什么代码中equals没有起到我们想要的作用呢?

1     public boolean equals(Object obj) {
2     return (this == obj);
3     }

这是Object类中的equals方法,仔细看,代码中原本想要重写equals方法,可是却重载了equals方法.

这样的话,在进行这行代码( e.equals(e2) )时,就调用了Object类的equals方法,而Object类的equals方法是比较对象同一性的,即( e==e2 )

例子中:这行代码:bigrams.add(new Bigram(ch, ch)); 每次添加都会new Bigram(ch,ch),每一个Object都不一样,自然循环多少次,就add多少Object了。

而如果加了注解@override,现代的IDE就会报错:The method equals(Bigram) of type Bigram must override or implement a supertype method

所以呢,应该在你想要覆盖父类声明的每个方法声明中使用override注解.

学习笔记---使用override注解

时间: 2024-08-25 14:26:45

学习笔记---使用override注解的相关文章

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型參数绑定,包含数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品.批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形參,方法形參使用数组接收页面请求的多个商

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定 springmvc学习笔记11-springmvc注解开发之简单参数绑定 spring参数绑定过程 默认支持的类型 简单类型 pojo绑定 自定义参数绑定实现日期类型绑定 springmvc和struts2的区别 本文主要介绍注解开发的简单参数绑定,包括简单类型.简单pojo以及自定义绑定实现类型转换 spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到contro

springmvc学习笔记(13)-springmvc注解开发之集合类型参数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型参数绑定 springmvc学习笔记13-springmvc注解开发之集合类型参数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型参数绑定,包括数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品,批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商

Spring学习笔记-springMVC基于注解的控制器(Demo)

springmvc的整体运行流程图: 基于@Controller和@RequestMapping是springmvc示例代码 在web.xml中配置springmvc核心分发器DispatcherServlet .... <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </

【学习笔记】Hibernate 注解 (Y2-1-9)

Hibernate注解 1.什么是注解在类上或者方法上打上其他类型的类型元数据 @标志 使用过的注解: @override  方法重写 @Test Junit 单元测试 @Before 单元测试 @After 单元测试 Hibernate中常用的注解 [email protected] 将一个类声明为持久化类 [email protected] 声明持久化类的标识属性 [email protected] 定义标识属性值的生成策略,默认为native [email protected] 将属性映射

Spring学习笔记——关于Spring注解扫描不能注入new对象问题

这几天Leader让我用工厂模式对部分业务逻辑代码进行重构,过程是痛苦的(这里就不详细说了),结果很甜蜜.下面记录一下我在重构过程中遇到一个问题. 部分代码如下: @service(orderFactory) public class OrderFactory implements IOrderFactory{ public OrderCreate factory(String type){ if(type != null && type.indexOf("1")! =

SpringMVC学习笔记一:采用注解式搭建简单springMVC环境

搭建的环境使用的是maven项目 项目目录树: 搭建环境使用的jar包,pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.or

Java学习笔记十(注解)

1.介绍 注解是JavaSE5.0開始提供的一项新特性,利用此特性能够通过特定的注解标签为程序提供一些描写叙述性信息. 这些描写叙述性信息能够在编译或执行时为编译器.执行环境提供附加的信息.从而简化开发.  2.自己定义注解 1.声明自己的注解 @interface <注解名称>{<注解属性类型> <注解属性名称>[default<默认值>]} <span style="font-family:SimSun;font-size:18px;&q

Spring学习笔记-springMVC基于注解的控制器(基本概念)

在spring2.5以前的版本中,实现一个mvc的Controller的唯一方法就是实现Controller接口,一个控制器只能响应一个客户端请求,在2.5以后的版本中,spring引入了注解,利用注解简化配置文件,利用注解实现bean的声明和依赖注入(DI),注解也同样被引入到spring的web模块springMVC中. 使用基于注解的控制器有两个优点 第一:一个控制器可以处理多个动作,而不是像以前那样一个控制器只能处理一个请求 第二:省略的在配置文件中对bean的声明和依赖注入,显著提高开