Collection集合总结

来源:互联网 发布:纸带打孔编程 编辑:程序博客网 时间:2024/05/16 18:42

综述(java提供多种集合类)

  • 数据结构不同
  • 共性(存储,获取,判断)
  • 不断向上提取,得到一个集合的继承体系结构图

Collection结构图
分析:从具体到抽象
实现:从抽象到具体
使用:使用具体的

Collection常用功能(顶层接口)

注:接口不能实例化,需要用其子类的子类(由于List Set也是接口)实例化。
- 添加功能

boolean add(Object obj)  添加一个元素boolean addAll(Collection c)  添加一个集合的元素
  • 删除功能
void clear()  移除所有的元素boolean remove(Object obj)  移除一个元素boolean removeAll(Collection c)  移除一个集合的元素,有一元素被移除就返回true
  • 判断功能
boolean contains(Object obj)  判断集合中是否包含指定的元素boolean containsAll(Collection c)  判断集合中是否包含指定的集合元素,全部包含返回trueboolean isEmpty()  判断集合是否为空
  • 获取功能
Iterator<E> iterator() 迭代器,集合的专用遍历方式    Object next() 获取元素,并移动到下一个位置    boolean hasNext() 如果仍有元素可以迭代,则返回true
  • 长度功能
int size()  元素的个数//数组没有length()方法;字符串有length()方法;集合没有length()方法;
  • 交集功能
boolean retainAll(Collection c)  两个集合都有的元素//A,B两个集合做交集,最终结果保存在A中,B不变,返回值表示的是A是否发生过改变
  • 把集合返回数组
Object[] toArray()

List特有的常用功能

  1. 有序(存储和取出的元素一致)
  2. 可重复的

List的子类特点
1. ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高
2. Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低
3. LinkedList:底层数据结构是链表,查询慢,增删快;线程不安全,效率高

  • 添加功能
void add(int index,Object element) 在指定位置添加元素
  • 获取功能
Object get(int index) 获取指定位置的元素//可用于List特有遍历功能,size()和get()方法的结合
  • 列表迭代器
ListIterator listIterator() List集合特有的迭代器    特有功能:    Object previous()    boolean hasPrevious()    //ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用
  • 删除功能
Object remove(int index) 根据索引删除元素,返回被删除的元素
  • 修改功能
Object set(int index,Object element) 根据索引修改元素,返回被修改的元素
子类 LinkedList特有功能
  • 添加功能
public void addFirst(Object e)public void addLast(Object e)
  • 获取功能
public Object getFirst()public Object getLast()
  • 删除功能
public Object removeFirst()public Object removeLast()

Set的特点(方法类与前面的类似)

  1. 无序(存储顺序和取出的顺序不一致)
  2. 元素唯一

HashSet:

问题:为什么HashSet存储字符串的时候,字符串内容相同的只存储了一个呢?
答:通过查看add方法的源码,我们知道了这个方法底层依赖两个方法:hashCode()和equals()
步骤:先看hashCode()值是否相同
1如果相同,继续走equals()方法,返回true:说明元素重复,就不添加;返回false:说明元素不重复,就添加到集合中
2如果不同,就直接添加到集合中
(如果类没有重写这两个方法,默认使用Object(),一般来说不同,而String类重写了hashCode()和equals()方法,所以它就可以把内容相同的字符串去掉,只留下一个)

LinkedHashSet:(HashSet的子类)

底层数据结构由哈希表和链表组成
- 哈希表保证元素的唯一性
- 链表保证元素有序(存储和取出是一致)

TreeSet:

底层是二叉树结构(红黑树是一种自平衡的二叉树)
1元素是如何存进去的?
第一个元素存储的时候,直接作为根节点存储;
第二个元素开始,每个元素从根节点开始比较,大就作为右儿子,小就作为左儿子,相等就不搭理他(即不存)
2元素是如何取出的?
前序遍历,中序遍历,后序遍历

能够对元素按照某种规则排序,排序有两种方法
- 自然排序(元素具备比较性)
(无参构造,存储元素所属的类实现Comparable<>接口)
- 比较器排序(集合具备比较性)
(构造函数new一个自己的比较器,比较器实现Comparator<>接口,即让集合的构造方法接收一个比较器接口的子类对象Comparator)

通过观察TreeSet的add()方法,最终要看TreeMap的put()方法
真正的比较是依赖于元素的compareTo()方法,而这个方法是定义在Comparable里面的,所以想要重写该方法,就必须实现Comparable接口,这个接口表示的就是自然排序


Collection和Collections的区别?
Collection:单列集合的顶层接口,有子接口List和Set
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

public static <T> void sort(List<T> list) 排序,默认情况下是自然排序public static <T> int binarySearch(List<?> list,T key) 二分查找public static <T> T max(Collection<?> coll) 最大值public static void reverse(List<?> list) 反转public static void shuffle(List<?> list) 随机置换
原创粉丝点击