---------------------- android培训、java培训、期待与您交流! ----------------------
1.集合框架有什么用?
集合和数组比较像,但是有很大的区别。
数组的长度在初始化时就定下来了,不可变。那么以后如果项目需求改变,原本需要10个学生信息,现在要20个,那怎么办?
所以就引出了集合
java中集合框架体系图
2.如何使用集合类?
对于对象集合,必须执行的操作主要以下三种:
*添加新对象
*删除对象
*查找对象
Collection接口是一组允许重复的对象
Set接口继承Collection,但不允许重复,使用自己内部的一个排序机制
list接口继承Collection,允许重复,元素按插入的次序来放置元素,不会重新排序
Map接口是一组成对的键-值对象所持有的是key-value,Map中不能有重复的key,拥有自己的内部排序机制。
容器中元素类型都为Objext,从容器取的元素时,必须把他转换成原来的类型
collection接口:
用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口
boolean add(Object o)://将对象添加给集合
boolean remove(Object o)://如果集合中又与o相匹配的对象,则删除对象o
int size(); //返回当前集合中元素的数量
boolean isEmpty();//判断集合中是否有任何元素
boolean contains(Object o); //查找集合中是否含有对象o
Iterator iterator(); //返回一个迭代器,用来访问集合中的各个元素
boolean addAll(Collection c); //将集合c中所有元素添加给该集合
void retainAll(Collection c); // 从集合中删除集合c中不包含的元素
Object[] toArray(); //返回一个内含集合所有元素的array。运行期返回的array和参数a的型别相同,需要转换为正确类别。
List接口:
void add(int index,Object element): //在指定位置index上添加元素element
boolean addAll(int index,Collection c); //将集合c的所有元素添加到指定位置index
Object get(int index); //返回List中指定位置的元素
int lastIndexOf(Objecto);//返回最后一个出现元素o的位置,否则返回-1
int indecOf(Object o); //返回第一个出现的元素o的位置,否则返回-1
Object romove(int index); //删除指定位置上的元素
Object set(int index,Object element);//用元素element取代位置index上的元素,并且返回旧的元素
LinkedList类和ArrayList类
在集合框架中又两种常规的List实现:ArrayList和LinkedList,使用两种List实现的哪一种取决于您特定的需要,如果要支持随机访问,而不必再除尾部的任何位置或除去元素,那么ArrayList提供了可选的集合,但如果,您要频繁的从列表的中间删除和去除元素,而值要顺序的访问列表元素,那么LinkedList实现更好
LinkedList类:
void addFirst(Object o); // 将对象p添加到列表的开头
void addLast(Object o); // 将对象o添加到列表的结尾
Object getFirst(); //返回列表开头的元素
Object removeFirst(); //删除并且返回列表开头的元素
Object removeLast(); //删除并且返回列表结尾的元素
LinkedList(); //构建一个空的链接列表
ArrayList类:
ArrayList类等装了一个动态再分配的Object[]数组。每个ArrayList对象又一个capacity。这个capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的capacity在常量时间内自动增加。
在向一个ArrayList对象添加大量元素的程序中,克使用ensureCapacity方法增加capacity。这可以减少增加重分配的数量
void ensureCapacity(int minCapacity)://将ArrayList对象容量增加minCapacity
void trimToSize(); //整理ArrayList对象容量为列表当前大小,程序可使用这个操作减少ArrayList对象存储空间
Set接口:
set接口继承Collection接口,而且让不允许集合汇总存在重复项,每个具体的set实现类一栏添加的对象的equals方法来检查独一性,set接口没有引入新方法,所以set就是一个collection,只不过其行为不同。
HashSet类:
HashSet();//构建一个空的哈希集
HashSet(Collection c); //构建一个哈希集,并添加集合c中所有元素
HashSet(int initialCapacity); //构建一个拥有特定容量的空哈希集
HashSet(int initialCapactity); //构建一个拥有特定容量的空哈希集
HashSet(int initialCapacty,float loadFactor);//构建一个拥有特定容量和加载因子的空和哈希集。LoadFactor是0.0至1.0之间的一个数
TreeSet类:
reeSet();//构建一个空的树集
TreeSet(Collection c);//构建一个树集,并且添加集合c中所有元素
TreeSet(Comparator c); //构建一个树集,并且使用特定的比较器对其元素进行排序
TreeSet(SortedSet s); //构建一个树集,添加有序集合s中所有元素,并且使用与有序集合s相同的比较器排序
Map接口:
Map接口不喝死Collection接口的继承,Map接口用于维护键-值(key-value),该接口描述了不重复的键到值的映射
Object put(Object key,Object value);//将互相关联的一个关键字与一个值放入该映像,如果该关键字已经存在,那么于此关键字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回null
Object remove(Objet key);//从映像的所有元素添加给该映像
void clear(); // 从映像中删除所有映像
“键和值都可以为null,但是,您不能把Map作为一个键或值添加给自身”
Object get(Object key);//获得与关键字key相关的值,并且返回关键之key相关的ui,如果没有在该映像中找到该关键字,则返回null
boolean containsKey(Object key);//判断映像中是否存在关键字key
bolean containsValue(Object value);//判断映像中是否存在值value
int size();//返回当前映像中映射的数量
boolean isEmpyt();// 判断映像中是否有任何映像
Set keySet();//返回映像中所有关键字的视图集
Map.Entry接口:
Mpa的entrySet()方法返回一个实现Map.Entry接口的对象集合,集合中美国对象都是狄成Map中一个特定的键-值对。
通过这个集合的迭代器,可以获得每一个跳么的键或值并对值进行更改,当条目通过迭代器返回后,除非是迭代器自身的remove()方法或者迭代器返回的跳么的setValue()方法,其余对源Map外部的修改都会导致此条目集变得无效,同时产生条目行为未定义。
Object getKay();//返回条目的关键字
Object getValue();//返回条目的值
Object setValue(Object value);//将相关影响中的值该为value,并且返回旧值
HashMap类和TerrMap类
“集合框架”提供两种常规的Map实现:HashMap和TreeMap实现。在Map中插入、删除和定位元素,HashMap是最好的的选择,但如果您要按自然顺序或自定义顺序遍历键,那么Tree会更好,使用HashMap要求添加的键类明确定义了HashCode()和equeals()实现
这个TreeMap没有调优选择,因为该树总处于平衡状态
HashMap类
为了优化HashMap空间的使用,可以调优初始容量和负载因子。
HashMap();//构建一个空的哈希映像
HashMap(Map m);//构建一个哈希映像,并且添加映像m的所有映像
HashMap(int initialCapacity);//构建一个拥有特定容量的空的哈希映像
HashMap(int initialCapacity,float loadFactor);//构建一个拥有特定容量的加载影子的空的哈希映像
TreeMap类
TreeMap没有调优选项,因为该树总处于平衡状态
TreeMap();//构建一个空映像树
TreeMap(Map m);//构建一个映像数,并且使用特定的比较器对关键字进行排序
TreeMap(SortedMap s);//构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序
HashTble类
实现一个哈希表,该哈希表将映射射到相应的值,任何null对象都可以用作键或值,为了成功地在哈希表中存储和获取对象,用作关键对象必须实现hashCode方法和equals方法
add(key);//在哈希表汇总添加一个key键值对
Remove(key);//在哈希表中取出某个key键值对
Clear();//从哈希表中移除所有元素
Contains(Key);//判断哈希表是否包含特定键key
Hashcode方法:
当向集合Set中增加对象时,首先集合计算要增加对象的哈希码,根据该值来得到一个位置用来存放当前对象,挡在该位置没有一个对象存在的话,那么集合set认为该对象在集合中不存在,直接增加进去,如果在该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合汇总不存在该对象,在进行一次散列,将该对象防到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合认为集合中已存在该对象了,不会再将该对象增加到集合中了
重写equals方法的时候必须重写hashcode方法,如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashcode,原因是equals方法为true,表名是同一个对象,他们的hashcode当然相同
Object类的hashcode方法返回的是Object对象的内存地址,可以通过integer.toHexString(new Object().HashCode);来得到
Comparable接口
Comparable接口使用与一个类欧自然顺序的时候,家丁对象集合是同一个类型,该接口允许您吧集合排序成自然顺序
他的方法只有一个compareto()方法,用来比较当前实例和作为参数传入的元素,如果排序过程中当前实例和粗线在参数前,就返回某个负值,如果当前实例出现在参数后,则返回正直,否知,返回零,如果不要求返回值表示元素相等,零返回值可以只是表示两个对象在排序的时候排在同一个位置
上面例子中的整型的包装类Integer就实现了该接口,我们可以看一下这个类的源码:
public final class Integer extends Number implements
{
public int compareTo(Object o){
return compareTo((Integer)o);
}
poublic int compareTo(Integer anotherInteger){
int thisVal = this.values;
int anotherVal = anotherInteger.value;
return (thisVal<anotherVal ? -1:(thisVal==anotherVal?o?1));
}
}
Comparator接口:
若一个类不能用于实现java。lang。Comparable,或者不喜欢缺省的Comparable行为冰箱提供字的排序功能,可以实现Comparator接口,从而定义一个比较器。
int compare(Object,Object o2)://对两个对象哦o1和o2进行比较,如果o1位于o2的前面,则返回负值,如果在排序顺序中认为o1和o2是相同的,返回0,如果o1位于o2的后面,则返回正值
Iterator接口
Collection接口的Iterator方法返回一个Iterator,Iterator接口方法能以迭代方式逐个访问集合中的元素,并安全的从Collection中出去适当的元素
HashNext();//判断是否存在另一个可访问的元素
Object next();//返回要访问的下一个元素,如果到达集合结尾,则抛出异常
void remove();//删除上次访问返回的对象,本方法必须紧跟在一个元素的访问后执行,如果上次访问后集合已被修改,方法将抛出异常
---------------------- android培训、java培训、期待与您交流! ----------------------