一、集合
1. 在java.util包中提供的集合接口和具体实现:
1. Collection<E> 集合的根接口,提供了add,remove,size和toArray之类的方法
2. Set<E> 不包含重复元素的集合,它包含的元素不必按照任何特定的顺序存储,扩展了Collection<E>
3. SortedSet<E> 一个集(set) ,它包含的元素都是排好序的,扩展了Set<E>
4. List<E>一个集合,元素按照特定的顺序存储,扩展了Collection<E>
5. Queue<E> 一个集合,它的元素具有隐含的顺序。每个queue都有一个head元素,它是某些具体操作(peek,poo)的操作对象
6. Map<K,V> 键值对,一对一
7. SortedMap<K,V> 它的键都是经过排序的
8. Iterator<E> 一些对象的接口,它可以从集合中返回其中的元素,每次返回一个。它具有从Iterable.iterator方法返回的对象的类型
9. ListIterator<E> List对象的迭代器。
10. Iterable<E> 一个提供Iterator的对象,用于增强型for语句。
11. HashSet<E> 一个作为散列表实现的Set。它有个良好的特性,其增删查对于内容大小相当不敏感
12. TreeSet<E> 一个作为平衡二叉树实现的SortedSet。它的查找和修改比HashSet慢,但可以保证元素是经过排序的。
13. ArrayList<E> 使用可以调整大小的数组实现了List。当List很大时,在头部进行添加和移除代价很大,但是创建和随机访问它的代价很小
14. LinkedList<E> 是List和Queue的双向连接实现,对于任何大小的LinkedList,修改代价都很小,但是随机访问较慢
15. HashMap<E> Map的一个散列表实现,具有快速查找和插入功能非常通用的集合
16. TreeMap<K,V> 将SortedMap实现为一个平衡二叉树,以确保它的元素是根据键排序的。
17. WeakHashMap<K,V> Map的一个散列实现。
二、迭代
1.Collection 扩展了Iterable,而Iterable 又定义了一个iterator方法,该方法返回一个Iterator 接口的对象。
2.Iterator 有三个方法
- hashNext() 如果仍然有元素可以迭代,则返回ture
- next() 返回迭代的下一个元素
- remove() 从迭代指向的collection中移除迭代器返回的最后一个元素
3.示例:一个超过规定长度的字符串都将从Collection中移除
public void removeStr(int maxLength){
HashSet<String> set = new HashSet<String>();
set.add("what");
set.add("what are you doing");
set.add("what the hell");
System.out.println(set);
Iterator<String> it = set.iterator();
while(it.hasNext()){
String str = it.next();
if(str.length() > maxLength){
it.remove();
}
}
System.out.println(set);
}
4.以上示例的步骤:
- 首先是使用Collection的对象实例的iterator获得一个Iterator对象
- 通过Iterator对象实例的hasNext()方法确定是否有元素,如果Colletion的对象里还有元素,则返回ture
- 通过Iterator对象的next()方法得到下一个元素,然后赋值给str,每执行一次next()元素就向后移动一位。
- 如果大于指定长度则使用Iterator对象的remove()方法移除该元素
5.迭代快照(snapshotIterator):
- 当使用迭代器的过程中,如果修改了集合的内容,会影响迭代器方法返回的值。
- 所以使用了快照保证,快照保证返回的元素是Iterator创建时的状态,不会受后来变化的影响
Code(针对ArrayList):
public <T> Iterator<T> snapshotIterator(Collection<? extends T> coll){ return new ArrayList<T>(coll).iterator(); }
快照迭代可以解决迭代时集合发生改变造成的致命错误
三、使用Comparable和Comparator排序
1.java.lang.Comparable 接口可以由任何其对象可以进行排序的类来实现,该接口只有一个单一的方法:public int compareTo(T other)
2.code:
class Person implements Comparable{
private String name;
private String gender;
private int age;
//setget、构造方法
public int comparTo(Person other){
if(this.age > other.getAge())
return 1;
else if(this.age < other.getAge())
return -1;
else
return 0;
}
//这是从小到大排序
}
3.如果需要排序的对象并没有实现Comparable接口,这时必须自己写一个比较器,通过实现Comparator接口
code:
class Tools implements Comparator<Person>{
public int compare(Person o1,Person o2){
if(o1.getAge() > o2.getAge())
return 1;
else if(o1.getAge() < o2.getAge())
return -1;
return 0;
}
}
4.如何确定两个对象是否为同一个:
- 需要重写对象的equasl和hashCode方法
四、Collection接口
1.提供的方法:
- public int size() 返回集合大小,即元素个数
- public boolean isEmpty() 如果当前集合没有任何元素,返回ture
- public boolean contains(Object elem) 如果集合含有elem元素,则返回ture,即集合含有一个元素,并且使用了elem对象作为参数在这个元素上调用了equals方法,则返回true,如果elem是null,元素中也有null,返回true
- public Iterator iterator() 返回可以遍历集合的迭代器
- public Object[] toArray() 返回一个含有集合所有元素的新数组
- public T[] toArray(T[] dest) 返回一个含有该集合中所有元素的数组,如果dest的元素个数大于集合元素,则集合元素后面的第一个元素为null,如果元素个数大于dest,则创建一个更大的和dest具有相同类型的数组
- public boolean add(E elem) 使当前集合持有elem对象,如果添加成功则返回true
- public boolean remove(Object elem) 从集合中一移除一个单一的elem实例
2.所有需要用到等价概念的方法(例如:contains和remove)都在相关对象上调用了equals方法
五、Set和SortedSet
1.Set 接口扩展了Collection,如果一个集合是Set,那么它就不会含有重复的元素,如果将相同的元素加入集合两次,第一次会返回true,第二次返回false,对于remove也是同样的,该集合还包括至多一个null
2.SortedSet 接口扩展了Set,可以指定排序顺序,提供了对于排序集合有用的几种方法:
i.public Comparator <? super E> comparator() 返回当前排序集合使用的Comparator,如果是元素的自然排序,则返回null
ii.public E first() 返回该集合中第一个(最低位的)对象
iii.public E last() 返回该集合中最后一个对象
iv.public SortedSet<E> subSet(E min,E max) 返回该集合的一个视图,这个视图包含了该集合中大于等于min且小于max的元素
v.public SortedSet<E> headSet<E max> 返回该集合的一个视图,这个视图包含了该集合中所有小于max的元素
vi.public SortedSet<E> tailSet<E min> 返回该集合的一个视图,这个视图包含了该集合中所有大于min的元素
3.由子集方法取得的视图背后是原集合,也就是说无论是使用的是子集和原集合,视图都会反映当前最新的状态,我们可以通过复制视图来生成快照
Code:
public<T> SortedSet<T> copyHead(SortedSet<T> set,T max){
SortedSet<T> head = set.headSet(max);
return new TreeSet<T>(head);
}
4.java.util包提供了两个通用的Set实现(HashSet和LinkedHashSet)和一个SortedSet实现(TreeSet)
5.HashSet 是一个用散列表实现的Set
6.LinkedHashSet 扩展了HashSet ,对LinkedHashSet的内容进行迭代时会根据插入顺序返回其中的元素
7.TreeSet 实现了SortedSet接口,提供了如下方法:
1.public TreeSet() 创建一个新的TreeSet,使其根据元素类型的自然顺序进行排序,所有添加到这个集合中的元素必须实现了Comparable接口,并且可以相互比较
2.public TreeSet(Collection <? extends E> coll):等同于先使用TreeSet()然后添加coll元素
3.public TreeSet(Comparator <? exnteds E> comp):创建一个新的TreeSet,使其根据comp指定的顺序进行排序
4.public TreeSet<SortedSet<E> set>:创建一个新的Tree,使其内容与set相同,并且排序方式与set相同