集合框架
概念:对象的容器为集合,不能直接存放8种基本数据类型,jdk1.5以上提供了自动装箱机制,集合可以直接将基本类型的值存放入容器中,但是容器会自动的将基本数据类型装箱为该基本数据类型对应的包装类型的对象。
比较 | List | Set | Map |
---|---|---|---|
继承接口 | Collection | Collection | |
常见实现类 | AbstractList(常见继承子类有:ArrayList、LinkedList、Vector) | AbstractSet(常见继承子类有:HashSet、LinkedHashset、TreeSet) | HashMap、TreeMap、HashTable |
常见方法 | add()、remove()、clear()、get()、contains()、size() | add()、remove()、clear()、get()、contains()、size() | put()、get()、 remove()、clear()、containsKey()、containsValue()、keySet()、values()、size() |
元素 | 可重复 | 不可重复(用equals()判断) | key不可重复 |
顺序 | 有序 | 无序(实际顺序由hashCode决定) | |
线程安全 | Vector线程安全 | Hashtble线程安全 |
常用方法:
java.util.Collection<E>
java.util.Collection.size()
java.util.Collection.isEmpty()
java.util.Collection.contains(Object)
java.util.Collection.iterator()
java.util.Collection.toArray()
java.util.Collection.toArray(T[])
java.util.Collection.add(E)
java.util.Collection.remove(Object)
java.util.Collection.containsAll(Collection<?>)
java.util.Collection.addAll(Collection<? extends E>)
java.util.Collection.removeAll(Collection<?>)
java.util.Collection.removeIf(Predicate<? super E>)
java.util.Collection.retainAll(Collection<?>)
java.util.Collection.clear()
java.util.Collection.equals(Object)
java.util.Collection.hashCode()
java.util.Collection.spliterator()
java.util.Collection.stream()
java.util.Collection.parallelStream()
一、List
1、ArrayList
ArrayList父类是AbstractList,底层数据结构是数组,因此增加删除元素速度慢,查找元素速度快。
2、LinkedList
LinkedList的父类是AbstractSequentialList,底层数据结构是双向链表,因此增加、删除元素速度快,查找元素速度慢。
3、Vector
数据结构是数组,查询快、增删慢、线程安全、效率较低。
二、Set
1、HashSet
Hashset底层是由HashMap实现的。
Haset的值存放在HashMap的key上,HashMap的value都为常量PRESENT
2、TreeSet
基于排列顺序实现元素的不重复
实现了SortedSet接口,对于集合中的元素进行自动排序。
元素的对象类型可以通过implements(实现)Comparable接口,然后重写ComparTo方法指定排序规则。
三、Map
1、HashMap
V put(K key,V value)
:
/**put方法的返回值:如果是key是第一次put那么返回值就是null,map中如果已经有了*相同的key,那么返回值就是上一个key对应的value,并且当前value会替换上一个*value。
*注意*:返回为null的情况有两种,(1)第一次插入当前key(2)已经有当前key存在,但上一个key对应的value为null。**/
HashMap<String,String> hm=new HashMap<>();
hm.put("jack","杰克");//put返回null
hm.put("jack","杰克2");//put返回杰克,hm中存入jack="杰克"
hm.put(null,"杰克");//put返回null
hm.put(null,null);//put返回"杰克",hm中存入null=null
Set<K> keySet()
:map对象的的keySet()得到该Map的键集。
Collection values():
得到该map的值集。
Set<Map.Entry<K,V>> entrySet:
返回此映射所包含的映射关系的Set视图。
int Size():
返回此映射中的键值映射关系数。
V remove(Object key)
:如果存在key,则移除当前集合中的键值对映射关系。
2、TreeMap
Comparator<? super K> comparator():
返回此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回null。
boolean containsKey(Object key):
如果此映射包含指定键的映射关系,则返回true。
Map.Entry<K,V> higherEntry(K key):
返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回null。
K higherKey(K key):
返回严格大于给定键的最小键;如果不存在这样的键,则返回null。
Map.Entry<K,V> lastEntry():
返回此映射中最大键关联的键值映射关系;如果映射为空,则返回null。
K lastKey():
返回映射中当前最后一个(最高)键。
3、Hashtable
4、HashMap和Hashtable的区别
1、相同点:
都实现了Map、Cloneable接口
底层数据结构都是数组+链表。
插入元素都不能保证有序。
Hash过程都是通过key进行哈希。
key都不能重复。
2、不同点:
null问题:HashMap的key和value可以为null,Hashtable不可以。
初始容量:HashMap的初始容量为16,Hashtable为11。
扩容机制:HashMap的扩容机制是length2,Hashtable是lenght2+1
hash值:HashMap的hash值要重新计算,Hashtable是直接使用对象的hash值。
线程安全:HashMap是非线程安全的,Hashtable是线程安全的。
5、如何决定是使用HashMap还是TreeMap
对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的选择。 然而,假如你需要对一个有序的 key 集合进行遍历,TreeMap 是更好的选择。 基于你的 collection 的大小,也许向 HashMap 中添加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历。
6、HashMap底层实现原理
HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的 映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它 不保证该顺序恒久不变。
HashMap 的数据结构: 在 java 编程语言中,最基本的结构就是两种,一 个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基 本结构来构造的,HashMap 也不例外。HashMap 实际上是一个“链表散列”的数 据结构,即数组和链表的结合体。
7、HashSet底层实现原理
HashSet底层是由HashMap实现
HashSet的值存放在HashMap的key上,HashMap的value统一为PRESENT。
8、Collection和Collections的区别?
java.util.Collection是一个集合接口(集合类的顶层接口),它提供了对集合对象进行基本操作的通用接口方法。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List和Set。
Collections则是集合类的一个工具类,它提供了一系列的静态方法,用于对集合中的元素进行遍历、排序、线程安全话等操作。