代码示例:
/** * Collection接口 * |-------List接口 * |--------ArrayList(主要的实现类) * |--------LinkedList(对于频繁的插入、删除操作) * |--------Vector(古老的实现类、线程安全的,但效率低于ArrayList) * |-------Set接口:存储无序、不可重复的元素.Set中常用的方法都是Collection下定义的。 * |--------HashSet(主要的实现类) * |--------LinkedHashSet * |--------TreeSet * * Set:存储的元素是无序的,不可重复的! * 1.无序性:无序性 != 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。 * 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去. * * 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。进而保证Set元素的不可重复性! * * Set中的元素是如何存储的呢?使用哈希算法。 * 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值 * 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置 * 已经有对象存储,再通过equals()方法比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 * 万一返回false呢,都存储。(不建议如此) * > 要求:hashCode()方法要与equals()方法一致。 * * */ public class TestSet { /** * LinkedHashSet:使用链表维护了一个添加进集合中的顺序,导致当我们遍 * 历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的! * * LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能 * */ @Test public void test2(){ Set set = new LinkedHashSet(); set.add(123); set.add(456); set.add("AA"); set.add("AA"); set.add("BB"); set.add(null); Iterator iterator = set.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } } }
结果:
123
456
AA
BB
null
内存图: