所有的集合框架并不存放真正的对象,而是持有对象的引用
List与Set都继承自Collection
List的实现类:ArrayList,LinkList,Vector
Set的实现类:HashSet,LinkedHashSet,SortSet(接口),TreeSet(实现SortSet).
首先介绍一下Ordered与Sorted接口的区别
Ordered:按照某种后天规定的顺序遍历其中的所有元素,可以想成队列,按照存入顺序排队。
Sorted:按照天然的顺序进行排序,不受外界影响。即使你输入的顺序是乱序,存储中都会以天然的顺序排序。
列表 List
实现该接口的类均属于Ordered类型。按照索引先后顺序排列的。列表中的索引从0开始
常用方法:
boolean add(Object o)//将O添加到列表的尾部,成功返回true,反之则反
void add(int index,Object o)//在该索引位置添加O,索引原来对象依次后移
boolean addAll(Collection c)//将C列表中的所有元素添加到列表的尾部,成功返回true
boolean addAll(int index,Collection)//将C列表中的元素添加到列表索引位置index处,然后列表中原来的元素一次后移
boolean contains(Object o)//检查列表中是否包含元素O,有返回true
boolean containsAll(Collection c)//测试列表中是否包含列表c中所有元素,有返回true
void clear()//该方法移除列表中所有元素
Object get(int index)//返回列表索引为index处的元素\
int indexOf(Object o)//返回列表中O的第一次出现的索引位置,不存在返回负数
int lastIndexOf(Object o)//返回列表中O最后一次出现的索引位置,不存在返回负数
boolean isEmpty()//判断列表是否为空,空返回true
Object remove(int index)//移除索引位置为index处的元素,并且返回出来,后面的元素依次前移
boolean removeAll(Collection c)//移除测试列表中在C列表中存在的元素,如果移除返回true
boolean retainAll(Collection c)//保留测试列表中在C中存在的元素,其他的全部移除,做一次交集,若有元素移除返回true
Object set(int index,Object o)//将索引为index的元素替代为O,返回被替代的元素
List subList(int fromIndex,int toIndex)//返回一个新的列表,列表中的元素索引为测试列表下标中的[fromIndex,toIndex),左闭右开
int size()//返回列表的元素数
Object[] toArray()//将列表转换为对象数组
//列表转换为数组,这个不是列表中的方法
public static List asList(T a)
//使用实例
String[] s ={"zhangsan","lisi","wangwu"}
List l = Arrays.asList(s);
ArrayList:内部实现依赖数组,对元素的随机访问性能很好,但是如果有大量的删除,插入操作时并不合适。
构造方法:
public ArrayList()//构造一个空的,默认大小是10
public ArrayList(int initialCapacity)//同样是空的,初始容量是initialCapacity
public ArrayList(Collectio c)//将列表c中的元素初始化给新建的列表。
LinkedList:依靠双链表实现的,与ArrayList优缺点刚好相反
构造方法:
public LinkedList()//构造空的对象
public LinkedList(Collection c)//将列表C中的元素初始化赋值给新建的列表
Vector:性能与ArrayList相似,但是它是同步的,多线程同步访问的时候根据需求可以采用,但是会降低性能。
Set
List中可以存在重复的值,而Set中不允许重复值出现。
List中元素的顺序是元素的添加顺序,Set的元素没有顺序。
常用方法:与ArrayList类似,但是凡与index相关的都没有,因为它是无序存放的,所以没有索引
HashSet
既不是Ordered也不是Sorted,元素在其中的存放是完全无序的,HashSet存储对象引用的是按照哈希策略实现的,可以向其中添加null值,但是只能一次.
在存储自定义的类的对象的时候,要复写public int hashCode()与public boolean equals()方法,保证存储的数据唯一性。
构造函数
public HashSet()//空的HashSet对象,初始容量是16
public HashSet(int initialCapacity)//空的HashSet对象,初始容量是initialCapacity
public HashSet(Collection c)//将列表C中的元素初始化给新建的HashSet
LinkedHashSet
是Ordered的,采用双链表实现,元素的存储顺序是元素的插入顺序,其他与HashSet相同。构造函数也是类似,不过多介绍。
SortedSet
继承Set,不但具有Set的所有方法,而且时一个Sorted类型的Set。实现该接口的类将按照元素天然顺序自动排序,不管插入顺序,最终都会按照天然顺序。
常用方法
Object first()//返回SortedSet中的第一个元素
Object last()//返回SortedSet中的最后一个元素
SortedSet headSet(Object toElement)//返回一个小于指定元素的并且不包含该元素的SortedSet
SortedSet tailSet(Object fromElement)//返回一个大于指定元素并且包含该元素的SortedSet
SortedSet subSet(Object fromElement, Object toElement)//返回一个包含起始元素到不包含结束元素的SortedSet
TreeSet
实现SortedSet 接口,保持天然顺序存储
TreeSet没有采用哈希存储策略,因此不会调用hashcode()方法,但是同样不能有重复元素,采用compareTo方法替代equals方法。
TreeSet存储方式按照红黑树的结构进行存储,所以插入新的元素时不会与所有的元素进行比较
存储自定义类的对象时,为了保证有序,必须复写public int compareTo(Object o)方法。
自定义比较器,实现不同的排序方式
class a implements Comparator{
public int compare(Object o1,Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
return s1.age-s2.age;//按学生年龄排序
}
}
main(){
TreeSet ts = new TreeSet(new a());
}
构造函数
public TreeSet()//构造一个空的TreeSet对象
public TreeSet(SortedSet S)//构造一个元素以S中元素为初始内容的TreeSet对象
public TreeSet(Collection c)//构造一个元素以c中元素为初始内容的TreeSet对象
public TreeSet(Comparator c)参数c作为比较器,构造具有比较器的空TreeSet对象
集合的遍历
Iterator
对于List来说,可以利用元素的索引进行遍历,然而Set是没有的,此时需要迭代器实现遍历,所有实现Collection的类都有一个名称为iterator的方法来获取迭代器
获取迭代器方法
Collection cset = new TreeSet();
Collection clist = new ArrayList();
Iterator i1 = cset.iterator();
Iterator i2 = clist.iterator();
常用方法
boolean hasNext()//测试集合中是否还有没有遍历的元素,存在返回true
Object next()//该方法返回下一个将要遍历的元素,通常与hasNext()连用,返回的对象是Object类型的引用,取出时需要自行强转。
void remove()//将下一个要遍历的元素移除。
for-each
for(<引用类型><引用变量> : <集合引用>){}
HashSet hs = new Hash(Collection c);
for(Object o : hs){
String temp = (String)o;
}