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.因为刚学习集合,还有很多不懂的地方,大家要觉得集合中还有哪些是值得注意的地方可以告诉我,谢谢大家指教!!
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.因为刚学习集合,还有很多不懂的地方,大家要觉得集合中还有哪些是值得注意的地方可以告诉我,谢谢大家指教!!
前者涉及到多态,前者变量set 可以等于new HashSet(),也可以等于new TreeSet()(只要是Set的子类都可以) ,而后者只 能 等于new HashSet(),前者比后者更灵活
2>吃完饭再给你详细说下
3>Map中的key和value是必须同时插入?也就是说只能用put? 对
4>遇到问题在说也不迟
用前者,代码的可读性更强,如果以后要换个集合 更方面修改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
多运用集合里的方法。
主要就是 掌握集合的结构,比如哪些属于LIST 哪些属于SET
多运用集合里的方法。
是否是接口:
对于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元素.
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);
}
}}
你上面的代码也写到了,你往Hashset中加入了两个对象是吧?
set.add(new Student("Zhang","45454"));
set.add(new Student("Zhang","45454"));
set是不允许重复的对吧?但是他不知道我上面这两个是相等的,所以我要在student类中重写equals和hashcode方法才能不让第二个对象加入进去对吧?我现在想问为什么我吧上面同样的对象加入到treeset中我不用重写equals和hashcode方法他就能知道我这两个对象是相等的,就不让我吧第二个对象加进去?不知道说明白没有?
这句话的意思是如果我实现了Comparable接口,而且我加入的对象又相同!比如
set.add(new Student("Zhang","45454"));
set.add(new Student("Zhang","45454"));
set.add(new Student("Zhang","45454"));
那么三个只能加进去一个而你上面三个明显是不一样的,那为什么只能加进去一个呢?我问的就是如果对象一样,为什么我继承了comparaable接口它就能直接给我舍弃?
我不知道实现了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());
}
原因是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());
}
TreeSet判定两个对象是否相等的标准不是equals和hashcode方法,而是Comparabe接口的compareTo()方法或
Comparator接口的compare()方法
※这个问题已经很朋友说得很清楚了,但我还补充一点:***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,就这几个东西,上网找一个,讲他们几个的文章很多。