类集:就是一个动态的对象数组,是对一些实现好的数据结构的包装,这样在使用时会非常方便,而且最重要的是类集框架本身不受对象数组长度的限制。
类集的特性:(1)这种框架是高性能的,对基本类集(动态数组、链接表、树和散列表)的实现是高效率的。所以一般很少需要人工对这些"数据引擎"编写代码。(2)框架必须允许实现不同类型的类集以相同的方式和高度互操作方式工作。(3)类集必须是容易扩展和修改的。为了实现这一目标,类集框架被设计成包含了一组标准接口。
常用的接口有:Collection、List、Set、Map、Iterator、ListIterator、Enumeration、SortedSet、SortedMap、Queue、Map.Entry。
接口 描述 Collection 是存放一组单值的最大父接口,所谓的单值是指集合中的每个元素都是一个对象。在新的开发标准中已经很少直接使用此类接口进行操作。 List 是Collection接口的子接口,也是最常用的接口。此接口对Collection接口进行了大量的扩展,里面的内容是允许重复的。 Set 是Collection接口的子类,没有对Collection接口进行扩充,里面不允许存放重复的元素。 Map 是存放一对值的最大父接口,即接口中的每个元素都是一对,以key——value的形式保存。 Iterator 集合的输出接口,用于输出集合中的内容,只能进行从前到后的单项输出。 ListIterator 是Iterator的子接口,可以进行由前向后或有后向前的双向输出。 Enumeration 是最早的输出接口,用于输出指定集合中的内容。 SortedSet 单值的排序接口,实现此接口的集合类,里面的内容可以使用比较器排序。 SortedMap 存放一对值的排序接口,实现此接口的集合类,里面的内容按照key排序,使用比较器排序。 Queue 队列接口,此接口的子类可以实现队列操作。 Map.Entry Map.Entry的内部接口,每个Map.Entry对象都保存着一对key——value的内容,每个Map接口中都保存有多个Map.Entry接口实例。
1,Collection接口和Collections类
1.1,Collection接口
public interface Collection<E> extends Iterable<E>
从接口中可以定义,此接口使用了泛型的定义,在操作时必须指定具体的操作类型。这样可以保证类集操作的安全性,避免ClassCastException异常。
Collection接口时单值存放的最大父接口,可以向其中保存多个单值数据。
方法 描述 public boolean add(E o) 向集合中插入对象 public boolean addAll(Collection<? extends E> e) 将一个集合的内容插入进来 public boolean void clear() 清除此集合中的所有元素 public boolean contains(Object o) 判断某一个对象是否存在该集合中 public boolean containsAll(Collection<?> e) 判断一组对象是否在集合中存在 public boolean equals(Object o) 对象对比 public int hashCode() 哈希码 public boolean isEmpty() 集合是否为空 public Iterator<E> iterator() 为Iterator接口实例化 public boolean remove(Object o) 删除指定对象 public boolean removeAll(Collection<?> c) 删除一组对象 public boolean retainAll(Collection<?> c) 保存指定对象 public int size() 求出集合的大小 public Object[] toArray() 将一个集合变为对象数组 public <T> T[] toArray(T[] a) 指定好返回的对象数组类型
Collection接口虽然是集合的最大接口,但是如果直接使用Collection接口进行操作,则表示的操作意义不明确,所以在Java开发中不提倡直接使用Collection接口。主要接口如下:
- List:可以存放重复的内容。
- Set:不能存放重复的内容,所有的重复内容靠hashCode()和equals()两个方法区分。
- Queue:队列接口。
1.2,Collections类(集合操作类)
Collections类常用方法及类型:
方法 类型 描述 public static <T> Collection<T> synchronizedXxx(Collection<T> c) 普通 将指定集合设置为线程同步。 public static final List EMPTY_LIST 常量 返回一个空的List集合 public static final Set EMPTY_SET 常量 返回空的Set集合 public static final Map EMPTY_MAP 常量 返回空的Map集合 public static <T> boolean addAll(Collection<? super T>c, T...a) 普通 为集合添加内容 public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) 普通 找到最大的内容,按比较器排序 public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) 普通 找到集合中的最小内容,按比较器排序 public static <T> boolean replaceAll(List<T> list,T oldVal, T newVal) 普通 用新的内容替换集合的指定内容 public static void reverse(List<?> list) 普通 集合反转 public static <T> int binarySearch(List<? extends Comparable<? super T>>list, T key) 普通 查找集合中的指定内容 public static final <T> List<T> emptyList() 普通 返回一个空的List集合 public static final <K,V> Map<K,V> emptyMap() 普通 返回一个空的Map集合 public static final <T> Set<T> emptySet() 普通 返回一个空的Set集合 public static final <T extends Comparable<? super T>> void sort(List<T> list) 普通 集合排序操作,根据Comparable接口进行排序 public static void swap(List<?> list,int i,int j) 普通 交换指定位置元素 1,创建线程同步集合
Collection c = Collections.synchronizedCollection(new ArrayList<>()); List list = Collections.synchronizedList(new ArrayList<>()); Set set = Collections.synchronizedSet(new HashSet<>()); Map map = Collections.synchronizedMap(new HashMap<>());
2,返回不可变的集合:因为在List、Set、Map集合中,返回的对象都是无法进行增加数据的,因为没有实现add()方法。
List<String> allList = Collections.EMPTY_LIST; Set<String> allSet = Collections.EMPTY_SET; allList.add("燕双嘤"); ========================================== 报错
3,添加内容:addAll可以接收可变参数,然后可以传递任意多的参数作为集合的内容。
List<String> allList = new ArrayList<>(); Collections.addAll(allList,"燕双嘤","杜马","步鹰"); for (String s:allList){ System.out.println(s); }
4,反转集合中的内容
Collections.reverse(allList);
5,检索内容:直接通过Collection类中的binarySearch()方法完成内容的检索,中文在compareTo()方法下有BUG。
List<String> allList = new ArrayList<>(); Collections.addAll(allList,"燕双嘤","杜马","步鹰"); int name = Collections.binarySearch(allList,"燕双嘤"); System.out.println(name);
6,替换集合中的内容
Collections.replaceAll(allList,"步鹰","云建民");
7,集合排序
Collections.sort(allList);
8,交换指定位置的内容
Collections.swap(allList,0,2);
2,List接口
2.1,List接口的定义
public interface List<E> extends Collection<E>
List是Collection接口,其中可以保存各个重复的内容。但是与Collection不同的是,在List接口中大量地扩充了Collection接口,拥有了比Collection接口定义更多的方法定义。List接口比Collection接口扩充了更多的方法,而且此方法操作起来方便。但如果想要想使用此接口,则需要通过其子类进行实例化。
方法 描述 public void add(int index, E element) 在指定位置增加元素 public boolean addAll(int index, Collection<? extends E>) c 在指定位置增加一组元素 E get(int index) 返回指定位置的元素 public int indexOf(Object o) 查找指定位置的元素 public int lastIndexOf(Object o) 从后向前查找指定元素的位置 public ListIterator<E> listIterator() 为ListIterator接口实例化 public E remove(int index) 按指定位置删除元素 public List<E> subList(int fromIndex, int toIndex) 取出集合中的子集合 public E set(int index, E element) 替换指定位置的元素
2.2,数组集合:ArrayList
ArrayList的底层是用数组来实现的,默认第一次插入元素时创建大小为10的数组,超出限制时会增加 50%的容量,并且数据以 System.arraycopy() 复制到新的数组,因此最好能给出数组大小的预估值。按数组下标访问元素的性能很高,这是数组的基本优势。直接在数组末尾加入元素的性能也高,但如果按下标插入、删除元素,则要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。
ArrayList是List子类,可以直接通过对象的多态性为List接口实例化。
public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable
可以看出ArrayList类继承了AbstractList类。此接口实现了List接口,所以可以直接使用ArrayList为List接口实例化。
public abstract