您的位置:首页 > 职场人生

黑马程序员_集合类

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>>;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: