[java] 集合类

1、数组ArrayList和集合LinkedList的比较

  1. 数组开辟的是一块连续空间,适合下标访问,查找效率高。 LinkedList 采用双向链表实现的,存储是分散的,适合插入和删除。
  2. 数组能存放基本数据类型和对象,而集合类存放的都是对象,集合类不能存放基本数据类型。数组和集合存放的对象皆为对象的引用地址。
  3. 数组容易固定无法动态改变,集合类容量动态改变。
  4. 数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数
  5. 集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率

2、集合类框架

在这里插入图片描述

2.1、List常用方法:

  • void add(int index, Object element) :添加对象element到位置index上
  • boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素
  • Object get(int index) :取出下标为index的位置的元素
  • int indexOf(Object element) :查找对象element 在List中第一次出现的位置
  • int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
  • Object remove(int index) :删除index位置上的元素
  • ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex
  • List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素

2.2、Set常用方法:

  • public boolean contains(Object o) :如果set包含指定元素,返回true
  • public Iterator iterator()返回set中元素的迭代器
  • public Object[] toArray() :返回包含set中所有元素的数组public Object[] toArray(Object[] a) :返回包含set中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型
  • public boolean add(Object o) :如果set中不存在指定元素,则向set加入
  • public boolean remove(Object o) :如果set中存在指定元素,则从set中删除
  • public boolean removeAll(Collection c) :如果set包含指定集合,则从set中删除指定集合的所有元素
  • public boolean containsAll(Collection c) :如果set包含指定集合的所有元素,返回true。如果指定集合也是一个set,只有是当前set的子集时,方法返回true

2.3、Map常用方法:

  • Object put(Object key,Object value):用来存放一个键-值对Map中
  • Object remove(Object key):根据key(键),移除键-值对,并将值返回
  • void putAll(Map mapping) :将另外一个Map中的元素存入当前的Map中
  • void clear() :清空当前Map中的元素
  • Object get(Object key) :根据key(键)取得对应的值
  • boolean containsKey(Object key) :判断Map中是否存在某键(key)
  • boolean containsValue(Object value):判断Map中是否存在某值(value)
  • public Set keySet() :返回所有的键(key),并使用Set容器存放
  • public Collection values() :返回所有的值(Value),并使用Collection存放
  • public Set entrySet() :返回一个实现 Map.Entry 接口的元素 Set

3、List

ArrayList 和 Vector 都是使用数组方式存储数据,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要找到前后项,修改指针即可,所以插入速度较快。

3.1、ArrayList

ArrayList底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素

ArrayList初始容量是10,每次扩容容量增大为原来的1.5倍。
ArrayList扩容机制

3.2、LinkedList

LinkedList底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素

LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。

利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-ended queue )。 它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()等。

3.3、Vector

Vector 底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素。
Vector由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差。而且vector扩容时是扩大为原来的2倍。

4、Set

  • HashSet类直接实现了Set接口,其底层其实是包装了一个HashMap去实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
    HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。

  • LinkedHashSet 是HashSet的一个子类,LinkedHashSet也根据HashCode的值来决定元素的存储位置,但同时它还用一个链表来维护元素的插入顺序,插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。

  • TreeSet 实现了SortedSet接口,这是一种排序的Set集合,底层是用TreeMap实现的,本质上是一个红黑树原理。 正因为它是排序了的,所以相对HashSet来说,TreeSet提供了一些额外的按排序位置访问元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet().
    TreeSet的排序默认按升序排序。

5、Map

java.util.Map有四个实现类,分别是 HashMap,Hashtable LinkedHashMap 和 TreeMap.

  • HashMap 是一个最常用的 Map,它根据键的 hashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap 最多只允许一条记录的键为 NULL,允许多条记录的值为 NULL。HashMap 不支持线程同步

  • Hashtable 与 HashMap 类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写 Hashtable,因此也导致了 Hashtable 在写入时会比较慢。

  • LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,输出的顺序和输入的相同

  • TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

6、重写 equals 还要重写 hashcode

1.若两个对象equals相同,则hashCode也相同。

2.若两个对象hashCode相同,则equals不一定相同。

3.若两个对象hashCode不同,则equals也不同。

如果重写了equals方法但不重写hashCode方法,即相同equals结果的两个对象将会被HashMap当作两个元素保存起来。

3、Iterator 和 ListIterator

Iterator 和 ListIterator 的区别是:

  • Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List。
  • Iterator 对集合只能是前向遍历,ListIterator 既可以前向也可以后向。
  • ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值