我是靠谱客的博主 醉熏项链,最近开发中收集的这篇文章主要介绍[JavaSE进阶笔记]day07 set集合,泛型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

红黑树

Set

哈希值

HashSet

哈希表

LinkedHashSet

TreeSet

Collections

泛型

类型通配符


红黑树

        二叉树:每个结点分支不超过两个,左边叫左子树,右边叫右子树

        排序树,查找树:二叉树的基础上小的放左边,右边放大的,遍历时从左向右遍历(TreeSet)

        平衡树:左右两子树子树高度差不超过一,且子树也是平衡二叉树

        红黑树:趋近于平衡树,查询速度快(二分查找),增删也不慢,条件为查询叶子结点最大次数和最小次数不超过2倍

        红黑树约束:1.节点可以是红色的或者黑色的 2.根节点是黑色的 3.叶子结点(特制空节点)是黑色的 4.每个红色结点的子节点都是黑色的 5.任何一个节点到其每一个叶子结点的所有路径上黑色节点数相同

Set

        方法全部来自于Collection,允许存放null元素,不包含重复元素,没有索引

哈希值

        JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

        Object类当中hashCode()为native本地方法,返回对象的哈希值(根据地址算出),无参数,同一个对象调用多次此方法返回的哈希值相同,默认情况下,不同对象的哈希值是不同的,但是通过方法重写,可以实现哈希值相同

        String中重写了hashCode方法,相同字符的不同对象哈希值相同,但部分不同中文的字符串的哈希值是相同的

        因此哈希值不同,内容一定不同,哈希值相同,内容不一定相同,需要调用equals来进一步判断

HashSet

        1.底层为哈希表(数组+单向链表/红黑树),当链表结点>=8并且数组元素>=64把链表变为红黑树。2.查询快,增删也不慢 3.无索引 4.不可重复,依赖于hashcode和equals 5.无序 6.线程不安全

哈希表

        哈希表:是一种特殊的数据结构,JDK8之前,底层为数组+链表,即元素为链表的数组,JDK8之后,长度比较长时,底层进行了优化。底层为数组+单向链表/红黑树,当链表结点>=8并且数组元素>=64把链表变为红黑树。

        add方法调用时①使用hashcode方法,取得对象的哈希值 ②将哈希值对16进行取余操作(int数字&(数组长度-1))后的值作为索引,存入0~15的列表(数组)中 ③如果对应索引位置没有对象,则直接存储 ④如果有了对象,则将具体的哈希值进行逐个比较,如果不同,则直接存储,存储方式为链表(以原先的对象为头结点,加入以新对象为内容的新结点),如果相同,使用equals方法逐个比较当前索引每个元素具体的内容,如果内容相同,说明内容重复,不存储,如果都不同,以链表的形式存储。称为hash的散列算法

        此时,当结点>=8元素>=64变为红黑树提高效率

        加载因子指当数组元素的使用比例>0.75时数组就会自动扩容(原有数组长度的二倍)。加载因子不宜过大也不宜过小

        数组中存储的为Node节点

        因此HashSet集合想要保证元素的唯一性,类中就需要重写hashCode()和equals()方法

        重写后hashcode不再由地址值产生,而是根据内容获取哈希值

LinkedHashSet

        继承自HashSet

        ①底层数据结构为哈希表和链表(数组+双向链表/红黑树)②可以预测迭代顺序(存储顺序和取出顺序相同)③无索引 ④不可重复 ⑤线程不安全

TreeSet

        可以进行自然排序(从A~Z,采用无参构造),或者直接的比较器排序(TreeSet(Comparator comparator)),没有索引,由小到大为s1-s2,由大到小为s2-s1。

        若自己的类想实现自然排序,需要在写的类后面加上接口实现,即implication Comperable,重写其中的方法时,return 0表示传入的对象永远相同,不会传入第二个对象,return 1表示传入的数据永远比之前的数据大,因此按照存储的顺序进行存储。

        比较字符串用String 的compareTo方法,即this.name.compareTo(s.name),有几个成员变量就要比较几个,否则会导致对象丢失

        有参构造:通常采用匿名内部类的方法创建实现类,书写比较规则

Collections

        针对集合操作的工具类

        sort(),参数为List接口,无返回值,将列表升序排序(字符串按ASCII码对比),如果要对自己定义的类进行排序,需要将自己的类实现自然排序接口,或者在sort的参数中加入一个比较器对象(由于只能对list使用,不存在自动去重),由小到大为s1-s2,由大到小为s2-s1

        如果想要一个类可以直接进行比较,需要这个类实现Comparable接口,重写compareTo方法,想要根据对象的变量进行比较则需要return this.变量-s.变量的正负值,this.变量表示每次存储进来的数据,s.变量表示后一个元素的数据

        reversr(),参数为List接口,将列表反转

        shuffle(),参数为List接口,无返回值,随机排列列表

        addAll(),参数为Collection接口和可变参数,返回boolean,将可变参数添加到Collection接口

泛型

        只能为引用数据类型

        JDK5之后引入的特性,提供了编译时的类型安全检测机制,本质为参数化类型,将所操作的数据指定为一个类型。将原来具体的参数类型化,在使用/调用时传入具体的类型

        可以用在类,方法,接口中,称为泛型类,泛型方法,泛型接口

        格式:<>指定一种类型,可以看做一种类型的形参 指定多种类型的形参

        类型表示形参,传入的数据为实参,且只能为引用数据类型

        好处:将数据类型统一,将运行时异常提前至编译时异常(将类型转换异常提前),运行过程中不需要加向下转型(强制转换),实现了代码的模板化,参数化了类型,提高了代码了复用性

        泛型类:定义格式:修饰符 class 类名{ },泛型的类型常用T:Type,E:Element,K,V,表示该类中的成员变量可以为T,E,K,V类型,T表示可以为任意类型,在创建对象时指定泛型的类型即可。可以定义为成员变量类型,创建类对象时不指定类型则表示Object类

        泛型方法:定义格式:修饰符 返回值类型 方法名(泛型类型 变量名){ },在方法名后加<>,变量名的泛型来自于泛型方法,而不是泛型类,从而在创建类对象时不用指定泛型种类,在调用方法时指定泛型种类即可,主要用于传递不同类型的参数。(如果想多态创建,使用泛型方法)

        静态方法不能使用类的泛型(因为静态方法可以不创建对象就使用)

        泛型接口:定义格式:修饰符 interface 接口名{ },其实现类的格式:修饰符 class 类名 implements 接口名{ }(这种方式是直接指定了泛型类型),或者修饰符 class 类名 implements 接口名{ }(这种方式表示将实现类的泛型传递给接口泛型)

类型通配符

        泛型不存在多态

        一般用于方法的形参中,便于规范泛型的种类

        用于匹配泛型,不能定义泛型。与泛型方法效果相同

        如:List表示元素类型未知的List,可以匹配任何类型,List接口实现类的任意泛型(引用数据类型)都可以接收,表示为任何泛型List的父类,但不能添加元素到其中

        如果不想匹配任何类型可以使用上限,格式:,如List表示其类型为Number或其子类,表示小于等于某一类型。方法内为父类多态调用

        同时也可以指定其下线,格式,如表示其类型为Number或其父类,表示大于或等于某一类型。方法内为object的多态调用

        通配符具体的类型有等号右侧的泛型指定

        T extends MyComparable表示T必须实现MyComparable接口,并且这个接口的类型是T或者T的父类,可以提高灵活性

最后

以上就是醉熏项链为你收集整理的[JavaSE进阶笔记]day07 set集合,泛型的全部内容,希望文章能够帮你解决[JavaSE进阶笔记]day07 set集合,泛型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部