java - Object,泛型,子接口Set

文章详细介绍了Java中Object类的基本方法如clone(),equals()和finalize(),并探讨了泛型的概念,包括泛型类、泛型接口以及泛型方法的使用,强调了泛型带来的类型安全性和便利性。此外,还讨论了泛型的上限、擦除和通配符,并特别提到了Java集合框架中的Set接口及其常见实现类如HashSet,TreeSet和LinkedHashSet,这些实现类如何确保元素的唯一性。
摘要由CSDN通过智能技术生成

一,Object的一些方法

  • Object类是所有类的根父类,它里面的方法,所有类型的对象都具有。

  • Object类型的变量可以接收任意类型的对象

  • Object[]类型的数组,可以接收任意类型的对象数组,但不能接收一维的基本数据类型数组

public Object clone()//需要抛异常

public boolean equals()//比较对象是否相等

所有对象包括数组对象都会从Object继承equals方法(需要重写)

toString()

finalize()

二,泛型

早期的时候,在设计类或方法时,无法确定某些成员的类型,例如,设计集合的时候,无法确定元素的类型,之前只能采用Object等父类型处理。这样做的好处,确实可以接纳所有类型的对象,但是也带来了问题:

  • 安全性问题:在编译时无法及时,尽早的检查出问题

  • 使用的不方便:需要向下转型,而且向下转型还有风险

1什么是泛型?

类名,接口,方法的返回值前面出现的<类型>形式

类型的检查和编译提前到了编译。

泛型类(泛型)和接口(泛型)

三,泛型类与泛型接口

把类型作为参数进行传递。

例如:声明Collection集合时是 java.util.Collection<E>,用<E>代表未知的类型。

使用时,Collection<Integer> 用<Integer>来指定<E>的具体类型,相当于 Integer给E赋值

使用(重要)

因为核心类库中,包括后面第三方工具组件中,有大量的已经定义好的泛型类和泛型接口。

java.util.Collection<E>

java.util.ArrayList<E>

java.util.Iterator<E>

  • 泛型类和泛型接口

    • 类名<泛型>、接口名<泛型>

  • 泛型方法

    • 【修饰符】 <泛型> 返回值类型 方法名(【形参列表】)【throws 异常类型列表】{}

语法格式:

【修饰符】 class 类名<泛型>{
    
}
【修饰符】 interface 接口名<泛型>{
    
}

注意:

  • 声明的时候<T>,只能写单个的大写字母,例如<T>,<E>等,不建议写单词

  • 如果有多个未知的类型,可以同时声明多个泛型,例如:<K,V>,<T,U,R>

  • 使用泛型类或泛型接口时,给<T>等指定具体类型时,不能指定为基本数据类型,必须指定为引用数据类型,如果遇到基本数据类型,请改用包装类。

  • 在泛型类或泛型接口名后面声明的<泛型>类型,不能用于类或接口中的静态成员

  • 当子类继承泛型父类,或实现泛型父接口时,也可以指定泛型的具体类型,也可以重新换一个字母。

需求:

声明一个坐标类Coordinate,有两个属性,a,b,但是现在的问题是属性的类型可能是字符串,可能是整数,可能是小数等。

泛型方法

(1)使用(更重要)

注意:泛型方法的<T>的具体类型,会根据实参的类型自动推断确定,不需要单独再指定了。

例如:java.util.Collection<E>接口中,有一个泛型方法:

  • <T> T[] toArray(T[] a):用于返回集合中的元素,把元素放到一个数组中返回。(1)泛型的上限

  • 【修饰符】 class 类名<泛型 extends 上限>{     }

  • 说明:

  • 上限可以是1个或者是多个,如果有多个,多个之间使用&连接。而且多个上限的话,类只能写1个,其余的都是接口类型。并且类要写在上限列表的最左边。

    • <T extends Number>:表示T代表的类型必须是Number或Number的子类

    • <T extends Number & Comparable>:表示T代表的类型必须是Number或Number的子类,并且该子类还得实现Comparable接口。

    • <T extends Number & Comparable & Cloneable>表示T代表的类型必须是Number或Number的子类,并且该子类还得实现Comparable和Cloneable接口。

  • 无论上限是类还是接口,关键字这里都用extends

    • <T extends Comparable >:所有实现Comparable接口的类型都可以用来给T赋值

    • <T extends Comparable & Cloneable>:所有同时实现Comparable和Cloneable接口的类型都可以用来给T赋值

(2)泛型的擦除(必须避免)

在我们使用泛型类或泛型接口时,没有指定泛型的具体类型,就叫做泛型擦除。例如:

 Collection coll = new ArrayList();//没有给Collection和ArrayLlis指定泛型

泛型的通配符(了解)

要求:能看懂就行

泛型的通配符的形式有3种:

  • 类名<?> 或 接口名<?>:<T>或<E>等代表任意类型

  • 类名<? extends 上限> 或 接口名<? extends 上限>:<T>或<E>等代表上限或上限的子类

  • 类名<? super 下限> 或 接口名<? super 下限>:<T>或<E>等代表等代表下限或下限的父类

当我们要用泛型类或泛型接口,例如:Collection<E>声明变量(或者形参)时,此时还无法为<E>或<T>指定具体类型,但是又不想擦除。此时就可以使用泛型通配符。

四、Collection<E>集合的子接口

1、Set<E>子接口

这种系列的集合,有一个共同的特点:==元素不可重复==。

Set<E>子接口,没有增加方法,用的都是Collection<E>根接口中定义的方法。

Set子接口的常用实现类:

 

 

  • HashSet<E>:元素完全无序

  • TreeSet<E>:元素是有序的,按照大小顺序排列。此时就会依赖于

    • java.lang.Comparable<T>:自然比较接口

    • java.util.Comparator<T>:定制比较接口

  • LinkedHashSet<E>:元素是有序的,按照元素的添加顺序。因为底层有一个链表,把元素按照添加顺序连接起来了。

  • 思考:如何实现元素不可重复的?或者说,元素的什么方法决定了元素是不是重复?

  • HashSet<E>:依据元素的equals方法和hashCode方法。底层是先看hashCode结果,如果hashCode相同,再看equals。如果hashCode不同,就不可equals了。至于底层如何存储,咱们在HashMap再细说。

  • TreeSet<E>:依据大小判断是否重复

    • java.lang.Comparable<T>:自然比较接口,里面compareTo方法如果返回0,就说明元素是“重复”

    • java.util.Comparator<T>:定制比较接口,里面compare方法如果返回0,就说明元素是“重复”

  • LinkedHashSet<E>:依据元素的equals方法和hashCode方法。因为LinkedHashSet是HashSet的子类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值