1. Map
HashMap的底层实现是数组+链表/红黑树
1.1 菜鸟教程:java.utill.Map
1.2 Map是一个接口
public interface Map<K,V> {
int size();
boolean isEmpty();
Set<K> keySet(); //returns a Set view of the keys contained in this map
Collection<V> values(); //returns a Collection view of the values contained in this map
Set<Map.Entry<K,V>> entrySet(); //returns a Set view of the mappings contained in this map 遍历的使用使用
interface Entry<K, V>{
……
}
……
}
1.3 Map的常用子类
1)HashMap:无序存放的;是新的操作类(在JDK1.2之后推出的);key不允许重复;采用异步处理方式,性能更高;属于非线程安全的操作类。
2)Hashtable:无序存放的;是旧的操作类(在JDK1.0时推出的);key不允许重复;采用同步处理方式,性能较低;属于线程安全的操作类。
3)TreeMap:可以排序的Map集合,按集合中的key进行排序;key不允许重复。
4)WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时,可以清除掉无用的数据,可以使用gc进行回收。
5)IdentityHashMap:key可以重复的Map集合。
1.4 Map<K, V>中的K和V
K和V都应该是引用类型,如Integer、Long等,而不能是值类型,如int、long。
具体原因是泛型的类型擦除,如果是值类型的话,一旦把泛型信息擦除后,到要插入强制转型代码的地方就没办法往下做了,因为不支持int、long与Object之间的强制转型。(见《深入理解Java虚拟机 第三版》P372)。
2. Set
2.1 java.util.Set 是一个接口
public interface Set<E> extends Collection<E> {
……
}
2.2 Set 的常用子类
1)HashSet
底层数据结构是哈希表,线程不安全,效率高,允许存储null值,元素无序
元素的唯一性是靠重写hashCode()方法和equals()方法。不重写则无法保证。
Integer 和String 默认重写了hashCode()和equals()方法
3. List
3.1 java.util.List是一个接口
public interface List<E> extends Collection<E> {
……
}
3.2 List 的常用子类
- LinkedList
LinkedList底层数据结构通过其内部类Node实现。LinkedList是一个双向链表。
可以被当作堆栈、队列或双端队列进行操作。
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
……
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
……
}
- ArrayList
动态数组。ArrayList中采用数组作为底层数据结构,特点是查询速度快,但是结构修改慢。
ArrayList中的操作不是线程安全的,所以,建议在单线程中才使用。
4. Stack
4.1 菜鸟教程:Stack
4.2 Stack是继承与Vector的,由于Vector是通过数组实现的,即,Stack也是通过数组实现的。
public class Stack<E> extends Vector<E> {
……
}
4.3 Stack的使用
Java官方不推荐使用Stack类 [^3]
Stack<Integer> stack1 = new Stack<>();
栈的其它声明方式:
Deque<Integer> inStack = new LinkedList<>();
Deque<Integer> inStack = new ArrayDeque<>(); //Java官方推荐使用的声明栈的方式
5. Queue
Queue<Integer> queue = new LinkedList<>();
参考:
1. Java类集–Map接口、HashMap、IdentityHashMap、SortedMap
2. 泛型
3. Java有哪些不好的设计?