java集合类详解
java 集合类详解
1. 概念
-
Java集合类存放于 java.util 包中,是一个用来存放对象的容器。
-
集合只能存放对象
-
集合存放的是多个对象的引用,对象本身还是放在堆内存中
-
集合可以存放不同类型,不限数量的数据类型
-
-
集合类的详解
-
Collection接口:List和Set的父接口,即各种List和Set和其子类都直接或间接继承至Collection接口
-
List下有ArrayList,LinkedList,Vector(都是有序可重复)
- ArrayList:底层数据结构是数组,查询快,增删慢,效率高,且线程不安全
- LinkedList:底层数据结构是链表,查询慢,增删快,效率高,且线程不安全,
- Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低
-
Set下有HashSet,LinkedHashSet,TreeSet(都是无序且唯一)
-
HashSet:底层数据结构是哈希表(无序唯一),线程不安全,可以存储null元素,效率高
- 依赖于两个方法hashCode()和equals()来保证唯一
-
LinkedHashSet:底层数据结构是链表和哈希表(FIFO插入有序,唯一)
-
以链表保证元素有序
-
以哈希表保证元素唯一
-
-
TreeSet :底层数据结构是红黑树(唯一,有序)
TreeSet底层数据结构采用红黑树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排序要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;
-
-
-
Map接口:Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。
-
Map下有HashMap,LinkedHashMap(继承自HashMap), TreeMap(有序),Hashtable
-
HashMap(重点)
- 具有很快的访问速度
- 最多只允许一条记录的键为Null;允许多条记录的值为 Null
- 不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致
- 如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
- HashMap基于哈希表结构实现的 ,当一个对象被当作键时,必须重写hasCode和equals方法
-
LinkedHashMap
- 主要是用链表实现来扩展HashMap类,HashMap中条目是没有顺序的,但是在LinkedHashMap中元素既可以按照它们插入图的顺序排序,也可以按它们最后一次被访问的顺序排序
-
TreeMap
- TreeMap基于红黑树数据结构的实现,键值可以使用Comparable或Comparator接口来排序
- TreeMap继承自AbstractMap,同时实现了接口NavigableMap,而接口NavigableMap则继承自SortedMap。SortedMap是Map的子接口,使用它可以确保图中的条目是排好序的
-
Hashtable
Hashtable和前面介绍的HashMap很类似,它也是一个散列表,存储的内容是键值对映射,不同之处在于,Hashtable是继承自Dictionary的,Hashtable中的函数都是同步的,这意味着它也是线程安全的,另外,Hashtable中key和value都不可以为null。
-
-
-
框架图
- 集合的选择
-
2. 基本方法
-
Collection常用方法
-
add(E e) ,添加元素
-
clear() ,暴力清除集合中所有元素
-
contains(Object o), 返回值类型:boolean。判断集合是否包含某个元素
-
isEmpty() ,返回值类型:boolean。如果此集合不包含元素,则返回true。
-
iterator() 迭代器。返回值类型:Iterator
-
size() 返回值类型:int。返回集合中的元素数
-
-
List常用的方法(继承自collection,即可以使用Collection的方法)
- void add(int index,Object element):在指定位置添加元素
- Object get(int index):获取指定位置的元素
- ListIterator listIterator():List集合特有的迭代器。该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法
- Object previous():获取上一个元素
- boolean hasPrevious():判断是否有元素
- Object remove(int index):根据索引删除元素,返回被删除的元素
- Object set(int index,Object element):根据索引修改元素,返回被修改的元素
-
LinkedListt的特有方法
-
添加功能
public void addFirst(Object e)
public void addLast(Object e)
-
获取功能
puclic Object getFirst()
public Object getLast()
-
删除功能
public Object removeFirst()
public Object removeLast()
-
-
ArrayList无特有方法
-
Set的方法,基本都继承自Collection
-
Map中常用的方法
- put(K key, v value):向map集合中添加Key为key,Value为value的元素,当添加成功时返回null,否则返回value。
- void putAll(Map<? extends K,? extends V> m):向map集合中添加指定集合的所有元素
- void clear():把map集合中所有的键值删除
- boolean containsKey(Object key):检出map集合中有没有包含Key为key的元素,如果有则返回true,否则返回false。
- boolean containsValue(Object value):检出map集合中有没有包含Value为value的元素,如果有则返回true,否则返回false。
- Set<Map.Entry<K,V>> entrySet(): 返回map到一个Set集合中,以map集合中的Key=Value的形式返回到set中。
- boolean equals(Object o):判断两个Set集合的元素是否相同
- V get(Object key):根据map集合中元素的Key来获取相应元素的Value
- int hashCode():返回map集合的哈希码值
- boolean equals(Object o):判断两个Set集合的元素是否相同
- boolean isEmpty():检出map集合中是否有元素,如果没有则返回true,如果有元素则返回false
- Set
keySet():返回map集合中所有Key - V remove(Object key):删除Key为key值的元素
- int size():返回map集合中元素个数
- Collection
values():返回map集合中所有的Value到一个Collection集合
3. 遍历
-
迭代器(接口)
-
概念
迭代器(Iterator)是一种设计模式、提供了一种方法,来对集合、容器进行遍历的方式,不需要关注底层数据结构和数据类型,来达到底层和上层遍历解耦的目的
-
迭代器方法
- boolean hasNext() :判断集合是否还有元素; true表示还存在元素 ,false表示不存在元素
- E next():返回当前数据
- void remove():删除元素
-
实现
public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(1); arrayList.add(2); arrayList.add(3); arrayList.add(4); arrayList.add(5); Iterator<Integer> iterator = arrayList.iterator(); while (iterator.hasNext()){ Integer value = iterator.next(); System.out.print(value+" "); } System.out.println(); } /* 注意事项: 在使用next()方法前必须调用hasNext()方法 使用remove()方法前必须调用next()方法 */
-
-
通过for循环遍历
for (int i = 0; i < arrayList.size(); i++) { System.out.print(arrayList.get(i)+" "); } System.out.println();
-
通过增强for循环遍历
for (Integer i :arrayList) { System.out.print(i+" "); } System.out.println();
-
Map的遍历
//增强for for(Map.Entry<String, String> entry : map.entrySet()){ String mapKey = entry.getKey(); String mapValue = entry.getValue(); System.out.println(mapKey+":"+mapValue); } //for循环 for(String key : map.keySet()){ System.out.println(key); } //value for(String value : map.values()){ System.out.println(value); } //通过迭代器Iterator Iterator<Entry<String, String>> entries = map.entrySet().iterator(); while(entries.hasNext()){ Entry<String, String> entry = entries.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println(key+":"+value); } //通过键找值(效率低) for(String key : map.keySet()){ String value = map.get(key); System.out.println(key+":"+value); }