第九篇 黑马程序员-集合

------- android培训java培训、期待与您交流! ---------

为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个
对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式
数组和集合有什么不同?
数组虽然也可以存储对象,但长度是固定的,集合的长度是可变的
数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
列表迭代器:listIterator
是Iterator的子接口,在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会
发生并发执行异常,所以在迭代时,只能用迭代器方法操作,但是迭代器不能添加,
所以用其子接口listiterator。
枚举就是vector特有的取出方式
枚举和迭代器很像。是一样的
枚举的名称和方法名过长,所以被迭代器代替
ArrayList的底层数据结构是数组结构。
特点:查询快,增删慢。
LinkedList的底层数据结构是链表结构
特点:查询慢,增删较快。
HashSet:底层是哈希表
Set集合的功能和Collection是一致的
hashCode:返回该对象的哈希码值。
假设有哈希值:
Demo@3c
Demo@3c
他们不是同一个对象。
Demo@c17164
Demo@lfb8ee3
在哈希表里面当元素重复的时候,它还有一次校验方式:
如果地址值不一样,你有你的位置,我有我的位置。咱两不是一个元素,如果一样的话,那还要作次判断,
就是判断元素对象是否相同。即判断位置相同以后,还要判断是否是同一个对象。
判断是否是同一个对象用equals方法。
当发现位置是一样的,但是不是同一个对象,这时会在该地址下顺延,又产生一个对象,
这个对象的位置和其是一样的,这时如果哈希值c17164存进来,它在往里面存的话先要和3c碰一下,
判断地址是否一样,如果不一样,它就单独放一个位置。这就是哈希表结构的特点
Set方式取出只有一种方式那就是迭代器。
hashSet是如何保证元素唯一性的呢?
答案:通过元素的两个方法,hashCode和equals来完成,如果元素的HashCode值相同,
才会判断equals是否为true,如果元素的hashCode值不同,不会调用equals.
ArrayList判断元素和删除元素依赖的是equals方法,而HashSet依赖的是hashCode和equals方法。
数据结构不同依赖的方法也不一样
目录:
1.TreeSet
2.TreeSet存储自定义对象
3.二叉树
4.实现Comparator方式排序
5.TreeSet练习
6.泛型概述
7.泛型使用
8.泛型类
9.泛型方法
10.静态方法泛型
11.泛型接口
12.泛型限定
13.泛型限定2
TreeSet:
可以对Set集合中的元素进行排序.底层数据结构是二叉树.
保证元素唯一性的依据:compareTo方法和return 0.
TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口
覆盖compareTo方法。这种方式也称为元素的自然排序,或者叫做默认顺序
TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的
这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式
Comparable<T>接口:
此接口强行对实现它的每个类的对象进行整体排序,这种排序称为类的自然排序。
TreeSet可以进行排序,但是按照什么方式排,你没和它说过,你想说按照年龄排,但是它不知道
为什么不知道?因为这个学生对象根本就不具备比较性。只有存到它里面的对像具备比较性,它才可以对其进行
排序,所以为了让其具备比较性,可以让其实现Comparable接口。就具备比较性了。当其
具备了比较性,那么TreeSet就可以使用其比较性。因为它预先就在使用这个接口中的方法,多态
该接口中只有一个方法,那就是compareTo方法。此方法的作用是比较此对象与指定对象的顺序
返回的是正数,零或负数。
字符串本身具备比较性,但是它的比较方式不是所需要的,这时就只能使用比较器
泛型:
泛型:jdk1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。
好处
1.将运行时期出现问题ClassCastException,转移到了编译时期
方便于程序员解决问题,让运行时期问题减少,安全。
2,避免了强制转换的麻烦
泛型格式:通过<>来定义要操作的引用数据类型
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型
其实<>就是用来接受类型的,当使用集合时,将集合中要存取的数据类型作为参数传递到<>即可。
泛型类:
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早期定义Object来完成扩展。
现在定义泛型来完成扩展
泛型类定义的泛型,在整个类中有效,如果被方法使用
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
为了要不同方法操作不同类型,而且类型不确定,那么可以将泛型定义在方法上
特殊之处:
静态方法不可以访问类上定义的泛型
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上
?表示通配符,也可以理解为占位符
泛型的限定:
? extends E:可以接受E类型或者E的子类型。上限
? super E:可以接收E类型或者E的父类型
Map集合:
该集合存储键值对,往里存,保持键的唯一性。
1.添加
    put(K key, V value)
    putAll(Map<? extends K,? extends V> m)
2,删除
    remove(Object key)
    clear()
3.判断
     containsValue(Object value)
     containsKey(Object key)
4,获取
     size()
     get(Object key)
     values()
    
     entrySet()
     keySet()
    
Map集合:
Hashtable:底层是哈希表数据结构,不可以存入null作为键,nullL作为值的情况,该集合是线程同步的
HashMap:底层是哈希表数据结构,允许使用null键为空值,该集合是不同步的。效率高
TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键排序。
和set很像
其实set底层就是使用了MAP集合。
map集合的两种取出方式:
1.Set<k> keySet: 将map中所有的键存入set集合。因为set具备迭代器,
所以可以用迭代方式取出所有的值,在根据get方法获取每一个键对应的值

map集合的取出原理:将map集合转成set集合,再通过迭代取出。
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry

 

-------- android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值