-------android培训、java培训、期待与您交流! ----------
集合:
为什么要出现集合呢?
我们都知道数据多了,用数组存储,或是封装成对象,那么对象多了就需要用集合存储。
那么数组和集合都是容器,有什么不同呢?
1)数组长度是定的,集合长度是可变的
2)数组中只能存储基本数据类型,集合中存储的是对象
集合的特点:
1)用于存储对象的容器
2)集合的长度是可变的
3)集合中不可以存储基本数据类型
为什么会出现那么多的容器呢?
因为每一个容器对数据的存储方式不同,这个存储方式称为:数据结构。
集合中存储的是对象吗?答案是否定的,集合和数组一样,里面都存储的是对象的地址值。集合中存储的都是对象的引用。
Iterator:迭代器由来:每个容器多有自己的取出方式,因为取出的动作只有集合自己最清楚,那么就把取出的方式定
义在集合内部类,但是每个容器的数据结构不同,所以取出的动作细节也不一样,但是共性内容都是判断和取出,那
么可以将共性内容进行抽取。那么这些内部类否符合一个规则,该规则就是Iterator,通过对外提供的方法获取iterator();降低了容器和数据耦合性。。。(比如游戏厅里的夹娃娃机,有的是三个爪,有的是四个爪,但是他们都一个共性都是定一在箱子内部的,都可以夹娃娃,只对外提供一个操纵杆,我们只需要操作杆子就可以了,里面的东西我们不需要的了解)
注意:当我们在使用迭代器操作集合中的元素时,不可以通过集合对象的方法操作集合中的元素,因为会发生
ConcurrentModificationException(并发修改错误)所以,在迭代时,只能使用迭代器中方法操作元素,可是Iterator中的方法是有限的,只能对元素进行判断,取出和删除的操作。如果想要对元素进行如添加,修改等,就需要其子接口,ListIterator接口来完成。
Collection:
|--List:元素是有序的(存入和取出的顺序),可以重复,因为该集合体系都有索引。
|--ArrayList:底层使用的是数组结构,线程不同步,效率高 特点:查询速度快,但是增删速度慢,50%延长
|--LinkedList:底层是链表结构,线程不同步(使用频率不高) 特点:查询速度慢,但是增删速度快。
特有方法:
jdk1.6后取代的方法
addFirst()------->offerFirst()
addLast()-------->offerLast()
getFirst()------->peekFirst()
getLast()-------->peekLast() [获取但不删除,如果集合中没有元素,
会出现 NoSuchElementException异常]-->jdk1.6后,返回null
removeFirst() -------->pollFirst()removeLast()-------->pollLast()
[获取但是元素被删除,如果集合中没有元素,
会出现 NoSuchElementException异常]-->jdk1.6后,返回null
|--Vector:底层是数组结构,线程同步(被ArrayList替代),效率低
枚举:就是vector特有的取出方式,和迭代器很象,但是由于名称和方法名过长,所以被迭代器去代了。
可变长度数组:不断new数组完成的,就是将原有数组中的元素Copy到新数组中。
List集合中的特有方法:凡是可以操作脚标的都是该体系的特有方法。
添加:add(index ,element);addAll(index,collection);
删除:remove(index);
修改:set(index,elment);
获取:get(index);
subList(from,to);
listIterator();
Lsit集合中判断元素是否唯一使用的是equals()方法。
开发时怎么选择合适的集合使用:
1,如果你取到的元素很多,元素当中涉及到频繁的增删操作,使用LinkedList集合
2,如果同时涉及增删和查询时,可以使用ArrayList也可以使用LinkedList,
建议使用ArrayList,因为更多的时候我们查询的情况更常见。
|--Set:元素是无序的(存储和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表。 HashSet是如何保证元素的唯一性呢
通过元素的两个方法,hashCode和equals方法来完成,如果元 素hashCode相同,
还会判断对象的equal是否为ture,如果元素 hashCode值相同,则不会调用equals.
实际开发时,描述事物只要往集合中存储,一般都要覆写hashCode和 equals方法
我们在存人对象时,hashCode方法中可以将年龄乘以一个值,可以义提高比较效率
|--TreeSet:底层数据结构是二叉树。
特点:可以对Set集合中的元素进行自然排序。
排序的第一种方式:让元素自具备比较性,让对象实现·
Comparable接口,覆写ComparaTo方法。
排序的第二种方式:当元素自身不具备比较性,或是具备的比较性不是所需要的,
那么就让集合自身具备比较性,在集合初始化时就有了比较器
Map集合
Map集合特点:该集合中存储都是键值对(也成为双列集合),一对一对 的往里存,必须保证键的唯一性。(可以
对集合中的键值进行排序) 其实Set底层就是使用了Map集合。
Map
|--Hashtable:底层是哈希表数据结构,不可以存储null键, null值,线程同步,
|--HashMap:底层是哈希表数据结构,可以存储null键,null 值,线程不同步,
|--TreeMap:底层是二叉树数据结构,不可以存储null键,null值,线程不同步,
可以用于给Map集合中的键进行排序。
注意:Map集合中,添加元素时,如果键一样时,后面的键所对应的值会 覆盖原有的值。
Map集合取出元素的两种方式:原理:将Map集合转换成Set集合,然后通过迭代器进行取出
1,Set<k>keyset:将Map集合中的所有的键存储到Set集合中,因为Set集合具备迭代器,
所以可以迭代的方式取出所有的键,然后通过键获取其对应的值
2, Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系取出存入到Set集合中,
而这个关系的数据类型就是Map.Entry;
/**
* Map.Entry<>由来,entry也是一个接口,它是Map集合中的一个内部接口
*
* @author jinxiao
*
*/
interface Map {
public static interface Entry {
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map {
class Test implements Entry {
public Object getKey() {
return null;
}
public Object getValue() {
return null;
}
}
}
Collections集合工具类
在这里只写几个常用方法:
List<T> asList(T...a) : 将数组转换成集合;
好处:可以使用集合的思想和方法来操作数组中的元素。
和Collection的区别:(重点)
1)Collection接口是单列集合的顶层接口,里面提供了集合类的共性操作方法,比如增删改查,
Collections:是单列集合的工具类,里面的方法要知道几个,折半查找,反转,将数组转换成集合,
注意:将数组变成集合后,不可以使用集合中的增删方法,因为数组的长度是固定的。如果你增删会发生UnsupportedOperationException(不支持该操作)异常。
如果数组中的元素都是对象,那么变成集合时,数组中的元素直接转换成集合中的元素。
如果该数组中的元素是基本数据类型,那么会将该数组作为集合中的元素存在。
<T>T[] toArray() : 将集合变数组;
好处:可以限定对元素的操作,不需要进行增删了。
那么指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的长度,那么该该方法内部会创建一个新的数组。
当指定类型的数组长度大于了集合的长度,就不会创建新数组,而是使用传递进来的数组。
所以创建一个刚刚好好的数组最优。
高级for循环
格式 for(类型 变量名 :被遍历的集合(Collection)或数组){}
和迭代器的区别:
1,高级for对集合进行遍历,只能获取集合中的元素,但不能对集合进行操作。
2,迭代器处理遍历集合,还可以对集合中的元素进行remove操作,如果是ListIterator,还可以在遍历过程中对集合中的元素进增删的操作。
传统for和高级for的区别:高级for必须有被遍历的目标。
建议在遍历数组的时候,还是希望使用传统for,因为传统for遍历过程中可以对脚标进行操作。
Map集合可以使用高级for吗?
不可以直接使用,需要将Map集合转换成Set集合后,然后使用。
修改:set(index,elment);
获取:get(index);
subList(from,to);
listIterator();
Lsit集合中判断元素是否唯一使用的是equals()方法。
开发时怎么选择合适的集合使用:
1,如果你取到的元素很多,元素当中涉及到频繁的增删操作,使用LinkedList集合
2,如果同时涉及增删和查询时,可以使用ArrayList也可以使用LinkedList,建议使用ArrayList,因为更多的时候我们查询的情况更常见。
|--Set:元素是无序的(存储和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层数据结构是哈希表。
HashSet是如何保证元素的唯一性呢?
通过元素的两个方法,hashCode和equals方法来完成,如果元素hashCode相同,
还会判断对象的equal是否 为ture,如果元素hashCode值相同,则不会调用equals.实际开发时,
描述事物只要往集合中存储,一般都要覆写hashCode和 equals方法。
我们在存人对象时,hashCode方法中可以将年龄乘以一个值,可以义提 高比较效率。
|--TreeSet:底层数据结构是二叉树。
特点:可以对Set集合中的元素进行自然排序。
排序的第一种方式:让元素自具备比较性,让对象实现· Comparable接口,覆写ComparaTo方法。
排序的第二种方式:当元素自身不具备比较性,或是具备的比较性不是所需要的,
那么就让集合自身具备比较性,在集合初始化时就有了比较器
Map集合Map集合特点:该集合中存储都是键值对(也成为双列集合),一对一对 的往里存,必须保证键的唯一性。(可以
对集合中的键值进行排序)其实Set底层就是使用了Map集合。
Map
|--Hashtable:底层是哈希表数据结构,不可以存储null键, null值,线程同步,
|--HashMap:底层是哈希表数据结构,可以存储null键,null 值,线程不同步,
|--TreeMap:底层是二叉树数据结构,不可以存储null键,null 值,线程不同步,可以用于给Map集合中的键进行排序。
注意:Map集合中,添加元素时,如果键一样时,后面的键所对应的值会 覆盖原有的值。
Map集合取出元素的两种方式:‘
原理:将Map集合转换成Set集合,然后通过迭代器进行取出
1,Set<k>keyset:将Map集合中的所有的键存储到Set集合中,因为Set集 合具备迭代器,所以可以迭代的方式
取出所有的键,然后通过键获取其对应的值。
2, Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系取出存入到 Set集合中,而这个关系的数据类型就是
Map.Entry;
/**
* Map.Entry<>由来,entry也是一个接口,它是Map集合中的一个内部接口
*/
interface Map {
public static interface Entry {
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map {
class Test implements Entry {
public Object getKey() {
return null;
}
public Object getValue() {
return null;
}
}
}
Collections集合工具类
在这里只写几个常用方法:
List<T> asList(T...a) : 将数组转换成集合;
好处:可以使用集合的思想和方法来操作数组中的元素。
和Collection的区别:(重点)
1)Collection接口是单列集合的顶层接口,里面提供了集合类的共性操作方法,比如增删改查,
Collections:是单列集合的工具类,里面的方法要知道几个,折半查找,反转,将数组转换成集合,
注意:将数组变成集合后,不可以使用集合中的增删方法,因为数组的长度是固定的。如果你增删会发生
UnsupportedOperationException(不支持该操作)异常。
如果数组中的元素都是对象,那么变成集合时,数组中的元素直接转换成集合中的元素。
如果该数组中的元素是基本数据类型,那么会将该数组作为集合中的元素存在。
<T>T[] toArray() : 将集合变数组;
好处:可以限定对元素的操作,不需要进行增删了。
那么指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的长度,那么该该方法内部会创建一个新的数组。
当指定类型的数组长度大于了集合的长度,就不会创建新数组,而是使用传递进来的数组。
所以创建一个刚刚好好的数组最优。
高级for循环
格式 for(类型 变量名 :被遍历的集合(Collection)或数组){}
和迭代器的区别:
1,高级for对集合进行遍历,只能获取集合中的元素,但不能对集合进行操作。
2,迭代器处理遍历集合,还可以对集合中的元素进行remove操作,如果是ListIterator,还可以在遍历过程中对集合
中的元素进增删的操作。
传统for和高级for的区别:高级for必须有被遍历的目标。
建议在遍历数组的时候,还是希望使用传统for,因为传统for遍历过程中可以对脚标进行操作。 Map集合可以使用高级for吗? 不可以直接使用,需要将Map集合转换成Set集合后,然后使用。