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集合的方法:
boolean | add(E o) 确保此 collection 包含指定的元素(可选操作)。 |
---|---|
boolean | addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 |
void | clear() 移除此 collection 中的所有元素(可选操作)。 |
boolean | contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 |
boolean | containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回true。 |
boolean | equals(Object o) 比较此 collection 与指定对象是否相等。 |
int | hashCode() 返回此 collection 的哈希码值。 |
boolean | isEmpty() 如果此 collection 不包含元素,则返回 true。 |
Iterator<E> | iterator() 返回在此 collection 的元素上进行迭代的迭代器。 |
boolean | remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
boolean | removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
boolean | retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 |
int | size() 返回此 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迭代器方法
boolean | hasNext() 如果仍有元素可以迭代,则返回 true。 |
---|---|
E | next() 返回迭代的下一个元素。 |
void | remove() 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。 |
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)来达到同步的效果。