集合框架
集合是一种长度可变的存储对象的容器,数组也是存储对象的容器,但是数组长度是固定的;
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是List和Set。List是有序的集合,可以包含重复的元素,提供按索引访问的方式,Set不能包含重复的元素,且无序;
Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value(键-值)对。Map不能包含重复的key,但是可以包含相同的value。
一、collection接口:
一)、共性方法
增加:
1:add() 将指定对象存储到容器中, add 方法的参数类型是Object 便于接收任意对象
2:addAll() 将指定集合中的元素添加到调用该方法和集合中
删除:
3:remove() 将指定的对象从集合中删除
4:removeAll() 将指定集合中的元素删除
修改
5:clear() 清空集合中的所有元素
判断
6:isEmpty() 判断集合是否为空
7:contains() 判断集合何中是否包含指定对象
8:containsAll() 判断集合中是否包含指定集合
9: 使用equals()判断两个对象是否相等
获取:
10:int size() 返回集合容器的大小
转成数组
11: toArray() 集合转换数组
二)、List接口的实现类:
ArrayList :
- 底层的数据结构使用的是动态数组结构(数组长度是可变的百分之五十延长,同 3)。
- 特点:是查询很快,但增删较慢,线程不同步(数组查询快的原因是:数组的内存空间地址是连续的)。
- ArrayList底层维护了一个Object[] 用于存储对象,默认数组的长度是10,当默认的或者指定的容量不够存储对象的时候,容量自动增长为原来的容量的1.5倍。
- 单线程效率高。
LinkList :
- 底层的数据结构是链表结构(特点是查询较慢,增删较快)
- 特有方法:addFirst(E e)、getFirst(E e) 、removeFirst(E e)
- 如果集合中没有元素,获取或者删除元素抛:NoSuchElementException
- LinkList底层是双向链表,所以没有初始化大小,没有扩容机制
vector :
- 底层是数组数据结构 线程同步(数组长度是可变的百分之百延长),(无论查询还是增删都很慢,被ArrayList替代了)
- 特有的方法:
void addElement(E obj) 在集合末尾添加元素
E elementAt( int index) 返回指定角标的元素
Enumeration elements() 返回集合中的所有元素,封装到Enumeration对象中测试此枚举是否包含更多的元素。
E nextElement() 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
Enumeration 接口: boolean hasMoreElements() - 多线程间建议使用,因为vector是线程安全的
三)、Set接口的实现类:
单列集合,元素不可重复
HashSet
- 底层用的是HashMap哈希表结构存储
- 通过复写hashCode()方法和equals()方法来保证唯一性
- HashSet无序
- 底层数据结构是哈希表,本质就是对哈希值的存储,通过判断元素的hashCode方法和equals方法来保证元素的唯一性,当hashCode值不相同,就直接存储了,不用在判断equals了,当hashCode值相同时,会在判断一次euqals方法的返回值是否为true,如果为true则视为用一个元素,不用存储,如果为false,这些相同哈希值不同内容的元素都存放一个桶里(当哈希表中有一个桶结构,每一个桶都有一个哈希值)
TreeSet
- 底层用的是TreeMap树结构存储
- 通过Compareable接口的compareTo()方法来保证的唯一性
- TreeSet有序
- 底层的数据结构是二叉树,可以对Set集合中的元素进行排序,这种结构,可以提高排序性能, 根据比较方法的返回值确定的,只要返回的是0.就代表元素重复
二、Map集合:
HashMap
- 初始化大小是 16 ,扩容因子默认0.75
- 根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的
- 键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null
- 非线程安全的,且无序的
Hashtable
- HashMap的线程安全版,它支持线程的同步
- 任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢
- 继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。
LinkedHashMap
- key和value都允许为空
- Key重复会覆盖、Value允许重复
- 非线程安全的,但是是有序的
- LinkedHashMap的基本实现思想就是----多态
TreeMap
- TreeMap的结果是按照字母表的顺序进行存储的
- TreeMap的实现是红黑树算法的实现(一种自平衡的排序二叉树)
- TreeMap 非线程安全