java集合框架支持一下两种类型的容器:
一种为了存储一个元素集合,简称集合(collection)。
另一种是为了存储键/值对,简称图(map)。
集合
java 集合框架支持三种主要类型的集合:规则集(Set)、线性表(List)和列队(Queue)。Set用于存储一组不重复的元素,List用于存储一个由元素构成的有序集合,Queue存储用于先进先出方式处理的对象,这些结合的通用特性都被定义在接口中,而它的实现是在具体类中实现的。
Collection 接口是处理对象集合的跟接口。AbstractCollection 抽象类是一个便利类,实现了Collection接口中除了size和iterator之外的所有方法,size和iterator在其子类中实现。
add(o:E):bollean | 向集合中添加新元素 |
addAll(c:Collection<? extends E>):boolean | 将c中多所有元素添加到集合 |
clear():void | 删除集合中的所有元素 |
contains(o:Ojbect):boolean | 如果该集合中包含o则返回true |
contransAll(c:Collection<? extends E>) boolean | 如果该集合包含c中的所有元素则返回true |
equals(o:Objext):boolean | 如果该集合等于另一个集合o则返回true |
hashCode():int | 返回该集合的散列码 |
isEmpty():boolean | 如果该集合没有包含任何元素则返回true |
iterator():Iterator<E> | 返回该集合的元素的所有的迭代器 |
remove(o:Object):boolean | 从集合中删除元素O |
removeAll(c:Collection<? extends E>):boolean | 从该集合汇总删除c中的所有元素(差集) |
retainall(c:Collection<? extends E>):boolean | 保留c和该集合中都有的元素(交集) |
size():int |
返回集合的元素个数 |
toArray():Object[] |
返回集合的元素构成的objext数据 |
规则集(Set)
Set接口扩展了Collection,它没有引入新的方法或常量,只是规定Set的实例不包含重复的元素。AbstractSet 是一个便利类。Set接口有三个具体类:
1、散列类HashTable/
2、链式散列类LinkedHashSet
3、树形集合TreeSet
散列集 HashSet
HashSet 类是一个用于实现Set接口的具体类,可以使用它的无参构造函数来创建一个空的散列集,也可以由一个现有的集合创建散列集。默认情况下,初始容量为16,客座率是0.75.。如果事先知道集合的大小,就可以在构造方法中指定初始容量和客座率。否则,就使用默认的设置。
客座率:测量在增加规则集容量之前,该规则集的饱满程度。当规则集中元素个数大于容量与客座率的的积时,容量就会自动翻倍。
HashSet类可以存放互不相等的任何元素。HashSet以 元素的equals(o:Object):boolean 方法确定元素是否相等,如果想HashSet中添加的相等的元素,HashSet、实例不会报错,但是HashSet实例方法会返回 false
书上说HashSet根据元素的hashCode()值 判断是否是相等的元素,但是在实际测试中我发现如果TestHashSetItem只是重写hashCode()方法add方法会成功,所以我在这里说是根据equals 方法的结果来判断两个元素是否相等的。
package dmc.CollectionTest; import java.lang.*; import java.util.*; public class TestHashSet { public static void main(String[] args) { HashSet<TestHashSetItem> testHashSet = new HashSet<TestHashSetItem>(); boolean addResultOne = testHashSet.add(new TestHashSetItem()); if(addResultOne) pringMessageOneLine("第一次添加成功"); else pringMessageOneLine("第一次添加失败"); boolean addResultTwo = testHashSet.add(new TestHashSetItem()); if(addResultTwo) pringMessageOneLine("第二次添加成功"); else pringMessageOneLine("第二次添加失败"); pringMessageOneLine(“当前集合中共有 ”+testHashSet.size()+" 个元素"); } public static void pringMessageOneLine(Object o){ System.out.println(o); } } class TestHashSetItem { @Override public int hashCode(){ return new Integer(12).hashCode(); } @Override public boolean equals(Object o) { if( o instanceof TestHashSetItem) return o.hashCode()==this.hashCode(); else return false; } }
通过对 addAll(c:Collection<E>):bollean 方法的测试发现 addAll方法 只有当 c 中的所有元素都没有添加成功的前提下才会返回false 否则,只要有一个元素添加成功都都会返回true。因此当需要判断是否将参数c中所有所有元素都添成功时不能仅以返回结果为标准应该是检验当前集合的size()是否等于两个集合的size()之和来判断。以下是测试代码。
package dmc.CollectionTest; import java.lang.*; import java.util.*; public class TestHashSet { public static void main(String[] args) { HashSet<TestHashSetItem> testHashSet = new HashSet<TestHashSetItem>(); boolean addResultOne = testHashSet.addAll(new HashSet<TestHashSetItem>(){{ add(new TestHashSetItem(1)); add(new TestHashSetItem(2)); add(new TestHashSetItem(3)); add(new TestHashSetItem(4)); }}); if(addResultOne) pringMessageOneLine("第一次添加成功"); else pringMessageOneLine("第一次添加失败"); boolean addResultTwo = testHashSet.addAll( new HashSet<TestHashSetItem>(){{ add(new TestHashSetItem(3)); add(new TestHashSetItem(3)); add(new TestHashSetItem(5)); add(new TestHashSetItem(6)); }}); if(addResultTwo) pringMessageOneLine("第二次添加成功"); else pringMessageOneLine("第二次添加失败"); System.out.println(testHashSet.size()); } public static void pringMessageOneLine(Object o){ System.out.println(o); } } class TestHashSetItem { private int _data =12; public TestHashSetItem(){ } public TestHashSetItem(int data){ _data=data; } public void setData( int data){ _data=data; } @Override public int hashCode(){ return _data; } @Override public boolean equals(Object o) { if( o instanceof TestHashSetItem) return o.hashCode()==this.hashCode(); else return false; } }
HashSet 还需要注意的一点就是 HashSet存储元素的方式是无顺序的。但是JAVA提供了LinkedHashSet以支持散列集排序。
链式散列集LinkedHashSet
LinkedHashSet 用一个链表实现来扩展HashSet类,它支持对规则集内的元素排序。LinkedHashSet中的元素可以按照插入他们的书序提取。当然如果我们不需要知道元素的顺序应该使用HashSet而不是LinkedHashSet 因为HashSet要比LinkedHashSet更高效。
树形集TreeSet
TreeSet 实现了SortedSet和NavigableSet接口。 SortedSet接口可以确保规则集中的元素师有序的,它还提供方法first()和last() 返回规则集中的第一个元素和最后一个元素,以及headSet(toElement)和tailSet(fromElemt)返回规则集中小于toElement和大于或者等于fromElement的那一部分。
NavigableSet接口扩展了SortedSet接口,提供导航方法 lower(e) 、 floor(e)、ceiling(e)和 higher(e)返回小于,小于等于、大于等于以及大于一个给定元素的所有元素,如果没有这样的元素就返回 null。方法pollFirst()和pollLast() 分别返回并删除规则集中的第一和最后一个元素。
创建SortedSet的实例需要其元素对象是可比较的。可以使用两种方式比较对象,一种是对象本身实现Comparable接口,另一种是提供一个比较器(Comparator)
第一篇就写到这里,由于这个电脑上没有安装uml工具 这里还欠一个规则集的UML图,以后补上。