Java集合之集合体系结构(一)
1、前言
1.1、数组和集合
在Java基础知识学习中我们都知道:我们可以把多个属性封装成对象,数据(或对象)多了可以用数组来存储。但是我们都知道数组是只能存储一组有序且数据类型相同的变量的有限集合,正因数组的局限性所以有了集合的出现来完善Java对于数据的存储。
- 数组的长度是固定的,集合的长度是可变的
- 数组只能存储相同的数据类型,集合可以存储不同的引用数据类型(但因泛型的限制,所以集合也是存储单一类型的数据)
- 数组可以存储基本数据类型和引用数据类型,集合只能存储引用数据类型(由于基本数据类型和其包装类的自动装箱和自动拆箱,所以我们可以使用集合存储基本数据类型)
1.2、集合体系
我们使用数组来存储数据一般使用一维数组即可,最复杂也不过是二维数组。为什么使用集合存储数据会有这么多的集合对象,应该选择那个集合对象来存储我们的数据呢?其实整个集合体系虽然很庞大,但是其结构非常清晰有条理,每个集合对象都有其鲜明的特点,无非是底层的实现(数据结构)的不同导致其功能和效率有所差异,通过学习我们就能选择最合适的集合对象来存储我们的数据啦!
Java集合体系主要由两个接口派生而成:Collection和Map,Collection和Map也是集合体系的父接口,均声明了操作集合通用的方法(对集合元素增删查改等方法)。Collection主要是存储单列的数据即其体系中的集合对象均为线性结构。而Map主要存储双列数据,即保存具有映射关系的键值对数据。
1.2.1、Collection体系
1)常用方法
- boolean add(E e) :往该集合对象添加一个元素
- boolean addAll(Collection<? extends E> c) :往该集合对象添加另一个集合对象
- void clear() :移除此collection中(可选操作)的元素
- boolean contains(Object o) :判断该集合对象是否包含某元素
- boolean containsAll(Collection<?> c) :判断该集合对象是否包含某集合对象
- boolean isEmpty() :判断集合对象是否为空(不包含元素)
- boolean remove(Object o) :从该集合中删除指定元素的单个实例(如果存在)(可选操作)
- boolean removeAll(Collection<?> c) :删除指定集合中包含的所有此集合的元素(可选操作)
- int size() :返回此集合中元素的个数
2)List和Set
- List:有序、有索引、集合元素可重复
- Set:无序、无索引、集合元素不重复
3)List实现类的区别
- ArrayList
- 实现:底层的数据结构是数组
- 特点:增删速度慢,查找速度快,非线程安全的
- LinkedList
- 实现:底层的数据结构是链表
- 特点:增删速度快,查找速度慢
- Vector
- 实现:底层的数据结构是数组
- 特点:线程安全的,100%长度扩展
4)List和Set判断元素相等
- List集合判断元素是否相同依赖的是equal()的方法,所以元素为自定义类型时,需要重写equal()方法自定义元素是否相等的标准
- Set集合判断元素是否存在(contains()),以及增加(add())删除等(remove())操作,依赖的方法是元素的hashCode和equals方法,需要重写这两个方法去定义规则判断自定义元素是否相等
1.2.1、Map体系
1)常用方法
- V put(K key, V value):往该map对象添加一个具有映射关系的值
- void putAll(Map<? extends K, ? extends V> m):往该map对象添加另外一个map对象
- void clean():清除该map集合元素
- V remove(Object key):删除该map对象的键为key的映射值
- boolean containValue(Object value):判断该map对象是否包含值为value的键值对
- boolean containsKey(Object key):判断该map对象是否包含键为key的键值对
- boolean isEmpty():判断该map对象是否为空
- V get(Object key):根据key获取该map对象的value值
- int size():返回该map对象键值对数量
- Collection values():返回此地图中包含的值的Collection视图
- Set keySet():将Map中所有的键存入到Set集合,因为Set具备迭代器,就可以获取其迭代器。迭代方式取出所有的键,再根据get方法,获取每一个键对应的值
- Set<Map.Entry<K, V>> entrySet():返回此映射中包含的映射关系的Set视图,将Map集合中的映射关系存入到了Set集合中,而这个关系的数据类型就是Map.Entry
2)HashMap和Hashtable
- Hashtable和HashMap都继承自Map,底层实现都是哈希表
- HashMap允许键(key)或值(value)值为null,但是Hashtable的健或值都不允许为null
- HashMap是非线程安全的而Hashtable是线程安全的,所以HashMap效率高于Hashtable