day18

本文介绍了Java集合框架中的排序机制,着重讲解了TreeSet和HashSet的区别,包括它们如何根据元素排序、自定义排序和使用Comparator。学习了如何在自定义类中实现Comparable接口,以及如何利用Comparator进行定制化排序。
摘要由CSDN通过智能技术生成

Day17-集合

  1. Collection
    1.1 排序
    比较器有两种 : 1 元素自身比较器Comparable(compareTo), 2 比较器类(Comparator优先级高)
    treeSet添加的元素必须排序
    两种方式 :
  •  1 要添加的元素对应的类实现java.lang.Comparable接口,并实现compareTo方法
    
  •  2 使用java.util.Comparator比较器类
    

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

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

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

自己写的用Comparable,他人写的 我们去使用时,用Comparator。

1.2 Set
1.2.1 TreeSet

  • TreeSet : 元素必须有序,添加的元素会按照某种规则自动排序
  • 想要使用TreeSet,元素必须要排序
  •  数字 : 默认从小到大
    
  •  字符串 : 默认比较每位ASCII码
    
  •  日期 : 默认比较自然日期 昨天-今天-明天
    

1.2.2 HashSet
1.2.2.1 散列表

  • hash算法 : 是一种安全的加密算法,把不定长的值改变为定长值,并不能保证唯一性
  • 散列表 :
  •  数组中 保存链表(单向链表),并且链表节点内有四个属性
    
  •  		1 key  2  value  3 next  4  hash
    
    散列表是一种 数据结构,不过java中屏蔽了,直接以封装的形式封装到了HashSet, HashMap 和HashTable中 其中hashTable已经过时

hash算法在java中 就是指 hashCode函数及重写
哈希的目的 就是为了查询快
1 hash过程

  •  拿到对象,调用对象自身的hashCode()方法,然后进行hash算法,得到数组下标,把值保存到对应的数组中,
    
  • Set特性 : 无序 , 不可重复(hashCode和equals)

  • 2 HashSet 和 HashMap

  •  HashSet 就是HashMap的封装,本质就是一个HashMap
    

默认初始化容量 都是 16

  •  封装之后 HashSet把value值屏蔽了,只能操作key,所以在使用set添加的时候,只需要传入key即可
    
  • 3 添加过程
  •  1 使用添加的键值对中的key,调用key的hashCode方法,生成hash值,进行hash算法得到数组下标判断该下标上是否有元素,如果没有,把该键值对 保存到该数组中即可
    
  •  2 如果该数组中有对象,则调用key的equals方法和数组中的元素进行比较,如果相等则key不添加,value值覆盖
    
  •  3 如果不相等,就把该 对象的 添加到已有元素的next属性,形成链表
    
  •  4 如果添加的时候 就已经是链表了,则需要用key和链表中所有的元素key进行比较是否相等
    

1.2.2.2 HashSet使用
散列表中需要使用hashCode和equals来表示对象的唯一性,自定义类型的时候,需要考虑 按需求重新覆写hashCode和equals方法
2. Map
2.1 概述

  • Map : 无序 可重复(指value可重复) value可重复, key不可重复
    Object put(Object key,Object value) : 向map中添加键值对
  • 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集合形式返回

map不能直接遍历,可以通过keySet 等方法进行间接遍历

Map用于保存具有映射关系的数据,因此Map集合里保存两组值。

  1. 一组值用于保存key,一组值用于保存value
  2. key~value之间存在单向一对一关系,通过指定key可以找到唯一的value值
  3. key和value都可以是任何引用类型对象
  4. 允许存在value为null,但是只允许存在一个key为null
    2.2 HashMap

2.3 扩展之Properties

  • 特殊的Map : 强制规定键和值都必须是字符串
  • java.util.Properties
    setProperty()------传两个字符串值。
    getProperty()------可传一个,可传两个,如果传两个, 如下

2.4 SortedMap

  • SortedMap是接口,子实现了是TreeMap,元素必须有序,会按照某个规定进行排序
  1. 泛型
    3.1 概述
  • 类型检查 : 编译过程中,检查数据类型是否匹配

  • 什么是泛型 : 就是在集合声明的时候指定了该集合的数据类型,指明了类型之后,再向集合中添加数据的时候,编译器就会对数据类型进行校验

  • 指定存储的类型,编译器在编译阶段,就会检查添加的数据的类型是否匹配,不匹配就报错

  • 泛型只能是引用数据局类型,不能是基本数据类型

  • 优点 : 统一了数据类型,减少数据类型转换

  • 缺点 : 只能存储单一类型的元素

  • 虽然指定了泛型,但是 存进去的元素 还是会发生向上转型为Object类型,只是 取出来的时候,可以直接获取元素类型,不需要强制类型转换
  • 泛型常用的标记 T , ? , E , K , V
  •  T type : 表示是一个java类型
    
  •  E Element : 元素,表示集合或者数组中的数据
    
  •  KV : key,value  键值对
    
  •  ? : 表示一个不确定的类型
    

如果 人家规定了泛型,让我们指定数据类型,我们不指定的情况下,默认是Object
3.2 使用
不使用泛型,什么也能放,但是获取使用的时候,需要向下 转型 比较麻烦,
使用泛型,放的内容受到限制,但取出时不用向下转型

可自定义泛型 默认是Object。 类上,new对象时。

MyClass class1 = new MyClass ();
后面的可加可不加,但前面的必须有

不改变源码情况下,让元素可以排序。 很重要!! Collection.sort(arrayList);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值