全方位剖析Set
来源:互联网 发布:.tm商标域名 编辑:程序博客网 时间:2024/06/06 01:28
在项目中的实战,请见博客“项目实战”
/*
* Set:无序性(底层存储位置),不可重复
* 无序性!=随机性
*不可重复性:当向Set中添加相同的元素时,后面的不可以添加进去
* 不仅重写equals()方法还要重写hashCode()方法
*
* Set中元素是如何存储:使用Hash算法
*当向Set中添加对象是,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,
*此hash值决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存在这个位置。若此位置
*已有对象存储,再通过equals()方法比较这两个对象是否相同,如果相同true则后一个对象则不能添加
* 若false
*要求:hashCode()方法要与equals()方法一致
*
* */
/*
*LinkedHashSet:使用链表维护了一个添加进集合中的顺序。导致当我们遍历LinkedHashSet集合
* 元素时,是按照添加进去的顺序遍历的!
* */
LinkedHashSet是HashSet的子类
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
- 全方位剖析Set
- 全方位剖析 Android 4.3
- 全方位剖析List
- 全方位剖析“清华同方”,脉络千里!!
- Silverlight 4之全方位剖析:多线程编程
- extern 修饰全局变量深度全方位剖析
- 关于Java 中Enum 的全方位剖析
- 国内Scala专家邓草原:全方位剖析Scala编程语言
- 全方位剖析QT 面试题 胡峰原创
- 字符集和字符编码(Charset & Encoding)全方位剖析
- STL 之 set 源码剖析
- STL源码剖析 算法 set
- 【源码】Set集合源码剖析
- 新版蜀山剑侠传3D立体格斗全方位剖析
- 全方位剖析LVS及基于LVS的NAT、DR模型实现
- STL源码剖析——set
- 全方位理论
- STL源码剖析之map set multimap multiset【2013.12.10】
- android设置控件背景透明、半透明的方法
- 【vim】【深入】【001】vim 和 他的辅助工具们
- 获取view的坐标值
- Eclipe常用快捷键
- 学习MongoDB 十: MongoDB聚合(Map-Reduce)(二)
- 全方位剖析Set
- 笔试题62. LeetCode OJ (49)
- ClassNotFoundException(显式类装载) 和 NoClassDefFoundError(隐式类装载) 区别
- LinearLayout(线性布局)
- Linux下redis安装
- R语言之作饼图并保存
- Matlab学习笔记-数据和函数可视化
- zookeeper客户端执行回调方式初步探究
- ==&&equals的区别