黑马程序员——集合的学习

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

  今天主要了解了:Set集合派系的特点,Set接口方法。HashSet集合,自身特点,哈希值与哈希表,关于哈希值的面试题。LinkedHashSet集合了解。TreeSet二叉树,自身特点包含存储方式,对象的自然顺序Comparable,比较器Comparator。Map集合特点Map接口中的方法等。
 
Set集合派系
 Set派系不存储重复元素,没有下标,无序集合
 无序集合:存储的顺序和取出的顺序不一致
 Set接口中的方法和父接口Collection方法一致

HashSet集合
 HashSet其实就是HashMap
 无序集合,允许存储null
 线程不安全运行速度快
 底层数据结构哈希表,存取速度快

 HashSet集合底层哈希表,存储对象的哈希值
 HashSet调用存储的对象的哈希值(hashCode())获取哈希值,判断集合中有没有,如果没有,直接存储。如果哈希值已经存在,再次调用对象的equals方法进行比较,equals返回真,判断同一对象不存,equals方法返回假,挂靠在原有哈希值的下面形成桶状结构

 HashSet集合,如何保证对象的唯一性,依靠对象自己的hashCode和equals方法,要求存储到哈希表的对象,必须重写hashCode和equals方法。
 八种基本类型包装类,String类,重写了hashCode和equals方法

哈希值
 哈希值:JVM根据自己底层的哈希算法,给对象计算一个十进制的数
 Object类中,有个方法 int hashCode()负责计算对象的哈希值
每一个对象,都有自己的哈希值,如果子类重写了hashCode方法,看到的就是自己的定义的十进制数,如果没重写,使用的就是父类的方法
 Object类的方法hashCode出现的目的,提供哈希表的性能

LinkedHashSet
   有序的Set集合,怎么存储的就怎么取出
 底层基于链表的哈希表,维护者迭代的顺序
 也是一个线程不安全的集合,运行速度快
 开始版本JDK1.4

TreeSet集合
  底层数据结构二叉树
  线程不安全集合,运行速度快
  对于存储到TreeSet集合的对象,进行排序

TreeSet存储自定义的Student的时候,出现类型转换异常,不能被转换成java.lang.Comparable。
异常出现的原因,TreeSet集合对元素进行排序,Student对象不具备可排序性
存储的是String类的对象,没有问题可以排序,String对象,有可排序性,String利用的字符串的字典顺序进行排序,称为对象的自然顺序。
如果存储的是Student对象,让这个对象也具备自然顺序,集合就可以排序了

Comparable接口,实现这个接口的类,具备了自然顺序,重写接口中的方法compareTo,方法称为自然顺序的比较方法
String类实现了Comparable接口,重写了compareTo方法,String类具备了自然顺序,TreeSet集合就可以对象String类的对象排序。abcd顺序
" ab".compareTo("aa") 返回的是int参数
 调用者大,返回正数
 调用者小,返回负数
 一样大,返回0

Student类实现Comparable,重写compareTo方法,具备了自然顺序
比较姓名(主要条件),如果姓名相同,比较年龄(次要条件),姓名不相同不比较年龄
Student姓名是String类型,String自己有自然顺序
zhangsan
zhangsan.compareTo(lisi) 正数
zhangsan.compareTo(lisi) 负数
zhangsan.compareTo(lisi) 是0 
后进的对象,调用自己的compareTo方法,将先进去的对象当作参数传递
如果compareTo方法返回正数,后进去的大,排在后面
如果compareTo方法返回负数,后进去的小,排在前面
如果compareTo方法返回是0,集合判断同一个对象,不存
TreeSet对存储对象排序,判断是不是存在,就是看对象自己的compareTo方法的返回值

比较器
 TreeSet集合的构造方法,传递一个比较器对象,TreeSet按照传递的比较器进行排序
 构造方法的参数 Comparator
 Comparator是在java.util. Comparator接口,TreeSet构造方法,传递一个接口类型的参数,传递实现类的对象。
 比较器优先于对象的自然顺序,如果TreeSet指定的比较器,集合不在考虑对象的自然顺序了。
 定义实现类,实现Comparator接口,重写compare方法,自己定义Student的比较方法,比较年龄,将实现类的对象传递给TreeSet集合构造器

字符串排序
  集合存储字符串,要求对字符串排序,不按照字典顺序,按照长度排序,如果字符串的长度相同,请你按照字典顺序
 TreeSet集合本身就可以对字符串进行字典顺序排序,不按照字典顺序,自己写比较器

Map概述
  存储对象,一次存储两个对象,一个叫做键,一个叫做值,键是不能重复的,一个键只能对应一个值(双列集合,键值对)
  Map存储两个对象,Collection存储1个对象
  Map<K,V>  K 存储到集合的键的泛型  V存储到集合值的泛型
 
Map接口中的方法
V put(K,V)将键值对存储到集合中,返回值,如果存储重复的键,返回被覆盖之前的值,没有存储重复键,返回null
V get(Object obj)根据键,获取这个键对应的值.如果没有这个键,返回null
void clear()清空集合中的所有元素
int size()返回集合中键值对的个数
boolean containsKey(Object obj)判断集合中有没有这个键,有返回true
boolean containsValue(Object obj)判断集合中有没有这个值,有返回true
Collection values()将集合中的值存储到Collection集合
V remove(Object o)根据键,移除整个键值对,返回被删除前的值


 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值