集合类的由来
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就是用集合容器进行存储。
集合特点
- 用于存储对象的容器;
- 集合的长度可变;
- 集合中不可以存储基本数据类型值。
- 集合容器因为内部数据结构不同,有多种具体容器。不断地向上抽取形成了集合框架。
Collection的常见方法:
- 添加。
boolean add(Object obj);
boolean add(Collection coll); - 删除。
boolean remove(Object obj);
boolean removeAll(Collection coll);
void clear(); - 判断。
boolean contains(Object obj);
boolean containsAll(Collection coll);
boolean isEmpty(); - 获取。
int size();
Iterator iterator():取出集合中的元素的方法。(迭代器) - 其他。
boolean retainAll(Collection coll);取交集。
Object[] toArray();将集合转成数组。
Collection
|–List:有序(存入和取出的顺序一致),元素都有索引,元素可重复。
|–Set:元素不能重复,无序。
List特有的常见方法
共性特点:都可以操作下标。
- 添加。
void add(index, element);
void add(index, collection); - 删除。
Object remove(index); - 修改。
Object set(index, element); - 获取。
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from, to);
List集合可以完成对集合元素的增删查改。
List:
|—Vector: 内部是数组数据结构,是同步的。增删、查询都很慢。
|—ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度很快。
|—LinkList:内部是链表数据结构,是不同步的。增删元素的速度很快。
Set
Set:元素不可重复,无序。
Set接口中的方法和Collection一致。
|—HashSet:内部数据结构是哈希表,是不同步的。
如何保证该集合的唯一性呢?
是通过对象的hashCode和equals方法来判断对象唯一性的。如果对象的hashCode值不同,那么不用判断equals方法,直接将对象存储到哈希表中;如果对象的hashCode值相同,再判断equals方法。如果为true,则视为相同元素,不存;如果为false,那么视为不同元素,进行存储。
注:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法,以确定判断对象是否相同的依据。
|—TreeSet:可以对Set集合中的元素按照指定顺序排序。该集合判断元素唯一性的方式为:根据比较方法的返回结果是否是0。如果是0,就是相同元素;否则, 就是不同元素。
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元素需要实现Comparable接口,即覆盖compareTo方法。
如果不要按照对象中具备的自然顺序排序,或者对象中不具备自然顺序。可以使用TreeSet集合的第二种排序方式:
让集合自身具备比较功能。定义一个类实现Comparator接口,覆盖compare方法,将该类的对象作为参数传递给TreeSet集合的构造函数。
-----------------------------------------------------------------------------------------------------------------------------------------------
Map(和Collection一个层次)
Map集合的特点:
Map:一次添加一对元素。Collection一次添加一个元素。
Map也称双列集合,Collection也称单列集合。
Map集合存储键值对。
Map集合中必须保证键的唯一性。
Map集合的常见方法:
- 添加。
V put(K key, V value);返回前一个和key关联的值,如果没有,返回null。 - 删除。
void clear();清空Map集合。
V remove(key);根绝指定的key删除这个键值对。 - 判断。
boolean containsKey(key);
boolean containsValue(value);
boolean isEmpty(); - 获取。
value get(key);通过键获取值,如果没有该键,返回null。同样地,可以通过返回null来判断是否包含指定键。
int size();获取键值对的个数。
Map的常用子类
|—Hashtable:内部结构是哈希表,是同步的。不允许null作为键或值。
用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|—HashMap:内部结构是哈希表,是不同步的。允许null作为键或值。
|—TreeMap:内部结构是二叉树,是不同步的。可以对Map集合中的键进行排序。
集合的一些技巧
- 判断是用哪个集合
需要唯一吗?
需要:Set
需要指定顺序吗?
需要:TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList - 如何记忆每个容器的结构和所属体系呢?
看名字。根据后缀名看体系。前缀就是该集合的数据结构。