黑马程序员--集合框架
2015-07-24 21:44
671 查看
-----------------ASP.Net+Unity开发、.Net培训、期待与您交流! -----------------
集合框架
一,概述:
1、简述:
所谓集合,就是为方便对多个对象的操作,对对象进行存储。集合就是存储对象最常用的一种方式。
2、集合与数组的区别:
数组:可存储同种类型的数据,但长度固定,也可存储基本类型的数据
集合:只可存储对象,长度可变,类型可以不同。
3、集合的特点:
只用于存储对象,长度可变,也可存不同类型的对象。
集合是一个接口,将每种容器的共性提取,形成的一个体系。
4、数据结构:
由于每种容器对数据的存储方式都各不相同,所以出现了不同的容器。此种存储方式称之为数据结构。
5、集合中存储的都是对象的引用(地址)。
二,集合体系如下图所示
三,集合共性方法操作
1、增加:
add(Object obj); 添加元素
2、删除:
remove(); 删除集合中指定参数的元素
removeAll(); 删除当前集合中与另一集合相同的元素,即只保留与另一集合不同的元素
clear(); 清空集合中的元素,集合还存在
retainAll() 保留此collection中那些也包含在指定collection中的所有元素
3、获取集合长度:
size(); 获取集合长度,即集合元素的个数
4、修改:
set(int index,e); 将指定位置(index)上的元素修改为给定的参数e
5、判断:
boolean contains(e); 判断给定元素e是否存在于集合中
6、迭代器:iterator() 集合取出元素的方式
boolean hasNext(); 判断是否还有下一个元素
next(); 取出下一个元素
集合体系如下:
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|---ArrayList:底层的数据结构使用的是数据结构。特点:查询速度很快。但增删稍慢。线程不同步。
|---LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询速度稍慢。
|---Vector:底层是数组数据结构。线程同步。被ArrayList替代。
|--Set:元素是无序的,元素不可以重复。Set集合的功能和Collection是一致的。
|--HashSet:底层数据结构是哈希表。线程非同步。
HashSet是如何保证元素唯一性呢?是通过元素的两个方法,hashcode、equals方法来比
1b0e2
较
如果元素的hashcode值相同,则不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
|--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据是compareTo
方法;
TreeSet 排序的两种方式:
TreeSet排序的第一种方式:让元素自身具有可比较性。元素要实现Comparable接口,覆盖compareTo方法。
这种方式称为元素自然顺序,也叫默认排序。
TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集
合自身具备比较性。在集合初始化时,就有了比较方式。
即定义一个类,实现Comparator接口,覆盖compare方法。
当两种排序都存在时,以比较器为主。
四,List集合
List:
特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index)
subList(from,to)
listItertor()
五,Set集合
如上。
六,泛型
JDK1.5版本以后出现新特性。用于解决安全问题,是一个安全机制。
优点:1.将运行时期出现的问题ClassCastException,转移到了编译时期。
方便于程序员解决问题,让运行时期问题介绍,安全。
2.避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
泛型通常出现在集合框架框架中。<>其实就是用来接收类型的。
当使用集合时,将集合要存储的数据类型作为参数传递到<>中。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
为了让不同的方法可以操作不同的类型,而且类型还不确定。那么可以将泛型定义在方法上
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在静态方法上。
七,Map集合
该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
常见操作
1,添加。
put(K Key,V Value),添加元素,如果出现添加时是相同的键,那么后添加的值会覆盖原有键对应的值。并且put方法会返回被覆盖的值。
putAll(Map<? extends K,? extends V>)
2,删除。
clear()
remove()
3,判断。
cotainsKey(),
cotainsValue()
isEmpty()
4,获取。
get(Object key)
size()
values()
entrySet()
keySet()
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。线程同步。jdk1.0,效率低
|--HashMap:底层是哈希表数据结构,可以使用null键null值。线程非同步。jdk1.2,效率高
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于map集合中的键进行排序。
和Set很像。其实,Set底层使用的就是Map。
map集合取出原理。
将map集合转成SET集合。再通过迭代器取出。
map集合的两种取出方式:
1,Set<K> KeySet: 将map中所有键存入到Set集合。因为Set具备迭代器,所以可以根据get方法,获取每一
个键的值。
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();
}
}
八,集合框架的工具类
Collections:常见方法:
(1)sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序。
(2)sort(List<T> list, Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。
(3)max(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器产生的顺序,返回给定 collection 的最大元素。
(4)binarySearch(List<? extends Comparable<? super T>> list, T key)
使用二分搜索法搜索指定列表,以获得指定对象。
(5)fill(List<? super T> list, T obj)
使用指定元素替换指定列表中的所有元素。
(6)replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。
(7)reverseOrder(Comparator<T> cmp)
返回一个比较器,它强行逆转指定比较器的顺序。
(8)synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步(线程安全的)collection。
Arrays:用于操作数组的工具类
asList(T... a)
返回一个受指定数组支持的固定大小的列表。
注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。否则会出现异常。
如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素。
集合变数组;为了限定对元素的操作。
Collection接口中的toArray方法。
九,JDK1.5新特性
高级for循环
格式:
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)
{
}
注意:
对集合进行遍历时,只能获取元素,但是不能对集合进行操作。
迭代器除了遍历,还可以进行remove集合中元素。
如果使用listIterator,还可以在遍历过程中对集合进行增删改查的动作。
传统for和高级for循环有什么区别呢?
高级for循环有一个局限性,必须有被遍历的目标。
建议在遍历数组时,建议使用传统for循环。
可变参数
JDK1.5版本之后出现的新特性。
方法的可变参数,
在使用时注意,可变参数一定要定义在参数列表最后面。
静态导入
注意:
当类名重名时,需要指定具体的包名。
当方法重名时,指定具备所属的对象或者类。
-------------ASP.Net+Unity开发、.Net培训、期待与您交流! ------------
详情请查看:www.itheima.com
-----------------ASP.Net+Unity开发、.Net培训、期待与您交流! -----------------
集合框架
一,概述:
1、简述:
所谓集合,就是为方便对多个对象的操作,对对象进行存储。集合就是存储对象最常用的一种方式。
2、集合与数组的区别:
数组:可存储同种类型的数据,但长度固定,也可存储基本类型的数据
集合:只可存储对象,长度可变,类型可以不同。
3、集合的特点:
只用于存储对象,长度可变,也可存不同类型的对象。
集合是一个接口,将每种容器的共性提取,形成的一个体系。
4、数据结构:
由于每种容器对数据的存储方式都各不相同,所以出现了不同的容器。此种存储方式称之为数据结构。
5、集合中存储的都是对象的引用(地址)。
二,集合体系如下图所示
三,集合共性方法操作
1、增加:
add(Object obj); 添加元素
2、删除:
remove(); 删除集合中指定参数的元素
removeAll(); 删除当前集合中与另一集合相同的元素,即只保留与另一集合不同的元素
clear(); 清空集合中的元素,集合还存在
retainAll() 保留此collection中那些也包含在指定collection中的所有元素
3、获取集合长度:
size(); 获取集合长度,即集合元素的个数
4、修改:
set(int index,e); 将指定位置(index)上的元素修改为给定的参数e
5、判断:
boolean contains(e); 判断给定元素e是否存在于集合中
6、迭代器:iterator() 集合取出元素的方式
boolean hasNext(); 判断是否还有下一个元素
next(); 取出下一个元素
集合体系如下:
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|---ArrayList:底层的数据结构使用的是数据结构。特点:查询速度很快。但增删稍慢。线程不同步。
|---LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询速度稍慢。
|---Vector:底层是数组数据结构。线程同步。被ArrayList替代。
|--Set:元素是无序的,元素不可以重复。Set集合的功能和Collection是一致的。
|--HashSet:底层数据结构是哈希表。线程非同步。
HashSet是如何保证元素唯一性呢?是通过元素的两个方法,hashcode、equals方法来比
1b0e2
较
如果元素的hashcode值相同,则不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
|--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据是compareTo
方法;
TreeSet 排序的两种方式:
TreeSet排序的第一种方式:让元素自身具有可比较性。元素要实现Comparable接口,覆盖compareTo方法。
这种方式称为元素自然顺序,也叫默认排序。
TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集
合自身具备比较性。在集合初始化时,就有了比较方式。
即定义一个类,实现Comparator接口,覆盖compare方法。
当两种排序都存在时,以比较器为主。
四,List集合
List:
特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index)
subList(from,to)
listItertor()
五,Set集合
如上。
六,泛型
JDK1.5版本以后出现新特性。用于解决安全问题,是一个安全机制。
优点:1.将运行时期出现的问题ClassCastException,转移到了编译时期。
方便于程序员解决问题,让运行时期问题介绍,安全。
2.避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
泛型通常出现在集合框架框架中。<>其实就是用来接收类型的。
当使用集合时,将集合要存储的数据类型作为参数传递到<>中。
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。
泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
为了让不同的方法可以操作不同的类型,而且类型还不确定。那么可以将泛型定义在方法上
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在静态方法上。
七,Map集合
该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
常见操作
1,添加。
put(K Key,V Value),添加元素,如果出现添加时是相同的键,那么后添加的值会覆盖原有键对应的值。并且put方法会返回被覆盖的值。
putAll(Map<? extends K,? extends V>)
2,删除。
clear()
remove()
3,判断。
cotainsKey(),
cotainsValue()
isEmpty()
4,获取。
get(Object key)
size()
values()
entrySet()
keySet()
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。线程同步。jdk1.0,效率低
|--HashMap:底层是哈希表数据结构,可以使用null键null值。线程非同步。jdk1.2,效率高
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于map集合中的键进行排序。
和Set很像。其实,Set底层使用的就是Map。
map集合取出原理。
将map集合转成SET集合。再通过迭代器取出。
map集合的两种取出方式:
1,Set<K> KeySet: 将map中所有键存入到Set集合。因为Set具备迭代器,所以可以根据get方法,获取每一
个键的值。
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();
}
}
八,集合框架的工具类
Collections:常见方法:
(1)sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序。
(2)sort(List<T> list, Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。
(3)max(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器产生的顺序,返回给定 collection 的最大元素。
(4)binarySearch(List<? extends Comparable<? super T>> list, T key)
使用二分搜索法搜索指定列表,以获得指定对象。
(5)fill(List<? super T> list, T obj)
使用指定元素替换指定列表中的所有元素。
(6)replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。
(7)reverseOrder(Comparator<T> cmp)
返回一个比较器,它强行逆转指定比较器的顺序。
(8)synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步(线程安全的)collection。
Arrays:用于操作数组的工具类
asList(T... a)
返回一个受指定数组支持的固定大小的列表。
注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。否则会出现异常。
如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素。
集合变数组;为了限定对元素的操作。
Collection接口中的toArray方法。
九,JDK1.5新特性
高级for循环
格式:
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)
{
}
注意:
对集合进行遍历时,只能获取元素,但是不能对集合进行操作。
迭代器除了遍历,还可以进行remove集合中元素。
如果使用listIterator,还可以在遍历过程中对集合进行增删改查的动作。
传统for和高级for循环有什么区别呢?
高级for循环有一个局限性,必须有被遍历的目标。
建议在遍历数组时,建议使用传统for循环。
可变参数
JDK1.5版本之后出现的新特性。
方法的可变参数,
在使用时注意,可变参数一定要定义在参数列表最后面。
静态导入
注意:
当类名重名时,需要指定具体的包名。
当方法重名时,指定具备所属的对象或者类。
-------------ASP.Net+Unity开发、.Net培训、期待与您交流! ------------
详情请查看:www.itheima.com
相关文章推荐
- 开启博客
- 今天遇到的3到智力面试题(给工人分金条,小鸟来回在2火车之间飞行的距离,精确称水问题)
- 阿里巴巴校招面试题目集锦
- 职业规划
- 黑马程序员——第八篇_内部类
- 黑马程序员——第七篇_高新技术
- 阿里一面(电话面试)
- IT人职业规划(绝对给力)
- 5. NSNotification和KVO的区别和用法是什么?
- 黑马程序员——Java集合之Map
- 剑指Offer面试题4(Java版),替换空格
- C#面试题
- 一个block的面试题(刀哥)
- 2015年程序员生存报告 你苦你先看
- 剑指offer-面试题20.顺时针打印矩阵
- BAT Android工程师面试流程解析+还原最真实最完整的一线公司面试题
- BAT安卓工程师面试流程解析+还原最真实最完整的一线公司面试题
- 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
- 博客开张之面试(1),SQL语句
- 剑指offer-面试题.二叉树的镜像