java基础之集合Set
2014-05-27 07:05
411 查看
1、集合
当向集合Set中增加对象时,首先集合计算要增加对象的hashcode,根据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在,接着将准备增加到集合中的的对象与该位置上的对象进行equals比较,若返回false,在进行一次散列,将该对象放到散列后计算出的新地址。若返回true,不会再将该对象增加到集合中
2、当重写equals方法时,必须要重写hashcode方法
如果一个类的两个对象,使用equals方法比较时,结果为true,那么这两个对象必须具有相同的hashcode
3、请参考以下代码运行,查看输出结果来理解以上说法
test1和test2比较的是String,由于String重写了equals方法和hashcode方法,所以,String = “abc",和 string = new String("abc")比较equals方法时候是返回true,因此test1和test2输出结果一致;Person类没有重写equals方法,而Person1重写了,所以test3和test4输出结果不一致。
当向集合Set中增加对象时,首先集合计算要增加对象的hashcode,根据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在,接着将准备增加到集合中的的对象与该位置上的对象进行equals比较,若返回false,在进行一次散列,将该对象放到散列后计算出的新地址。若返回true,不会再将该对象增加到集合中
2、当重写equals方法时,必须要重写hashcode方法
如果一个类的两个对象,使用equals方法比较时,结果为true,那么这两个对象必须具有相同的hashcode
3、请参考以下代码运行,查看输出结果来理解以上说法
test1和test2比较的是String,由于String重写了equals方法和hashcode方法,所以,String = “abc",和 string = new String("abc")比较equals方法时候是返回true,因此test1和test2输出结果一致;Person类没有重写equals方法,而Person1重写了,所以test3和test4输出结果不一致。
/** * author Ding Chengyun * 2014-2-23 */ package test; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * @author Ding Chengyun * 2014-2-23 */ public class SetTest { /** * @param args */ public static void main(String[] args) { test4(); } public static void test1() { Set<String> s1 = new HashSet<String>(); s1.add("abc"); s1.add("xyz"); s1.add("abc"); for (Iterator<String> iter = s1.iterator(); iter.hasNext();) { System.out.println(iter.next()); } // 输出: // abc // xyz } public static void test2() { Set<String> s1 = new HashSet<String>(); s1.add(new String("abc")); s1.add(new String("xyz")); s1.add(new String("abc")); for (Iterator<String> iter = s1.iterator(); iter.hasNext();) { System.out.println(iter.next()); } // 输出: // abc // xyz } public static void test3() { Set<Person> s = new HashSet<Person>(); s.add(new Person("zhangsan")); s.add(new Person("lisi")); s.add(new Person("zhangsan")); for (Iterator<Person> iter = s.iterator(); iter.hasNext();) { System.out.println(iter.next().getName()); } // 输出: // zhangsan // zhangsan // lisi } public static void test4() { Set<Person1> s = new HashSet<Person1>(); s.add(new Person1("zhangsan")); s.add(new Person1("lisi")); s.add(new Person1("zhangsan")); for (Iterator<Person1> iter = s.iterator(); iter.hasNext();) { System.out.println(iter.next().getName()); } // 输出: // lisi // zhangsan } } class Person { String name; public Person(String name) { this.name = name; } public String getName() { return name; } } class Person1 { String name; public Person1(String name) { this.name = name; } public String getName() { return name; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof Person1) { Person1 p = (Person1)obj; if (this.name.equals(p.getName())) { return true; } } return false; } public int hashCode() { return name.hashCode(); } }
相关文章推荐
- java基础-- 集合框架 之 Set集合
- Java基础<十一>--->集合之List、Set
- 黑马程序员 java基础 集合框架之Set
- Java集合List,Set,Map基础
- 黑马程序员——Java基础—集合(Set、List)
- Java基础之TreeSet集合使用泛型、比较器排序示例:
- java基础之对List,Map,Set等集合键值对的简单认识
- 黑马程序员——JAVA基础之set集合
- 黑马程序员java基础之集合Set中的TreeSet和泛型
- 黑马程序员:Java基础——Set集合之HashSet
- 黑马程序员 java基础之TreeSet集合
- JAVA基础回顾1 遍历List Set 和Map集合的所有方法
- JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)
- 黑马程序员--java基础--集合框架Set,集合框架map
- Java基础第十四天学习日记_集合、List集合、Set集合
- 黑马程序员_毕向东JAVA基础_集合(2)Collection&&List&&Set&&泛型
- 复习java基础第三天(集合:Collection、Set、HashSet、LinkedHashSet、TreeSet)
- Java集合源码学习(9)_Set接口的基础实现AbstractSet
- Java基础(集合框架——Collection、List、Set、泛型)
- 黑马程序员 java基础之set集合