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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JJJD 中级黑马   /  2015-6-22 00:33  /  279 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 JJJD 于 2015-6-22 00:36 编辑

以下代码是HashSet集合中判断输入元素是否重复的代码,但是代码68行,69行,70行有疑问。
问题一:68行和69行都能正常运行,那么这两行有什么不同,哪个才是规范的写法?或者这两个是根据具体情况来选择使用?
问题二:70行报错,是因为等号左边加泛型,右边就一定要泛型吗?还是其他原因?
  1. import java.util.*;


  2. class PersonDemo
  3. {
  4.         private String name;
  5.         
  6.         public PersonDemo(String name)
  7.         {
  8.                 super();
  9.                 this.name = name;
  10.         }
  11.         
  12.         /*
  13.         @Override是伪代码,表示重写,说下面这个方法是从父类/接口 继承过来的,需要你重写一次.
  14.         1.方便阅读
  15.         2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错
  16.         */
  17.         
  18.         //覆写toString()方法
  19.         @Override
  20.         public String toString()
  21.         {
  22.                 return "name= " + name ;
  23.         }
  24.         
  25.         
  26.         
  27.         //覆写hashCode()方法!!!!
  28.         @Override
  29.         public int hashCode()
  30.         {
  31.                 final int prime = 31;
  32.                 int result = 1;
  33.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  34.                 return result;
  35.                
  36.         }
  37.         
  38.         //覆写equals()方法
  39.         @Override
  40.         public boolean equals(Object obj)
  41.         {
  42.                 if (this == obj)
  43.                                 return true;
  44.                 if (obj == null)
  45.                                 return false;
  46.                 if (getClass() != obj.getClass())
  47.                                 return false;
  48.                 PersonDemo other = (PersonDemo)obj;
  49.                 if (name == null)
  50.                 {
  51.                         if (other.name != null)
  52.                                         return false;
  53.                 }
  54.                 else if (!name.equals(other.name))
  55.                                         return false;
  56.                
  57.                 return true;
  58.         }

  59. }

  60. public class HashSetDemo1
  61. {
  62.         public static void main(String[] args)
  63.         {
  64.                 Set<String> s= new HashSet<String>();
  65.                 //Set<String> s= new HashSet<>();
  66.                 //Set<String> s= new HashSet();
  67.                
  68.                 s.add(new PersonDemo("jjj").toString());
  69.                 s.add(new PersonDemo("jjj").toString());
  70.                 s.add(new PersonDemo("jjj").toString());
  71.                
  72.                 System.out.println(s);
  73.         }
  74.         /*
  75.         没有覆写hashcode和 equals方法前,显示三次(一样的)。
  76.         覆写后,只剩一个了!说明覆写后方法起作用了,重复的输入不进去!
  77.         */
  78.         
  79. }
复制代码





4 个回复

正序浏览
guiqulaixi 发表于 2015-6-22 11:26
http://blog.csdn.net/lonelyroamer/article/details/7868820这里有详细的解释,关于你的第一个问题,概括 ...

好的,谢谢!
回复 使用道具 举报
http://blog.csdn.net/lonelyroamer/article/details/7868820这里有详细的解释,关于你的第一个问题,概括地讲,就是泛型检查是针对引用的,所以两者并没有区别,是等同的,当然前者写的更规范。
第二个问题,Set<String> s= new HashSet();单独这么写是没有问题的,但是编译器会给你一个提示
回复 使用道具 举报
有些规则是人定的,我的建议是你先学好必要的知识,在某些问题上浪费时间基本上没有必要,毕竟你开发的时候,旁边不会有同事问你,你的泛型写得好纠结啊。。。。
回复 使用道具 举报
不清楚为什么,但是这样试了一下。也报提示,但是可以将串存入
  1. public static void main(String[] args)
  2.         {
  3.                
  4.                 //Set<String> s= new HashSet<String>();
  5.                 //Set<String> s= new HashSet<>();
  6.                                 //Set<String> s = new HashSet();
  7.                                
  8.                                 Set s= new HashSet<Integer>();
  9.                                 //Set s = new HashSet<>();

  10.                
  11.                 //s.add(new Integer(1));
  12.                 s.add(new PersonDemo("jjj").toString());
  13.                 s.add(new PersonDemo("jjj").toString());
  14.                
  15.                 System.out.println(s);
  16.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马