1.我定义Set hashset=new HashSet(); 和我定义HashSet hashset=new HashSet();区别在哪里?什么情况下必须用前者?2.比如说我定义了一个student类,然后我创建了几个student对象将其加入hashset,如HashSet hs1=new HashSet(new Student("jack"));
  HashSet hs2=new HashSet(new Student("tom"));    HashSet hs3=new HashSet(new Student("jack"));
  现在我的hs1 和 hs3的name是相同的,但是如果我不自己定义eqauls和hashcode方法的话是不会把hs3给舍弃的!是吧?但是为什么我把他定义再
  了TreeSet中就能自动舍弃呢?再treeset中默认的舍弃规则是什么?也就是说再treeset中如果我不自己定义,系统在什么情况下将舍弃"相同"的对象?3.Map中的key和value是必须同时插入?也就是说只能用put?4.因为刚学习集合,还有很多不懂的地方,大家要觉得集合中还有哪些是值得注意的地方可以告诉我,谢谢大家指教!!

解决方案 »

  1.   

    我回答第三个:是。Map的意思就是映射。既然是映射那么总要有两个东西,一个映射一个,对吧?
      

  2.   

    1>Set set=new HashSet(); VS HashSet hashset=new HashSet();
       前者涉及到多态,前者变量set 可以等于new HashSet(),也可以等于new TreeSet()(只要是Set的子类都可以) ,而后者只   能 等于new HashSet(),前者比后者更灵活
    2>吃完饭再给你详细说下
    3>Map中的key和value是必须同时插入?也就是说只能用put? 对
    4>遇到问题在说也不迟
      

  3.   

    1.我定义Set hashset=new HashSet(); 和我定义HashSet hashset=new HashSet();区别在哪里?什么情况下必须用前者? 
    用前者,代码的可读性更强,如果以后要换个集合 更方面修改2.比如说我定义了一个student类,然后我创建了几个student对象将其加入hashset,如HashSet hs1=new HashSet(new Student("jack")); 
      HashSet hs2=new HashSet(new Student("tom"));    HashSet hs3=new HashSet(new Student("jack")); 
      现在我的hs1 和 hs3的name是相同的,但是如果我不自己定义eqauls和hashcode方法的话是不会把hs3给舍弃的!是吧?但是为什么我把他定义再 
      了TreeSet中就能自动舍弃呢?再treeset中默认的舍弃规则是什么?也就是说再treeset中如果我不自己定义,系统在什么情况下将舍弃"相同"的对象? 
    舍弃的原因是JAVA规定 接口为List的元素是[color=#0000FF]有序不能重复的,而Set是一个不包含重复元素的无序的[/color]3.Map中的key和value是必须同时插入?也就是说只能用put? 
    你可以查下API里面有很多方法自己研究下4.因为刚学习集合,还有很多不懂的地方,大家要觉得集合中还有哪些是值得注意的地方可以告诉我,谢谢大家指教!!
    主要就是 掌握LIST的结构,比如哪些属于LIST 哪些属于SET 
    多运用集合里的方法。
      

  4.   

    4.因为刚学习集合,还有很多不懂的地方,大家要觉得集合中还有哪些是值得注意的地方可以告诉我,谢谢大家指教!! 
    主要就是 掌握集合的结构,比如哪些属于LIST 哪些属于SET 
    多运用集合里的方法。
      

  5.   

    我回答第四个:范围仅针对常见的集合类与接口,只保证一般适用,不保证全部适用:
    是否是接口:
    对于Set : SortedSet
    对于Map : SortedMap
    对于List: null是接口,
    其余可理解为类 
    对于是否同步:
    几个常见的集合类里对于Set: LinkedHashSet
    对于Map: HashTable
    对于List: Vector是同步的
    其余可理解为是不同步的.
    对于是否排序:
    对于Set: HashSet
    对于Map: HashMap,HashTable
    对于List: null是不保证元素的顺序的.
    其余可普遍理解为自然顺序或按自定义的Comparable接口实现排序,或按插入的先后排序对于是否允许null值:对于Set: HashSet, LinkedHashSet
    对于Map: HashMap
    对于List: All允许null值.
    其余可理解为不允许有null元素.
      

  6.   


    public class Student implements Comparable{
    private String strName;
    private String strID;//唯一
    public Student() {//无能构造即使你不用也给它写上

    } public Student(String strName, String strID) {

    setStrName(strName);
    setStrID(strID);
    this.strID = strID;
    }

    public String getStrID() {
    return strID;
    }
    public void setStrID(String strID) {
    this.strID = strID;
    }
    public String getStrName() {
    return strName;
    }
    public void setStrName(String strName) {
    this.strName = strName;
    } @Override
    public String toString() {
    return getStrID()+":"+getStrName();
    } public int compareTo(Object obj) {
    /********你不写下面的语句看能不能加上对象*************/
    if(obj!=null){
    if(obj instanceof Student){
    Student tempObj =(Student)obj;
    return tempObj.getStrID().compareTo(this.getStrID());
    }
    }
    /**********************************/
    return 0;
    }
    }
      import java.util.HashSet;
    import java.util.Set;
    import java.util.TreeSet;public class Test {
    public static void main(String[] args) {
    Set<Student> set = new HashSet<Student>();
    /***********One****************/
    set.add(new Student("Zhang","45454"));
    set.add(new Student("Zhang","45454"));

    for(Student stuObj:set){
    System.out.println(stuObj);
    }
    System.out.println("***************************");
    /************Two********************/
    set = new TreeSet<Student>();//我这里没有再定义变量,直接用的是上面的
    //如果用TreeSet,Student又没有实现Comparable会出现运行异常

    set.add(new Student("Zhang","45454"));
    set.add(new Student("Wang","5465456"));
    set.add(new Student("Zhang","454544"));
    //如果你实现了Comparable而又没有自己重写里面的方法,这三个对象只能加上一个
    for(Student stuObj:set){
    System.out.println(stuObj);
    }



    }}
      
      

  7.   

    可能是你没完全理解我的意思,也可能是我没理解你的意思!
    你上面的代码也写到了,你往Hashset中加入了两个对象是吧?
    set.add(new Student("Zhang","45454"));
    set.add(new Student("Zhang","45454"));
    set是不允许重复的对吧?但是他不知道我上面这两个是相等的,所以我要在student类中重写equals和hashcode方法才能不让第二个对象加入进去对吧?我现在想问为什么我吧上面同样的对象加入到treeset中我不用重写equals和hashcode方法他就能知道我这两个对象是相等的,就不让我吧第二个对象加进去?不知道说明白没有?
      

  8.   

    刚才是回复7楼的,对了,7楼你说://如果你实现了Comparable而又没有自己重写里面的方法,这三个对象只能加上一个为什么我运行你的代码3个对象都加进去了?
      

  9.   

    我理解你"//如果你实现了Comparable而又没有自己重写里面的方法,这三个对象只能加上一个"
    这句话的意思是如果我实现了Comparable接口,而且我加入的对象又相同!比如
    set.add(new Student("Zhang","45454"));
    set.add(new Student("Zhang","45454"));
    set.add(new Student("Zhang","45454"));
    那么三个只能加进去一个而你上面三个明显是不一样的,那为什么只能加进去一个呢?我问的就是如果对象一样,为什么我继承了comparaable接口它就能直接给我舍弃?
      

  10.   


    我不知道实现了compareTo(Object obj)不重写会怎么样但是如果你改写为 return 0;就肯定只能加一个改为
    public class Student implements Comparable<Student>
    --------------------------------中间一样------------------------------------
    public int compareTo(Student obj) {
           Student tempObj = obj;
           return tempObj.getStrID().compareTo(this.getStrID());
     }
      

  11.   


    原因是ty_tarena_pger兄所实现的compareTo方法只比较了StrID
    如果StrID相同,两个对象则视为相同,如果你想比较全部属性也行,全看你的程序需要实现全部属性
    public int compareTo(Object obj) { 
          Student tempObj = (Student)obj;
          if(tempObj.getStrID().compareTo(this.getStrID())==0)
          {
              return tempObj.getStrName().compareTo(this.getStrName()); 
          }  
          return tempObj.getStrID().compareTo(this.getStrID()); 
      

  12.   

         domsn兄说的很明白了,你应该明白:
        TreeSet判定两个对象是否相等的标准不是equals和hashcode方法,而是Comparabe接口的compareTo()方法或
    Comparator接口的compare()方法
      

  13.   

    1.我定义Set hashset=new HashSet(); 和我定义HashSet hashset=new HashSet();区别在哪里?什么情况下必须用前者? 
    ※这个问题已经很朋友说得很清楚了,但我还补充一点:***Set,都是实现的Set接口。只要你明白了接口的用处,你也就明白了两者的区别,什么情况下用接口的实例,什么时候用实现类的实例。你能学到这里,我相信你已经学过JAVA的最基础的东西了(接口)。基础很重要,要是基础不是很扎实,我建议你好好巩固一下。[/color]
    2.比如说我定义了一个student类,然后我创建了几个student对象将其加入hashset,如HashSet hs1=new HashSet(new Student("jack")); 
      HashSet hs2=new HashSet(new Student("tom"));    HashSet hs3=new HashSet(new Student("jack")); 
      现在我的hs1 和 hs3的name是相同的,但是如果我不自己定义eqauls和hashcode方法的话是不会把hs3给舍弃的!是吧?但是为什么我把他定义再 
      了TreeSet中就能自动舍弃呢?再treeset中默认的舍弃规则是什么?也就是说再treeset中如果我不自己定义,系统在什么情况下将舍弃"相同"的对象? 
    [color=#FF0000]※这个问题,别的我就再多说了,我要说的是equals 与 hashCode.
    大家都知道,equals是比较的两个对像的物理地址。hashCode是干什么用的呢?它是计算对像的物理地址用的。
    hs1与hs3中 new Student()虽然在内存中是两片内存几个空间,但你别忘了,它们的数据并不是存在这两片内存空间里的。这么说吧:studdent类中有个成员变量叫:name,通过构造函数把“jack”传给他。第一次用到“jack”这个字符串时,JAM会到字符中缓冲池里去找,没找到,JVM会在字符串缓冲池中把字符串“jack“中进去,然后将new 出来的student实例中的name指向字符串缓冲池中的“jack”,当第二次new student时,传的参数还是“jack”,这里新new出来的实例中的name直接指向缓冲池中的“jack”,这里hashcode计算出来的两个student实例物理地址就是相同的。
    set的实现类,他过滤重复的规则很简单,就是调用对像的hsahcode方法计算对像的物理地址是否存在,如果存在,则过滤掉。
    3.Map中的key和value是必须同时插入?也就是说只能用put? 
    ※你不同时插入也行,map.put("KEY1",null);这是先插入一个Key,给Key付值:map.put("KEY1",“www.csdn.net”);
    4.因为刚学习集合,还有很多不懂的地方,大家要觉得集合中还有哪些是值得注意的地方可以告诉我,谢谢大家指教!!
    ※vector,List,Set,Map,就这几个东西,上网找一个,讲他们几个的文章很多。