天天看点

黑马程序员 Java 基础:集合

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、概述

  Java 中的集合可以看做是类的实例化对象的容器,Java 中用于实现各种数据结构的接口就构成了 Java 的集合框架,如下图。

黑马程序员 Java 基础:集合

  其中实现 Collection 的接口的接口有 List、set 等,List 的实现类包括 ArrayList、LinkedList,Set 的实现类有 HashSet、TreeSet 等,实现 Map 接口的类有 HashMap、TreeMap,而 Collections 和 Arrays 类中封装的主要是一些对集合中的数据进行操作的方法。

二、集合元素操作的共性方法

  Collection 接口包含一些对集合中的元素进行添加、移除和查询等操作的方法,其中包括以下方法:

boolean add (E e) // 向集合中添加对象 e
boolean contains(Object o) // 查看元素中是否包含对象 o
boolean remove(Object o) //从集合汇总移除对象 o
int size() // 返回集合中元素的个数
Iterator<E> iterator() // 返回迭代器
           

  这些方法是 Collection 的子接口的实现类都可以使用的方法。

三、List

  实现 Collection 的子接口 List 的类的特征是集合中元素具有索引,结合中的元素是有顺序的,可以存入重复元素,包含基于索引的特有方法。

void add(int index, E element) //在列表的指定位置插入指定元素 
E get(int index) //返回列表中指定位置的元素 
int indexOf(Object o) 
//返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1 
int lastIndexOf(Object o)
//返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1 
E remove(int index) //移除列表中指定位置的元素 
E set(int index, E element) //用指定元素替换列表中指定位置的元素 
List<E> subList(int fromIndex, int toIndex)
//返回列表中指定的 fromIndex(起始索引,包括 )和 toIndex(结束索引,不包括)之间的 List
           

(1)ArrayList

  ArrayList 是 List 的实现类之一,ArrayList 的特征在于其底层为数组结构,这意味着以 ArrayList 结构储存的数组查询速度较快,但是由于其每增加或删除一个元素都要对其后所有元素的索引进行修改,因此增加或删除元素操作的效率较低。

  ArrayList 在取出元素时,既可以用迭代器,也可以使用 get 方法。

// 建立 ArrayList 集合,存入字符串并进行增、删、改、查操作
class ArrayListDemo {
    public static void main (String[] args) {
        ArrayList al = new ArrayList();
        // 向 al 中存入一组字符串
        al.add("abcde");
        al.add("abcd");
        al.add("abc");
        // 查询集合中是否包含 "abc"
        al.contains("abc");
        // 将集合中索引为 2 的元素设为 "abe"
        al.set(,"abe");
        //使用迭代器将数组中的元素全部取出
        Iterator it = al.iterator();
        //使用迭代器中的 hasNext 方法判断是否有下一个元素
        while(it.hasNext()) {
            // 使用迭代器中的 next 方法返回下一个元素
            it.next();
        }
        //使用 get 方法取出元素
        for(int x=;x<al.size();x++) {
            al.get(x);
        }
    }
}
           

(2)LinkedList

  LinkedList 是 List 的另一个实现类,其底层结构为链表,只记录相邻元素关系,这种数据结构意味着其在增加或删除数据速度较快,但在查询时速度不如 ArrayList。LinkedList 的特有方法包括:

boolean offer(E e)//将指定元素添加到此列表的末尾
boolean offerFirst(E e)//在此列表的开头插入指定的元素 
boolean offerLast(E e)//在此列表末尾插入指定的元素 
E peek()//获取但不移除此列表的头(第一个元素)
E peekFirst()//获取但不移除此列表的第一个元素;如果此列表为空,则返回 null
E peekLast()//获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null 
E poll()//获取并移除此列表的头(第一个元素) 
E pollFirst()//获取并移除此列表的第一个元素;如果此列表为空,则返回 null 
E pollLast()//获取并移除此列表的最后一个元素;如果此列表为空,则返回 null 
           

四、Set

  实现 Set 接口的集合的特征是集合中的元素是没有顺序的,不能存入重复的对象。在取出元素时要使用迭代器,且取出元素的顺序不确定。

(1)HashSet

  HashSet 是 Set 的实现类之一,其根据对象的内存地址的哈希值判断数据是否重复,当哈希值相同时,其会调用 equals 方法判断对象是否相同。由于成员内容的相同对象的内存地址也可能不同,因此一般情况下需要在要存入的对象的类中重写 hashCode 方法,使对象的哈希值与对象中的成员相关联。

(2)TreeSet

  TreeSet 是 Set 的另一个实现类,其底层结构为二叉树。

黑马程序员 Java 基础:集合

  TreeSet 要求存入的元素具有可比性,因此在存入的对象的类需要实现 Comparator 接口并重写 compare 方法,或是在创建 TreeSet 集合时传入一个实现了 Comparator 接口并重写 compare 方法的类的对象作为比较器。

// 建立一个类,让其实现 Comparator 接口并重写 compare 方法
class Demo implements Comparator {
    String str = null;
    Demo (String str) {
        this.str = str;
    }
    int compare (Object o1,Object o2) {
        String s1 = (String) o1;
        String s2 = (String) o2;
        return s1.compareTo(s2);
    }
}
// 建立 TreeSet 集合,存入可比较的对象
class ArrayListDemo {
    public static void main (String[] args) {
        TreeSet al = new TreeSet();
        al.add(new Demo("abcde"));
        al.add(new Demo("abcd"));
        al.add(new Demo("abc"));
    }
}
           

五、Map

  实现 Map 接口的类的特点是集合中存在键和值,键和值存在映射关系,其特有方法包括:

V get(Object key) //返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null 
V put(K key, V value)//将指定的值与此映射中的指定键关联 
V remove(Object key)//从此映射中移除指定键的映射关系(如果存在)
Set<Map.Entry<K,V>> entrySet()//返回此映射中包含的映射关系的 Set
Set<K> keySet()//返回此映射中包含的键的 Set 
Collection<V> values()//返回此映射中包含的值的 Collection 
           

  实现 Map 接口的集合在存入对象时需要使用 put 方法,并且可以通过返回键或值的集合。

(1)HashMap

  HashMap 是 Map 接口的一个实现类,其特征为在储存作为键的对象时会判断其 hashCode 方法返回的哈希值来判断对象是否重复。

从 HashMap 集合中取出对象的方式有两种,一种是通过 keySet 方法返回键的 Set 集合,通过迭代器取出键对象,然后使用 get 方法取出值对象;另一种是通过 entrySet 方法返回 Map.Entry 类对象的 Set 集合,然后使用 Map.Entry 类中的 getKey 和 getValue 方法取出键和值。

//将两组字符串分别作为键和值存入 HashMap 集合
class HashMapDemo {
    public static void main (String[] args) {
        Map<String,String> hm = new HashMap<String,String>();
        hm.put("023001","Zhangsan");
        hm.put("023002","Lisi");
        hm.put("023003","Wangwu");
        //使用 Keyset 方法返回键的 Set 集合
        Set<String> keyset = hm.keySet();
        //使用迭代器取出所有的键
        Iterator<String> it = keyset.iterator();
        while(it.hasNext()) {
            String key = it.next();
            //使用 get 方法取出所有的值
            String value = hm.get(key);
        }
        //使用 entrySet 方法返回 Map.Entry 类对象的 Set 集合
        Set<Map.Entry<String,String>> entrySet = hm.entrySet();
        //使用迭代器取出每项的值,然后使用 getValue 取出每项的值
        Iterator<Map.Entry<String,String>> it = entrySet.iterator;
        while(it.hasNext()) {
            Map.Entry<String,String> me = it.next();
            String value = me.getValue();
        }
    }
}
           

(2)TreeMap

  TreeMap 是 Map 的另一个实现类,TreeMap 集合中元素的存入和取出方法类似于 HashMap 集合,所不同的的是其要求作为键的对象具有可比性,其实现方式与 TreeSet 集合存入元素的方式相同。

六、泛型

  泛型用于限定集合中存入的元素的类型,使用泛型指定集合中存入的元素类型后,可以提高集合的安全性,并避免在使用集合元素时使用强制类型转换,在使用泛型后,上文中作为 TreeSet 元素的对象的类可以改写为:

// 使用泛型限定比较器中比较的数据的类型
class Demo implements Comparator<String> {
    String str = null;
    Demo (String str) {
        this.str = str;
    }
    int compare (String s1,String s2) {
        return s1.compareTo(s2);
    }
}
           

七、集合工具类

  Collections 和 Arrays 类主要提供对集合和数组进行操作的静态方法可以直接使用类名调用。

// 使用 Collections 和 Arrays 类中的方法操作集合和数组
import java.util.*;
Class Demo {
    public static void main (String[] args) {
        List<String> li = new ArrayList();
        li.add("abcde");
        li.add("abcef");
        li.add("abde");
        //二分查找制定对象
        int index = Collections.binarySearch(li,"abde");
        //返回最大元素
        String s = Collections.max(li);
        //反转顺序
        Collections.reverse(li);
        //排序
        Collections.sort(li);
        //返回线程安全的集合
        li = Collections.sort(li);
        int arr[] = {,,,,};
        //对数组进行排序
        Arrays.sort(arr);
    }
}