Java常用集合类List、Set、Map概述

Java常用集合类

1、Collection集合

  • List(有序存储)

    • ArrayList:基于索引的数据结构,类似动态数组,查询快,效率高,扩容机制每次1.5倍

    • LinkedList:底层是双向链表(带头节点和尾节点),每个节点都与前一个和下一个节点相连接,增删快,查询稍慢

    • Vector:底层和ArrayList一样也是数组,内部使用synchronized方法保证线程安全,性能较差,扩容机制每次2倍

    • Stack:

      JUC下有一个CopyOnWriteArrayList,是线程安全的arraylist,底层是reentrantLock+volatile

  • Set(不可重复,无序,无索引):只有加强型for和迭代器 两种遍历方法

    • HashSet:底层结构是HashMap,允许放入一个null。要求:存在在哈希表中的对象元素都得覆盖equals和hashCode方法。

    • HashSet是**如何保证不重复的?**Set中插入数据时,先比较hashCode,如果hashCode不同,就直接插入了,如果hashCode相同再比较equals,equals相同,则两个对象相同,不能插入,equals不同,可以插入;

    • Set.add(V v); set.remove(V v); set.size() set.isEmpty() set.contains(V v); set.iterator();

    • LinkedHashSet:底层采用双向链表实现,可以保证元素的插入顺序,又因为是HashSet的子类,所以插入的元素不能重复。

    • TreeSet:二叉排序树,二叉树实现的。Treeset中的数据是自动排好序的。不允许放入null值

      Set的实现类都不是线程安全的类,实现线程安全的解决方案:Set set = Collections.sysnchronizedSet(Set对象);

  • Queue:队列是一种先进先出的数据结构,元素在队列末尾添加,在队列头部删除。Queue接口扩展自Collection,并提供插入、提取、检验等操作。

    • PriorityQueue:优先队列

Collection集合的方法:

booleanadd(E o) 确保此 collection 包含指定的元素(可选操作)。
booleanaddAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
voidclear() 移除此 collection 中的所有元素(可选操作)。
booleancontains(Object o) 如果此 collection 包含指定的元素,则返回 true。
booleancontainsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回true。
booleanequals(Object o) 比较此 collection 与指定对象是否相等。
inthashCode() 返回此 collection 的哈希码值。
booleanisEmpty() 如果此 collection 不包含元素,则返回 true。
Iterator<E>iterator() 返回在此 collection 的元素上进行迭代的迭代器。
booleanremove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
booleanremoveAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
booleanretainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
intsize() 返回此 collection 中的元素数。
Object[]toArray() 返回包含此 collection 中所有元素的数组。
<T> T[]toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

容器类对象在调用remove,contains等方法时需要比较对象是否相等地,这会涉及到对象类型的equals方法和hashcode方法。即,相等的对象应该有相等的hashcode.当然,如果是自定义的类型,需要重写这两个方法。

Collections工具类:
Collections是一个操作List、Set、Map等集合的工具类,提供了一系列静态方法对集合进行排序、查询和修改等操作。

  • 排序操作:
    (1)sort(List):根据元素的自然顺序对指定List集合元素按升序排序
    (2)sort(List, Comparator):根据指定Comparator的产生的顺序对集合元素进行排序
    (3)reverse(List):反转List中元素的顺序
    (4)shuffle:将List中元素进行随机排序
    (5)swap(List, int, int):将指定List中i处和j处元素进行交换
  • 查找、替换
    (1)Object max(Collection):返回集合中最大元素
    (2)Object max(Collection,Comparator):根据Comparator指定的顺序,返回集合中最大元素
    (3)Object min(Collection)
    (4)Object min(Collection,Comparator)
    (5)int frequency(Collection, Object):返回集合中指定元素的出现次数
    (6)void copy(List dest, List src):将list2中的内容复制到list1中
    (7)boolean replaceAll(List list, Object oldVal, Object newVal):使用新值替换list中所有旧值
    如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象集合,我们可以使用collection.sort()或者Collections.sort(List list)方法。在自定义类型(E)中实现Comparable接口,重写其中的compareTo()方法,这样Collection调用sort()方法时会自动调用compareTo()方法。Collections.sort(List list);此方法是给list中元素排序,所以要看此元素类型中是否重写了compareTo()方法。

iterator迭代器方法

booleanhasNext() 如果仍有元素可以迭代,则返回 true。
Enext() 返回迭代的下一个元素。
voidremove() 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。

2、Map接口

Map(key不可重复-value) 是一种把键对象和值对象进行映射的集合

  • HashMap:通过hashcode对其内容进行快速查找,默认的初始容量为16,HashMap允许一个key和多个value为null

  • LinkedHashMap:继承于HashMap,是基于HashMap和双向链表来实现的,顺序地去存储key-value

  • HashTable:线程安全的,hashtable的key和value都不允许为null(直接在方法上上锁,锁太粗了)

  • TreeMap:二叉排序树,是一个有序的key-value集合,所有元素都有序,LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢

  • ConcurrentHashMap:HashMap的线程安全版。同HashMap相比,ConcurrentHashMap不仅保证了访问的线程安全性,而且在效率上与HashTable相比,也有较大的提高。

map遍历方式:

  • KeySet():返回Map集合中所有key组成的Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key
      Set<String> keyset = map.KeySet();
      for(String key : keyset){
        Syetem.out.println(key+" "+map.get(key));
      }
    
  • entrySet():Set<Map.Entry<K,V>> entrySet()。 将Map集合每个key-value转换为一个Entry对象并返回由所有的Entry对象组成的Set集合。迭代后可以使用e.getKey()和e.getValue()两种方法来取key和value。返回的是Entry接口。
      Set<Entry<String,Integer>> entryset = map.entrySet();
      for(Entry<String,Integer> e : entryset ){
        Syetem.out.println(e.getKey()+" "+e.getValue());
      }
    

推荐使用第二种方式,即entrySet()方法,效率较高。
对于keySet其实是遍历了2次,一次是转为iterator,一次就是从HashMap中取出key所对于的value。而entryset只是遍历了第一次,它把key和value都放到了entry中,所以快了。

Map集合的方法:

我们可以把Map接口方法分成三组操作:改变、查询和提供可选视图。
改变操作允许从映射中添加和除去键-值对。键和值都可以为 null。但是,不能把Map 作为一个键或值添加给自身。

  • Object put(Object key, Object value), (key不重复返回null,反之返回被替换的值。)
  • Object remove(Object key), ( key存在返回被删除的值,key不存在返回null)
  • void putAll(Map mapping)
  • void clear()

查询操作允许您检查映射内容:

  • Object get(Object key), (key存在返回对应的值,key不存在返回null)
  • boolean containsKey(Object key)
  • boolean containsValue(Object value)
  • int size()
  • boolean isEmpty()

最后一组方法允许您把键或值的组作为集合来处理。

  • public Set keySet()
  • public Set entrySet()
  • public Collection values()

怎样使Hashmap同步?

HashMap可以通过Map map = Collections.synchronizedMap(hashMap)来达到同步的效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 2集合框架图  集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。  抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。  实现类:8个实现类(实线表示),对接口的具体实现。  在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。  · Collection 接口是一组允许重复的对象。  · Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。  · List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。  · Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。  · 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。  Java 2简化集合框架图  集合接口  1.Collection 接口  用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。  (1) 单元素添加、删除操作:   boolean add(Object o):将对象添加给集合   boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o  (2) 查询操作:   int size() :返回当前集合中元素的数量   boolean isEmpty() :判断集合中是否有任何元素   boolean contains(Object o) :查找集合中是否含有对象o
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值