黑马程序员_集合类
2015-06-17 02:38
453 查看
集合类
集合和数组的区别:
|--数组是固定长度的,而集合是可变长度的;
|--数组当中存储对象的时候存的都是同一种类型的,而集合是只要是对象都是可以的;
|--集合类的应用领域较广泛的;
为什么会出现这么多的容器呢?
|--因为每一个容器对数据的存储方式都有不同,这个存储方式成为:数据结构;
|--因为数据结构的不同,就进行了单独的划分;
add方法里面接收的Object类型的,这个就是可以接收任意类型的对象,也就是多态的出现;
集合里面存储的都是地址,而不是对象,
元素的取出、
|--我的目的是取出元素并操作元素,不是仅仅的取出元素;
|--Iterator<E> iterator() 返回值类型是一个接口
获取迭代器,用于取出集合中的元素;
迭代器
|--其实就是集合的取出元素的方式;
List集合的共性方法
|--list集合的特点:这个集合体系特点是元素是有序的,同时元素是可以重复的,因为该集合体系是有索引的;存个zhangsan,我再存一个zhangsan
|--Set集合的特点:元素是无序的,元素是不可重复的;
|--凡是带有角标的都是list集合的特有方法
|--ListIterator是list集合特有的迭代方法;
|--只有list集合具备,可以改变一个位置上的元素;用的是E
set(int index, E element)
|--凡是带有可以操作角标的方法
都是list体系特有的方法;
ListIterator:列表迭代器
|--想要在迭代过程中,添加或者是删除元素;
List集合特有的迭代器 ListIterator是Iterator的子接口
|--在迭代的时候,不可以通过集合对象的方法操作集合中的元素;否则会反生并发修改异常;
|--所以在迭代的时候,只能用迭代的方式来操作元素,不能既有集合的方式,又有迭代的方式来操作元素,否则会发生并发修改异常;
Collection
|--List
|--ArrayList:底层的数据结构是数组结构,特点:查询速度很快,而增删的速度稍慢;是线程不同步的
|--LinkedList:底层用的是链表的数据结构,特点:查询速度较慢,增删速度很快;是线程不同步的
|--Vector:底层是数据结构是数组数据结构,特点:无论增删或者是查询都是超慢的,这个是线程同步的;被ArrayList替代了;
|--ArrayList和Vector,分别是50%延长和100%的延长,ArrayList这个是比较节约空间的;
|--Vector支持枚举,而ArrayList不支持枚举;
LinkedList:
addFirst()
addLast()
get方法只是在获取元素,但是不删除元素;
getFirst()
getLast()
remove方法在于:获取元素并删除元素;
removeFirst()
removeLast()
ArrayList的第二个练习
|--要用到子类特有的方法的时候,要做向下转型的动作;
|--在ArrayList容器中判断元素是否相同,用的是equals方法;
|--而Person类中的equals方法比较的是地址值是否相同,而这边的所有的元素的地址值都是不相同的;
|--这时我们要有我们自己的比较方法;就是覆盖Object类中的equals方法;
|--要覆盖一下Object类中的equals方法;
|--List集合判断元素是否相同,依据的是元素的equals方法;-->去除重复元素的例子;
|--去除重复元素:第一个是要对人进行描述,分别描述人的姓名和年龄
|--然后要对所有的元素进行遍历,并要进行强转的方法,要使用到子类特有的方法,
|--还有就是去除重复元素,使用的是newAl,判断newAl集合中是否都是单独的元素;
|--还有一个至关重要的动作,就是你要按照年龄和姓名进行排序,它是不知道的,因此,你要覆盖Object类中的equals方法,而建立自己的比较方式,用instanceof进行判断;
|--在List集合里面的 contains和remove底层用的全都是equals方法进行的比较;
Set集合:
|--通过查看API文档,发现Set集合的方法和Collection集合是相同的;
|--Set集合
|--HashSet集合:底层的数据结构是哈希表;线程是不同步的
|--HashSet集合的判断的是哈希值,如果哈希值是相同的话,么还要再判断一下咱们的对象是否是相同的;判断是否是同一个对象,用equals方法;
|--也就是要判断两次;
Set集合的元素取出只有一个就迭代器,因为它里面的方法和Collection方法是一致的;
|--HashSet是如何保证元素唯一性的呢?
|--是通过元素的两个方法,hashCode和equals来完成的;如果元素的HashCode值相同,才会判断equals是否为true,
如果元素的hashCode值不相同,那么就不会判断equals方法;
|--通常情况下,在要定义一个对象的时候,通常情况下要定义两个方法,就是覆盖hashCode和equals方法;
注意:
Set集合
|--HashSet:是无序的
|--TreeSet:是有序的,可以对元素进行排序;
|--HashSet对于元素判断是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法;
|--ArrayList:依赖的是equals
|--HashSet集合依赖的是什么?先依赖hashCode,然后再依赖equals;
|--TreeSet:是有序的,底层的数据结构是二叉树,底层保证元素唯一性的依据是compareTo和return 0;
|--可以对集合中的元素进行排序;
|--在TreeSet集合第一种排序,当主要提交相同时,一定要判断一下次要条件;
|--TreeSet集合的第一种是让元素自身具备比较性,实现Comparable接口,和覆盖compareTo方法;
|--TreeSet集合的第二种排序方式,这时让集合具备比较性,定义一个比较性,将比较器
|--当两种排序都存在时,以比较器为主;
|--二叉树判断元素是否相同都是以return 0;来判断的;
泛型:是1.5出现的类型安全机制;
|--ArrayList<String> al = new ArrayList<String>();-->定义一个容器,这个容器的类型是String类型的;
|--泛型的出现的出处:
|--将运行时期出现的问题,转移到了编译时期,方便程序员解决问题,让运行时期的问题减少,安全;
|--避免了强制转换的麻烦;
集合上面要加泛型。还有就是迭代器上面要加泛型,避免了强转的麻烦;
在使用的java提供的对象时,什么时候使用泛型呢?
|--通常在集合框架中很常见;
泛型类:
|--什么时候定义泛型类:当类中的引用数据类型不确定的时候,早期是定义Object来完成的,现在是定义泛型来完成的;
泛型定义在方法上
为了让不同的方法可以操作不同的类型,而且类型还是不确定的;
那么可以将泛型定义在方法上;
|--泛型定义在方法上,传入什么类型都是可以的;
|--而泛型定义在类上,指定什么类型,就是什么类型;
|--特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上;
|--泛型定义在方法上,要放在返回值类型的前面
泛型的高级应用
?通配符,也可以理解为占位符
泛型的限定:
? extends E:下限
? super E:上限
Map 集合:该集合存储的是键值对,一对一对往里存,而且要保证键的唯一性;
|--Map
|--Hashtable:底层是哈希表数据结构,不可以存入null作为键,null作为值的情况,同步的
|--HashMap:底层是哈希表数据结构,允许使用null键,null值,是不同步的
|--TreeMap:底层是二叉树数据结构,线程不同步的,可以用于给map集合排序;
和Set集合很像;
Map集合的两种取出方式:Map集合是没有迭代器的;
1、keySet:将map中的所有的键存入到Set集合,因为Set集合具备迭代器,所以可以通过迭代的方式取出所有的键,在根据get方法,获取每一个键对应的值;这个里面返回来的是Set集合
2、entrySet:返回的是一个关系,这个关系就是Set<Map.Entry<String,String>>;
集合和数组的区别:
|--数组是固定长度的,而集合是可变长度的;
|--数组当中存储对象的时候存的都是同一种类型的,而集合是只要是对象都是可以的;
|--集合类的应用领域较广泛的;
为什么会出现这么多的容器呢?
|--因为每一个容器对数据的存储方式都有不同,这个存储方式成为:数据结构;
|--因为数据结构的不同,就进行了单独的划分;
add方法里面接收的Object类型的,这个就是可以接收任意类型的对象,也就是多态的出现;
集合里面存储的都是地址,而不是对象,
元素的取出、
|--我的目的是取出元素并操作元素,不是仅仅的取出元素;
|--Iterator<E> iterator() 返回值类型是一个接口
获取迭代器,用于取出集合中的元素;
迭代器
|--其实就是集合的取出元素的方式;
List集合的共性方法
|--list集合的特点:这个集合体系特点是元素是有序的,同时元素是可以重复的,因为该集合体系是有索引的;存个zhangsan,我再存一个zhangsan
|--Set集合的特点:元素是无序的,元素是不可重复的;
|--凡是带有角标的都是list集合的特有方法
|--ListIterator是list集合特有的迭代方法;
|--只有list集合具备,可以改变一个位置上的元素;用的是E
set(int index, E element)
|--凡是带有可以操作角标的方法
都是list体系特有的方法;
ListIterator:列表迭代器
|--想要在迭代过程中,添加或者是删除元素;
List集合特有的迭代器 ListIterator是Iterator的子接口
|--在迭代的时候,不可以通过集合对象的方法操作集合中的元素;否则会反生并发修改异常;
|--所以在迭代的时候,只能用迭代的方式来操作元素,不能既有集合的方式,又有迭代的方式来操作元素,否则会发生并发修改异常;
Collection
|--List
|--ArrayList:底层的数据结构是数组结构,特点:查询速度很快,而增删的速度稍慢;是线程不同步的
|--LinkedList:底层用的是链表的数据结构,特点:查询速度较慢,增删速度很快;是线程不同步的
|--Vector:底层是数据结构是数组数据结构,特点:无论增删或者是查询都是超慢的,这个是线程同步的;被ArrayList替代了;
|--ArrayList和Vector,分别是50%延长和100%的延长,ArrayList这个是比较节约空间的;
|--Vector支持枚举,而ArrayList不支持枚举;
LinkedList:
addFirst()
addLast()
get方法只是在获取元素,但是不删除元素;
getFirst()
getLast()
remove方法在于:获取元素并删除元素;
removeFirst()
removeLast()
ArrayList的第二个练习
|--要用到子类特有的方法的时候,要做向下转型的动作;
|--在ArrayList容器中判断元素是否相同,用的是equals方法;
|--而Person类中的equals方法比较的是地址值是否相同,而这边的所有的元素的地址值都是不相同的;
|--这时我们要有我们自己的比较方法;就是覆盖Object类中的equals方法;
|--要覆盖一下Object类中的equals方法;
|--List集合判断元素是否相同,依据的是元素的equals方法;-->去除重复元素的例子;
|--去除重复元素:第一个是要对人进行描述,分别描述人的姓名和年龄
|--然后要对所有的元素进行遍历,并要进行强转的方法,要使用到子类特有的方法,
|--还有就是去除重复元素,使用的是newAl,判断newAl集合中是否都是单独的元素;
|--还有一个至关重要的动作,就是你要按照年龄和姓名进行排序,它是不知道的,因此,你要覆盖Object类中的equals方法,而建立自己的比较方式,用instanceof进行判断;
|--在List集合里面的 contains和remove底层用的全都是equals方法进行的比较;
Set集合:
|--通过查看API文档,发现Set集合的方法和Collection集合是相同的;
|--Set集合
|--HashSet集合:底层的数据结构是哈希表;线程是不同步的
|--HashSet集合的判断的是哈希值,如果哈希值是相同的话,么还要再判断一下咱们的对象是否是相同的;判断是否是同一个对象,用equals方法;
|--也就是要判断两次;
Set集合的元素取出只有一个就迭代器,因为它里面的方法和Collection方法是一致的;
|--HashSet是如何保证元素唯一性的呢?
|--是通过元素的两个方法,hashCode和equals来完成的;如果元素的HashCode值相同,才会判断equals是否为true,
如果元素的hashCode值不相同,那么就不会判断equals方法;
|--通常情况下,在要定义一个对象的时候,通常情况下要定义两个方法,就是覆盖hashCode和equals方法;
注意:
Set集合
|--HashSet:是无序的
|--TreeSet:是有序的,可以对元素进行排序;
|--HashSet对于元素判断是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法;
|--ArrayList:依赖的是equals
|--HashSet集合依赖的是什么?先依赖hashCode,然后再依赖equals;
|--TreeSet:是有序的,底层的数据结构是二叉树,底层保证元素唯一性的依据是compareTo和return 0;
|--可以对集合中的元素进行排序;
|--在TreeSet集合第一种排序,当主要提交相同时,一定要判断一下次要条件;
|--TreeSet集合的第一种是让元素自身具备比较性,实现Comparable接口,和覆盖compareTo方法;
|--TreeSet集合的第二种排序方式,这时让集合具备比较性,定义一个比较性,将比较器
|--当两种排序都存在时,以比较器为主;
|--二叉树判断元素是否相同都是以return 0;来判断的;
泛型:是1.5出现的类型安全机制;
|--ArrayList<String> al = new ArrayList<String>();-->定义一个容器,这个容器的类型是String类型的;
|--泛型的出现的出处:
|--将运行时期出现的问题,转移到了编译时期,方便程序员解决问题,让运行时期的问题减少,安全;
|--避免了强制转换的麻烦;
集合上面要加泛型。还有就是迭代器上面要加泛型,避免了强转的麻烦;
在使用的java提供的对象时,什么时候使用泛型呢?
|--通常在集合框架中很常见;
泛型类:
|--什么时候定义泛型类:当类中的引用数据类型不确定的时候,早期是定义Object来完成的,现在是定义泛型来完成的;
泛型定义在方法上
为了让不同的方法可以操作不同的类型,而且类型还是不确定的;
那么可以将泛型定义在方法上;
|--泛型定义在方法上,传入什么类型都是可以的;
|--而泛型定义在类上,指定什么类型,就是什么类型;
|--特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上;
|--泛型定义在方法上,要放在返回值类型的前面
泛型的高级应用
?通配符,也可以理解为占位符
泛型的限定:
? extends E:下限
? super E:上限
Map 集合:该集合存储的是键值对,一对一对往里存,而且要保证键的唯一性;
|--Map
|--Hashtable:底层是哈希表数据结构,不可以存入null作为键,null作为值的情况,同步的
|--HashMap:底层是哈希表数据结构,允许使用null键,null值,是不同步的
|--TreeMap:底层是二叉树数据结构,线程不同步的,可以用于给map集合排序;
和Set集合很像;
Map集合的两种取出方式:Map集合是没有迭代器的;
1、keySet:将map中的所有的键存入到Set集合,因为Set集合具备迭代器,所以可以通过迭代的方式取出所有的键,在根据get方法,获取每一个键对应的值;这个里面返回来的是Set集合
2、entrySet:返回的是一个关系,这个关系就是Set<Map.Entry<String,String>>;
相关文章推荐
- 《人,绩效和职业道德》及博客的读后感
- 黑马程序员----Java基础之多线程
- 黑马程序员--Java基础Day11
- Android 面试精华题目总结
- 面向对象:说说程序员不解风情的瞬间
- 让程序员跳槽的非钱原因
- 译:编程面试的10大算法概念汇总
- 搜狐面试mark
- 黑马程序员————BufferReader类,BuffereWriter类使用示例。
- 人,绩效和职业道德 及博客园博客的读后感
- 黑马程序员—————JAVA语言j基础Date日期类和Calendar日类类详解。
- 黑马程序员----Java基础之面向对象(最终篇)
- 程序员修炼之路
- 剑指offer--面试题19:二叉树的镜像--Java实现
- 黑马程序员--------常用集合的遍历方式总结
- 品读程序员晋级之路
- 程序媛的必备素质
- 发文章居然需要审核?
- 程序员面试宝典-实践
- 程序员的级别