JAVASE23天从入门到精通_Day14

数据结构红黑树
红黑树 :  Tree

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TreeSet
TreeSet<E> : 底层数据结构是红黑树结构的Set接口实现
	特点 :  元素唯一,元素存取无序(带有排序功能),元素无索引
	
创建对象:
	TreeSet<E> 集合名 = new TreeSet<E>();

增删改查四类功能:: boolean add(E e)  : 往集合中添加元素,返回添加是否成功
	删 : boolean remove(Object obj) : 按照传入的元素值删除元素
		void clear() : 清空
	改 : 没有set方法,因为没有索引
    查 : 没有get方法,因为没有索引
    	boolean contains(Object o) 
 		boolean isEmpty()  
        int size()  
        
遍历 :
	1. 转数组 : Object[] toArray()  
	2. 普通迭代器 :Iterator<E> iterator() 
	3. 增强for
    
有几种排序? 升序,降序    

TreeSet集合中存储整数 : 默认排序规则是自然升序
TreeSet集合中存储字符串 : 默认排序规则是自然升序(编码表所对应的值)
        越靠前的字符优先级越高!
绑定比较器-Comparable
绑定比较器-Comparable<E> 跟着元素类型走的,只要是此类型的对象都按照绑定比较器提供的规则走!!

TreeSet集合带有排序功能!! 但是规则需要程序员来决定!!

    当存储自定义元素到TreeSet集合时,需要向集合提供元素的排序规则!!
        方式1: 使用绑定比较器 -> Comparable<E>
            为什么叫绑定比较器 : 这个接口是泛型类去实现和泛型类绑在了一起,此类型的对象都按照这个方式排序
                Comparable<E>接口中有且仅有一个抽象方法:
                    int compareTo(E e)
                    如果你想升序 : this - o
                    如果你想降序 : o - this
独立比较器-Comparator
独立比较器-Comparator<E> 跟着容器走的 ,独立比较器-Comparator<E> 优先级高于 绑定比较器-Comparable<E>

Comparator<E> 接口:
	有且仅有一个抽象方法 : int compare(E o1,E o2):
		 			如果你想升序 : o1 - o2
                    如果你想降序 : o2 - o1
                    
使用场景:
	public TreeSet(Comparator<E> comparator)
Tree结构 :排序方法的底层原理
核心原理:
		0 : 剔除
        正数 : 放右边
        负数 : 放左边

Comparable<E>:  接口中的compareTo(E o)
        this: 要添加的元素
        o : 老元素
        this - o --> 升序
数组和List集合的排序功能
数组的排序:
	Arrays 操作数组的工具类型:
		1. static void sort(基本数据类型元素的数组)   : 按照自然升序的方式对数组元素进行排序(底层原理:快速排序)
        2. static void sort(Object[] a) : 如果参数是引用数据类型数组,sort方法中的数组元素类型就需要提供排序规则!!
        3. static void sort(T[] a, Comparator<T> c) : 带有独立比较器的sort方法,对对象数组进行元素排序
        
List集合的排序:        
 	Collections 操作单列集合的工具类型:
		1. static void  sort(List<T> list) : 对传入的List集合对象进行排序,要求集合元素类型必须提供排序规则!!
 		2. static void sort(List<T> list, Comparator<T> c)  : 带独立比较器的sort方法
Collections
Collections  操作单列集合的工具类型:
	static boolean addAll(Collection<T> c, T... elements) : 把第二个参数的所有元素一次性添加到第一个参数的集合中! --> 批量添加

二分查找的方法: 前提是序列有序!!
    //Collections中的二分查找方法 强制要求集合的元素类型提供排序规则
	static <T> int binarySearch(List<T> list, T key): 先排序,后查找 //要求集合泛型自带规则
    static <T> int binarySearch(List<T> list, T key, Comparator<T> c)  : 先排序,后查找 //带独立的比较器 
    
集合元素赋值:    
    static <T> void copy(List<T> dest, List<T> src): 把第二个参数的集合内容复制到第一个参数里 
    
填充方法:
	static <T> void fill(List<T> list, T obj) : 把第二个参数填充到第一个参数的集合中

最大值最小值 : max,min

翻转:
	static void reverse(List<?> list) 

随机打乱集合中元素的顺序        
	static void shuffle(List<?> list) 
  
实时final现象
前提: 当局部变量在匿名内部类中使用时,需要在变量的前面加final关键字 把变量变常量!!
	1. 为什么要加final : 生命周期的问题
       局部变量 : 随着方法的调用而产生,随着方法的执行完毕而死亡 -> 活的短
       (匿名内部类)对象 : 随着new一下对象产生,对象要等到垃圾回收机制空闲的时候回收而死亡 -> 活的久
       因为对象活的久,当对象没死局部变量死了,而在对象内部使用这个局部变量时就找不到这个局部变量了!!
       于是  在局部变量的前面加 final -> 把局部变量变常量 --> 常量存放在常量池中
    2. 实时 -> JDK7/8 出现的
       实时 -> 为了方便程序员  在7/8版本之前你需要手动加final,现在当JVM发现有局部变量在匿名内部类对象中使用,会自动加上final-> 实时
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值