天天看点

第八章 集合类

8 集合

    用于存储对象,长度可变,可以存储不同类型的对象

8.1 集合框架

Collection

    List

        ArrayList:底层的数据结构使用的是数组结构。特点:查询速度快,增删慢。线程不同步

        LinkedList:底层的数据结构使用的是链表数据结构。特点:查询慢,增删快。线程不同步

        Vector:底层的数据结构使用的是数组数据结构。线程同步,被ArrayList替代了。

    Set

        HashSet:底层的数据结构使用的是哈希表,线程不同步。

        TreeSet:底层的数据结构使用的是二叉树,可以对Set集合中的元素进行排序,但是需要实现Comparable接口。保证元素唯一性的依据:CompareTo方法return 0。

1、共同方法:

    add();添加元素

    remove();删除元素

    clear();清空集合

    contains();是否包含元素

    isEmpty();集合是否为空

    size();集合大小

    retainAll();取两个集合的交集

    例如:a.retainAll(b);a中只会保留和b中相同的元素

2、遍历元素

    使用迭代器:Iterator

    Iterator it = a.iterator();

    while(it.hasNext()){

        it.next();

    }

    for(Iterator it = a.iterator();it.hasNext();){

8.2 List

1、特点:元素是有序的,可以重复,集合有索引

2、特有方法

    add(index,element);指定位置添加元素

    addAll(index,Collection);指定位置添加一个集合

    remove(index);删除指定位置的元素

    set(index,element);设置指定元素的值

    get(index);获取指定位置的元素

    indexOf();获取元素的位置

    subList(from,to);截取集合了,包含from,不包含同

    listIterator();列表迭代器,是Iterator的子接口

在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。所以在迭代时只能通过迭代器额方法操作元素,自由判断、去除和删除操作。

如果想要其他的操作,如添加、修改等,就需要使用其子接口Listiterator。

8.3 LinkedList

1、特有方法

    addFirst();在头部添加元素

    addLast();在尾部添加元素

    getFirst();得到头部元素

    getLast();得到尾部元素

    removeFirst();取出并删除头部元素

    removeLast();取出并删除尾部元素

其中get和remove在使用时,如果集合中没有元素,会出现NoSuchElementException。

2、在JDK1.6出现了替代方法

添加元素

    offerFirst();

    offerLast();

获取元素,如果集合中没有元素,会返回null;

    peekFirst();

    peekLast();

获取并删除元素,如果集合中没有元素,会返回null;

    pollFirst();

    pollLast();

8.4 Set

1、特点:元素是无序的,元素不可以重复

2、Set集合的功能和Collection是一致的

3、HashSet保证元素的唯一性:通过hashCode和equals是否为true

如果元素的hashCode值相同,才会判断equals是否为true。

如果元素的哈市Code值不相同,不会调用equals方法。

对于判断元素是否存在,以及添加和删除等操作,依赖的方法是元素的hashCode和equals方法。

8.5 泛型

    JDK1.5版本之后出现的,用于解决安全问题,是一个安全机制,使用<>表示

    ArrayList<String> a = new ArrayList<String>();

1、泛型类

    当类中要操作的引用数据类型不确定的时候

    class Utiles<TT>{

        private TT t;

        public void setTT(TT t){

            this.t = t;

        }

        public TT getTT(){

            return t;

静态方法不能访问泛型类,可以访问泛型方法。

2、泛型方法

public <T> void show(T t){

    ......;

}

3、泛型限定

    ArrayList <? extends E>;

    ?表示通配符

    可以接收E类型或者E的子类型,上限。

    ArrayList <? super E>;

    可以接收E类型或者E的父类型,下限。

8.6 Map

    该集合存储键值对

    HashTable:底层的数据结构使用的是哈希表,不可存入null键和null值,线程同步。

    HashMap:底层的数据结构使用的是哈希表,可以使用null键和null值,线程不同步。

    TreeMap:底层的数据结构使用的是二叉树,线程不同步。可以用于给map集合中的键进行排序。

1、方法:

添加

    put(K key,V value);

    putAll(Map<? extends K,? extends V> m);

删除

    clear();

判断

    containsKey(Object key);

    containsValues(Object value);

    isEmpty();

获取

    get(Object key);

    size();

    values();

    entrySet();

    Set <Map.Entry<k,v>> entrySet;将map集合中的映射关系存放到set集合中,而这个关系的数据类型是Map.Entry。获取Map.Entry后,就可以通过其中的getKey和getValue方法获取关系中的键和值。

    keySet();将所有的键存入到Set集合,因为Set具备迭代器,所以可以用迭代的方式去除所有的键,再根据Map的get方法,获取每一个键对应的值

8.7 集合框架的工具类

    Collections.fill(List,Object);

    可以将List集合中所有元素替换成指定的元素

    Collections.repalceAll(List,oldValue,newValue);

    将List集合中的旧值替换成新值。

    Collections.reverse(List);

    将List集合中的元素进行反转

8.8 高级for循环

    格式:

    for(数据类型 变量名 : 被遍历的集合或者数组){

    只能获取元素,但是不能对集合进行操作。

8.9 可变参数

    传递参数的时候使用...

    public void show(int... arr){}

    其中arr其实就是一个数组

8.10 静态导入

    import static java.util.Arrays.*;

    导入的是Arrays这个类中的所有静态成员。

继续阅读