集合补充,Map,散列

1. 集合补充

/

1.1treeSet添加的元素必须排序

两种方式 :
1 要添加的元素对应的类实现java.lang.Comparable接口,并实现compareTo方法
2 使用java.util.Comparator比较器类

如果要添加的元素符合两种比较器,则 Comparator优先(compare方法)

Comparable : 要添加的元素 实现该接口并覆写compareTo方法
Comparator : 比较器类 常应用比如Integer默认升序;
我想降序怎么办? 使用Comparator进行降序排序

如果添加的元素的类
我们应该使用 Comparable , 因为对扩展开发
其他人还可以使用 Comparator 实现新的排序功能

如果添加的元素的类不是我们写的
(1)该类有排序(实现了Comparable) 比如Integer 但是 默认排序结果不是我们想要的
我们可以使用Comparator进行调整排序,因为优先级高
(2)如果该类没有实现排序(没有实现Comparable);
这时候我们需要使用Comparator进行排序
因为我们不可能去改变人家类的源码

1.2 hash算法

一种安全的加密算法
把不定长的值改变为定长值
存在哈希冲突

散列表 :
数组中保存链表(单向链表) 链表节点内有四个属性
1 key 2 value 3 next 4 hash

散列表是一种数据结构
以封装的形式封装到了HashSet、 HashMap 和HashTable中
其中hashTable已经过时

hash算法在java中,就是指 hashCode函数及重写

哈希的目的就是为了查询快;因为hash是一个固定的值

hash过程
拿到对象
调用对象自身的hashCode()方法
然后进行hash算法
得到数组下标
把值保存到对应的数组

Set特性 : 无序不可重复 (hashCode和equals)

HashSet 和 HashMap

HashSet 就是HashMap的封装
本质就是一个HashMap
默认初始化容量 都是 16
封装之后 HashSet把value值屏蔽了
只能操作key
所以在使用set添加的时候 只需要传入key即可

添加过程
使用添加的键值对中的key,调用key的hashCode方法生成hash值
进行hash算法得到数组下标

判断该下标上是否有元素,如果没有把该键值对 保存到该数组中即可;
													如果该数组中有对象 则调用key的equals方法和数组中的元素进行比较
如果相等则key不添加value值覆盖;								
如果不相等,就把该对象的添加到已有元素的next属性,形成链表;
如果添加的时候就已经是链表了,则需要用key和链表中所有的元素key进行比较是否相等

因为散列表中 需要使用hashCode和equals来表示对象的唯一性

所以在进行添加自定义类型的时候
需要考虑 按需求重新hashCode和equals方法

2.Map

2.1Map : 无序 可重复

  • value可重复 key不可重复
  • Map和集合的操作基本都是一样的
  • Object put(Object key,Object value) : 向map中添加键值对
  • void clear() : 清空
  • int size() : 添加个数
  • boolean isEmpty() : 判断是否为空
  • Object get(Object key) : 根据key 获取value
  • Collection values() : 获取map中的所有value值,以集合形式返回
  • booelan containsKey(Object key) : 判断是否包含某个key
  • booelan containsValue(Object value) : 判断是否包含某个value
  • Set keySet() : 获取map中的所有key,以Set集合形式返回
  • Set entrySet() : 返回map中的键值对映射(key=value)
  •  							以Set集合形式返回
    
  • V remove(Object key) : 根据key删除指定映射关系
  •  										返回value值
    
  • map不能直接遍历
  • 可以通过keySet 等方法进行间接遍历

2.2SortedMap是接口

  • 仅实现了是TreeMap 元素必须有序 会按照某个规定进行排序
  • 实现排序的原因 :
  • 1 被添加的元素,实现了Comparable接口
  • 2.编写一个比较器类,该比较器类必须实现Comparator接口
    3.类型检查
    3.1类型检查 :
    编译过程中,检查数据类型是否匹配
  • 什么是泛型
  • 集合就跟数组一样 都是只能放同一种数据类型的
  • 引入泛型之后,我们可以指定存储的类型
  • 编译器在编译阶段,就会检查添加的数据的类型是否匹配
  • 泛型只能是引用数据局类型
  • 优点 : 统一了数据类型
  •  	减少数据类型转换
    
  • 缺点 : 只能存储单一类型的元素
  • 在集合声明的时候指定了该集合的数据类型
  • 指明了类型之后,再向集合中添加数据的时候
  • 编译器就会对数据类型进行校验
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值