Java的一些容器类

在这里插入图片描述

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

HashSet底层原理完全就是包装了一下HashMap

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 的常用子类
  1. 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;
	        }
	    }
  ……
}
  1. 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有哪些不好的设计?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值