JAVA集合(一)

一、集合

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 有三个方法

  1. hashNext() 如果仍然有元素可以迭代,则返回ture
  2. next() 返回迭代的下一个元素
  3. 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.以上示例的步骤:

  1. 首先是使用Collection的对象实例的iterator获得一个Iterator对象
  2. 通过Iterator对象实例的hasNext()方法确定是否有元素,如果Colletion的对象里还有元素,则返回ture
  3. 通过Iterator对象的next()方法得到下一个元素,然后赋值给str,每执行一次next()元素就向后移动一位。
  4. 如果大于指定长度则使用Iterator对象的remove()方法移除该元素

5.迭代快照(snapshotIterator):

  1. 当使用迭代器的过程中,如果修改了集合的内容,会影响迭代器方法返回的值。
  2. 所以使用了快照保证,快照保证返回的元素是Iterator创建时的状态,不会受后来变化的影响
  3. Code(针对ArrayList):

    public <T> Iterator<T> snapshotIterator(Collection<? extends T> coll){
    return new ArrayList<T>(coll).iterator();
    }
    
  4. 快照迭代可以解决迭代时集合发生改变造成的致命错误

三、使用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.如何确定两个对象是否为同一个:

  1. 需要重写对象的equasl和hashCode方法

四、Collection接口

1.提供的方法:

  1. public int size() 返回集合大小,即元素个数
  2. public boolean isEmpty() 如果当前集合没有任何元素,返回ture
  3. public boolean contains(Object elem) 如果集合含有elem元素,则返回ture,即集合含有一个元素,并且使用了elem对象作为参数在这个元素上调用了equals方法,则返回true,如果elem是null,元素中也有null,返回true
  4. public Iterator iterator() 返回可以遍历集合的迭代器
  5. public Object[] toArray() 返回一个含有集合所有元素的新数组
  6. public T[] toArray(T[] dest) 返回一个含有该集合中所有元素的数组,如果dest的元素个数大于集合元素,则集合元素后面的第一个元素为null,如果元素个数大于dest,则创建一个更大的和dest具有相同类型的数组
  7. public boolean add(E elem) 使当前集合持有elem对象,如果添加成功则返回true
  8. 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相同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值