有些人可能不知道我们为什么要用到集合,不是要数组吗?
在写程序的时候,数组有时候虽然可以替代集合,但数组相对于集合有一个很大的缺点。数组在存储数据的时候有一个很大的缺点,那就是必须定义数组的长度,而集合的长度是可变的。在java编程中,经常需要在内存中保存大量的,各种类型的数据,使用数组很不便捷,我们就需要用集合来完成我们的目的。
集合的特点:
1.用于存储对象的容器;
2.集合长度是可变的;
3.集合中不可以存储基本数据类型的值。
集合框架的顶层是collection接口,它常见方法有:
1,添加。
boolean add(Object obj):
boolean addAll(Collection coll):
2,删除。
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();
3,判断:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判断集合中是否有元素。
4,获取:
int size():
Iterator iterator():取出元素的方式:迭代器。
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
所以该迭代器对象是在容器中进行内部实现的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可, 也就是iterator方法。
可能有人不知道什么是Iterator,其实Iterator就是一个接口,Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
collection下的list,set,和map:
list:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
List:特有的常见方法:有一个共性特点就是都可以操作角标。
1,添加
void add(index,element);
void add(index,collection);
2,删除;
Object remove(index):
3,修改:
Object set(index,element);
4,获取:
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from,to);
list集合是可以完成对元素的增删改查。
List下的子集:
1.Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
2.ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
3.LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。
set:元素不能重复,无序.
Set接口中的方法和Collection一致。
set下的子集:
1.HashSet: 内部数据结构是哈希表 ,是不同步的。
是通过对象的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
2.TreeSet:可以对Set集合中的元素进行排序。是不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
if(this.hashCode()== obj.hashCode() && this.equals(obj))
哈希表确定元素是否相同
1,判断的是两个元素的哈希值是否相同,如果相同,在判断两个对象的内容是否相同。
2,判断哈希值相同,其实判断的是对象的hashCode的方法。判断内容相同,用的是equals方法
注意:如果哈希值不同,是不需要判断equals。
map:Map接口映射唯一关键字到值。关键字(key)是以后用于检索值的对象。给定一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。
map下的三大子集:
1.HashMap
HashMap类使用散列表实现Map 接口。
2.TreeMap
TreeMap 类通过使用树实现 Map 接口。TreeMap 提供了按排序顺序存储“关键字/ 值”对的有效手段,同时允许快速检索。应该注意的是,不像散列映射,树映射保证它的元素按照关键字升序排序。
3.AbstractMap
AbstractMap对三个具体的映射实现来说,是一个超类。