容器
Java Collections 框架包含大量集合接口和这些接口的实现类,主要提供了List(列表),Queue(队列),Set(集合),Stack(栈),Map(映射表)等数据结构。
Collection(集合)
List,Queue,Set,Stack都继承自Collection接口
功能简单概述
-
添加功能
boolean add() //添加一个元素 Boolean addAll(Collection c) //添加一个集合的元素
-
删除功能
void clear() //移除所有元素 boolean remove() //移除一个元素 boolean removeAll(Collection c) //移除一个集合的元素
-
判断功能
boolean contains() //判断集合中是否包含指定的元素 boolean containsAll(Collection c) //判断集合中是否包含指定的集合元素 boolean isEmpty() //判断集合是否为空
-
获取功能(迭代器------集合的专用遍历方式)
Iterator<E> iterator() //实际返回的是子类对象,这里是多态 boolean hasNext() //如果仍有元素可以迭代,则返回true Object next() //获取元素,并移到下一个位置
Collection c = new ArrayList(); Iterator it = c.iterator(); while(it.hasNext()){ String s = (String)it.next(); System.out.println(s); }
/* 这个方式,Iterator用完就回收,效率更高 */ for(Iterator it = c.iterator();it.hasNext(); ){ String s = (String)it.next(); System.out.println(s); }
-
交集功能
/* 假设有两个集合A,B A对B做交集,最终结果保存在A中,B不变 返回值表示A是否发生过改变 */ boolean retainAll(Conllection c)
-
把集合转换为数组
Object[] toArray() //可以实现集合的遍历
什么是迭代器?
迭代器是一个对象,它的工作是遍历并选择序列中的对象,它提供了一种访问容器对象中的各个元素,又不必暴露该对象内部细节的方法。通过迭代器,我们不需要了解容器底层的结构就可以实现对容器的遍历
List
特点:有序(存储顺序和取出顺序一致),可重复
List的特有功能:
-
添加功能
void add(int index,Object element) //在指定位置添加元素
-
获取功能
Object get(int index) //获取指定位置的元素
-
删除功能
Object remove(int index) //根据索引删除元素,返回被删除的元素
-
修改功能
Object set(int index,Object element) //根据索引修改元素,返回被修改的元素
-
列表迭代器
ListIterator listIterator() //List集合特有的迭代器 /* Object previous() // 获取上一个元素 boolean hasPrevious() //判断是否有元素 ListIterator可以实现逆向遍历,但必须先正向遍历,所以一般无意义,不使用 */
1. ArrayList
底层:是使用数组实现的
特点:查询快,增删慢;线程不安全,效率高
2. LinkedList
LinkedList底层是使用链表数据结构实现的
特点:查询慢,增删快;线程不安全,效率高
LinkedList的特有功能:
-
添加功能
addFirst() addLast()
-
删除功能
removeFirst() removeLast()
-
获取功能
getFirst() getLast()
3. Vector
底层:是使用数组实现的,原理和ArrayList一致
特点:查询快,增删慢;线程安全,效率低
Vector的特有功能:
-
添加功能
void addElement(E obj)
-
获取功能
E elementAt(int index) Enumeration<E> elements()
Set
特点:无序,不可重复
1. HashSet
1.底层:使用哈希表实现
2.特点:存取速度快
3.依赖的两个方法:hashCode(),equals()
4.存储元素过程:
向HashSet添加元素时,首先调用元素的hashCode方法,得到元素的哈希值,然后用哈希值运算出该元素在哈希表中的位置。
如果算出的位置目前没有存在任何的元素,就将该元素直接添加到哈希表中
如果算出的位置目前已经存在其他元素,那么再调用equals方法与这个位置的元素比较一次,结果为true元素重复了不添加;结果为false将该元素添加到哈希表中
2. TreeSet
1.底层:使用了红黑树(自平衡的二叉树)数据结构实现的
2.特点:唯一,对集合中的元素进行排序存储【自然排序】
3.保证元素的排序方式:
- 自然排序(元素具备比较性)
- 让元素所属的类实现Comparable接口
- 比较器排序(集合具有比较性)
- 让集合构造方法接受Comparator的实现类对象
4.存储元素过程:
-
向TreeSet添加元素时,如果元素具备自然顺序的特点,那么TreeSet会根据自然顺序进行排序存储
-
向TreeSet添加元素时,如果元素不具备自然顺序的特点,那么元素所属的类必须实现Comparable接口,把比较的规则定义在CompareTo方法上
-
向TreeSet添加元素时,如果元素不具备自然顺序的特点,而且元素所属的类也没有实现Comparable接口,那么在创建TreeSet对象的时候必须要传入比较器对象
比较器的定义格式:
class 类名 implements Compartor{}
3.LinkedHashSet
底层:数据结构是链表和哈希表
特点:链表保证元素有序,哈希表保证元素唯一
Map
1.Map存储的数据都是以键值对的形式存在的,键不可以重复,值可以重复
2.Map接口和Collection接口的不同:
- Map是双列的,存储的是键值对形式的元素,键唯一,值可以重复;
- Collection是单列的,存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复;
3.Map接口功能概述:
Map<String,String> map = new HashMap<String,String>();
-
添加功能
//V put(K key,V value) map.put("K","V"); /* 添加元素,该键不存在就存储该键元素,返回null 若该键存在,就更新该键的值并返回该键的旧值 */
-
删除功能
//void clear() 移除所有键值对元素 map.clear(); //V remove(Object key) 根据键删除值元素,并把值返回 map.remove("K");
-
判断功能
//boolean containsKey(Object key) 判断集合是否包含指定的键 map.containsKey("K"); //boolean containsValue(Object value) 判断集合是否包含指定的值 map.containsValue("V"); //boolean isEmpty() 判断集合是否为空 map.isEmpty();
-
获取功能
//Set<Map.Entry<K,V>> entrySet() 获取键值对对象的集合 map.entrySet(); //V get(Object key) 根据键获取值,存在返回相对应的值;不存在返回null map.get("K"); //Collection<K> values() 获取集合中所有值的集合 map.values();
4.Map集合的遍历:
-
根据键找值
/* 获取所有的键 遍历键的集合,获取每一个键 根据键找值 */ Set<String> set =map.keySet(); for(String key:set){ String value = map.get(key); System.out.println(key+"---->"+value); }
-
根据键值对对象找键和值
/* 获取所有键值对对象的集合 遍历键值对对象的集合,得到每一个键值对对象 根据键值对对象获取键和值 */ Set<Map.Entry<String,String>> set =map.entrySet(); for(Map.Entry<String,String> me:set){ String key = me.getKey(); String value = me.getValue(); System.out.println(key+"---->"+value); }
1.HashMap
基于哈希表的Map接口实现的,无序,哈希表的作用是保证键的唯一性
采用对象的HashCode可以进行快速查询
2.TreeMap
基于红黑树的数据结构来实现,内部元素是按需排列的
3.LinkedHashMap
采用列表来维护内部的顺序,有序