一、集合的概念
对象的容器,用来存放数据的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。
集合与数值的区别:
- 数组长度固定,集合长度不固定
- 数组中能存储基本数据类型和引用数据类型,而集合只能存储引用数据类型
二、Collection体系集合
所有单列集合的父接口。
特点:代表一组任意类型的对象,无序、无下标。
常用共性方法:
方法 | 描述 |
---|---|
boolean add(Object obj) | 添加一个对象数据 |
boolean addAll(Collection c) | 将集合中的所有对象添加到此集合中 |
void clear() | 清空此集合中的所有对象 |
boolean contains(Object obj) | 检查此集合中是否包含o对象 |
boolean equals(Object o) | 比较此集合 是否与指定对象相等 |
boolean isEmpty() | 判断此集合是否为空 |
boolean remove(Object o) | 在此集合中移除o对象 |
is size() | 返回此集合中的元素个数 |
Object[] toArray() | 将此集合转换为数组 |
图例:
1.List子接口:
特点:元素有序,并且有下标,可以有重复值.
实现类:
1.ArrayList集合
特点:底层数组结构,查询快,增删慢,效率高,线程不安全
常用方法:
方法 | 描述 |
---|---|
void add(int index, Object o) | 在index位置插入对象o。 |
boolean addAll(int index, Collection c) | 将一个集合中的元素添加到此集合中的index位置。 |
Object get(int index) | 返回集合中指定位置的元素 |
List subList(int fromIndex, int toIndex) | 返回fromIndex和toIndex之间的集合元素 |
优点:
ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高。(内存中开辟的是连续的空间)
缺点:
因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
2.LinkedList集合:
特点:底层是链表结构,增删快,查询慢,线程不安全.
常有特有方法:
方法 | 描述 |
---|---|
void addFirst(E e) | 将指定元素插入此列表的开头。 |
void addLast(E e) | 将指定元素添加到此列表的结尾。 |
E getFirst() | 返回此列表的第一个元素。 |
E getLast() | 返回此列表的最后一个元素。 |
优点:
LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景.
缺点:
因为LinkedList要移动指针,所以查询操作性能比较低。
3.Vector集合:
特点:数组结构实现,查询快、增删慢,线程安全,运行效率比ArrayList较慢.
4.ArrayList和LinkedList区别:
- ArrayList存储结构是数据,查找、遍历效率高。
- LinkedList存储结构是双向链表,删除、添加效率高。
2.Set集合:
特点:元素无序,无下标,元素不可重复
遍历方式:a.使用foreach循环遍历。 b.使用Iterator迭代器
实现类:
1.HashSet:
特点:
底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
- 基于HashCode实现元素不重复。
- 当存入元素的哈希码相同时,会调用==或equals进行确认,结果为true,拒绝后者存入。
注意方向: - 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
- 再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表。
- JDK1.8引入红黑树,提高效率。
2.LinkedHashSet
链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序,线程不安全
3.TreeSet
底层数组结构采用二叉树来实现,实现了SortedSet接口,对集合元素自动排序。
排序方法:
- 存储元素对象实现Comparable接口,重写compareTo()方法.(自然排序)
- TreeSet初始化时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;(比较器排序).
三、Map
Map集合用于保存映射关系的数据,即保存的都是键值对数据(key和value)其中key不可重复,value可重复,可通过key找到对应的value值.
关系示意图:
1.HashMap
线程不安全,运行效率快。允许用null 作为key或是value。
2.TreeMap
实现了SortedMap接口(Map的子接口),可以对key自动排序,Key需实现Comparable接口。
3.Hashtable
线程安全,运行效率慢;不允许null作为key或是value。
4.Properties :
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。(配置文件)
四、小结
Array,联想下标。底层数据结构是数组,查询快,增删慢,
Linked,联想两个特殊方法first,last。底层数据结构是链表,查询慢,增删快。
Hash,联想到两个重写方法hashCode,equals.底层数据结构是哈希表。
Tree,底层数据结构是二叉树。两种方式排序:Comparable,Comparator。