全方位剖析Set

来源:互联网 发布:.tm商标域名 编辑:程序博客网 时间:2024/06/06 01:28

在项目中的实战,请见博客“项目实战”



/*

 * Set:无序性(底层存储位置),不可重复

 * 无序性!=随机性

 *不可重复性:当向Set中添加相同的元素时,后面的不可以添加进去

 *                        不仅重写equals()方法还要重写hashCode()方法

 *

 * Set中元素是如何存储:使用Hash算法

 *当向Set中添加对象是,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,

 *此hash值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存在这个位置。若此位置

 *已有对象存储,再通过equals()方法比较这两个对象是否相同,如果相同true则后一个对象则不能添加

 * 若false

 *要求:hashCode()方法要与equals()方法一致

 *        

 * */

 

/*

 *LinkedHashSet:使用链表维护了一个添加进集合中的顺序。导致当我们遍历LinkedHashSet集合

 * 元素时,是按照添加进去的顺序遍历的!

 * */

 

 

LinkedHashSetHashSet的子类

LinkedHashSet根据元素的hashSet值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的

LinkedHashSet插入性能略低于HashSet,但是在迭代访问Set里的全部元素时有很好的性能

LinkedHashSet不允许集合元素重复

package TestContainer;import static org.junit.Assert.*;import java.util.Comparator;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedHashSet;import java.util.Set;import java.util.TreeSet;import javax.crypto.Cipher;import org.junit.Test;/* * Collection接口 * List:存储有序,可重复性 * ArrayList(主要实现类) * LinkedList * Vector(古老实现类,线程安全、但是效率要低于ArrayList) *  Set:存储无序,不可重复元素,Set中常用的方法都是Collection中所定义的 *  HashSet(主要实现类) *  LinkedHashSet *  TreeSet *  * */public class TestSet {/* * TreeSet: 1.向TreeSet中共添加的元素是同一个类 * 2.可以按照添加进集合中元素的指定的顺序遍历,像String,包装类等默认按照从小到大的顺便遍历 * 当新写的类中没有实现Comparable接口时,当向TreeSet中添加此类的对象时, 报ClassCastException * 3.当向TreeSet中添加自定义类的对象时,有两种排序方法 自然排序Comparable 定制排序Comparator 4自然排序 * 要求自定义类实现java.lang.Comparable接口重写CompareTo(Object obj)方法 * 在此方法中指明自定义类的那个属性进行排序 5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回 * 0,虽然仅是两个对象的此属性值 相同,但程序会认为这两个对象时相同的,劲儿后一个对象就不能添加进来。 * 》compareTo()与hashCode()以及equals()三者保持一致 *  * 6.定制排序 *  */@Testpublic void testTreeSet2() {// 1.创建一个实现了Comparator接口的对象// 2.将此对象作为形参传递给TreeSet的构造器中TreeSet set = new TreeSet(new Comparator() {// 向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照哪个属性进行排序@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Customer && o2 instanceof Customer) {Customer c1 = (Customer) o1;Customer c2 = (Customer) o2;int i = c1.getId().compareTo(c2.getId());if (i == 0) {return c1.getName().compareTo(c2.getName());}return i;}return 0;}});// 3.向TreeSet中添加Comparator接口中的compare方法中的参数及类的对象set.add(new Customer("AA", 111));set.add(new Customer("BB", 222));set.add(new Customer("CC", 333));set.add(new Customer("DD", 444));for (Object object : set) {System.out.println(object.toString());}//// @Test// public void testTreeSet1(){// Set set=new TreeSet();////// Person p1=new Person("NN",25 );// Person p2=new Person("GG",24);// Person p3=new Person("NN",23 );// Person p4=new Person("AA",27 );//// set.add(p1);// set.add(p2);// set.add(p3);// set.add(p4);// for(Object string:set){// System.out.println(string);// }// set.add(11);// set.add(333);}/* * LinkedHashSet:使用链表维护了一个添加进集合中的顺序。导致当我们遍历LinkedHashSet集合 * 元素时,是按照添加进去的顺序遍历的! */// @Test// public void testLinkedHashSet() {// Set set=new LinkedHashSet();// set.add(11);// set.add(333);// set.add(null);// set.add("QQ");// set.add("BB");//// Iterator i=set.iterator();// while(i.hasNext()){// System.out.println(i.next());// }//// }///* * Set:无序性(底层存储位置),不可重复 无序性!=随机性 不可重复性:当向Set中添加相同的元素时,后面的不可以添加进去 * 不仅重写equals()方法还要重写hashCode()方法 *  * Set中元素是如何存储:使用Hash算法 当向Set中添加对象是,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值, * 此hash值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存在这个位置。若此位置 * 已有对象存储,再通过equals()方法比较这两个对象是否相同,如果相同true则后一个对象则不能添加 若false * 要求:hashCode()方法要与equals()方法一致 *  */// @Test// public void testHashSet() {// Set set=new HashSet();// set.add(11);// set.add(333);// set.add(null);// set.add("QQ");// set.add("BB");////// Person p1=new Person("GG",23 );// Person p2=new Person("GG",23);// set.add(p1);// set.add(p2);// System.out.println(p1.hashCode());// System.out.println(p2.hashCode());//// System.out.println(p1.equals(p2));//// System.out.println(set.size());//// System.out.println(set);//// }//}




0 0
原创粉丝点击