Java知识详解(3)~{Hashset和set}

HashSet和Set的区别

HashSet和Set都是Java集合框架中的接口,它们都用于存储不重复的元素。

HashSet是Set的一种实现,它实现了Set接口并使用哈希表来存储元素。因此,HashSet在添加、删除和查找元素时具有很高的性能。但是,由于它使用哈希表,如果元素在哈希表中散列不好,会导致性能下降。

Set是一个接口,它定义了Set集合的基本操作,如添加、删除、查找等。Set接口有两个主要的实现类:HashSet和TreeSet。TreeSet是另一个实现Set接口的类,它使用红黑树数据结构来存储元素。与HashSet不同,TreeSet按照元素的自然顺序进行排序,因此它可以在O(log n)的时间复杂度内进行添加、删除和查找操作。但是,由于它需要维护元素的顺序,因此在插入和删除时比HashSet慢。

Hash存储的数据是无序的,linkedset存储的数据是有序的

你迭代的时候,linkedset出来的顺序和你插入的顺序是一样的

而Hash的是不一样的

Set这个接口的话就是说它可以创建一个编译类型为Set接口类,运行类型类HashSet的对象,而运行类型就是实现类,也就是说Set无法自己实现,只能依靠前面两种类型的Set【HashSet,TreeSet(以及它们的子类)】进行实现,而这就是它们的区别

equals方法

在Java中比较的推荐方法 所以我们一般比较基本数据类型的时候,使用"==",例如 int i = 0; if (i == 1){…},比较两个Integer包装类类型的时候就可以使用equals(),因为Java已经重写了equals()方法了。另外给出几点建议,在java中进行比较,我们需要根据比较的类型来选择合适的比较方式:

对象域,使用equals方法 。 类型安全的枚举,使用equals或== 。 可能为null的对象域 : 使用==null 和 equals 。 数组域 : 使用 Arrays.equals 。 除float和double外的原始数据类型(int,byte等) : 使用 == 。 float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。 double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。

为什么要在我们自己的类中重写equals() 但是有时候我们不满足于使用基本数据类型和Java实现的一些继承自Object的哪些类,比如我们实现一个Person类,它是继承自Object类的,所以它的equals()方法默认使用的是文章开头提到的哪个equals()方法,当我们使用equals()进行比较的时候,比较内存地址,那么有可能出现两个Person对象的参数都相同(比如年龄,身份证号等,在我们的实际认知中认为这两个人就是一个人,应该返回true),但是由于他们的内存地址是不一样的,所以equals()方法会返回false。 那么我们就需要去重写equals()方法。

重写equals()的规范 需要注意的是,在Java规范中,它对equals()方法的使用必须要遵循如下几个规则:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 对称性:对于任何非空引用值 x 和 y,当且仅当y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 传递性:对于任何非空引用值 x、y 和z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回false,前提是对象上 equals 比较中所用的信息没有被修改 对于任何非空引用值 x,x.equals(null) 都应返回false

  1. 是一个方法,并非运算符

  2. 只适用于引用数据类型

  3. Object类中equals( )的定义:

     public boolean equals(object obj) {
            return (this == obj);  //this是指类的当前实例
     }
    
    //此处是在Order类中 @Override public boolean equals(object obj){ if(this == obj){ return true; } if(obj instanceof Order){ Order order =(Order)obj; return this.orderId == order.orderId && this.orderName.equals(order.orderName); //基本数据类型用“==”, 引用数据类型用equals }

通常可以通过Generate自动生成自定义equals方法 macOS 快捷键control+return

如果类中只有一个属性,则直接可以 order.equals(order)

this就是对象引用,这里等于person1的值

Iterator对象称为迭代器,主要用于遍历Collection集合中的元素。所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了iterator接口的对象,

Java迭代器(Iterator)是 Java 集合框架中的一种机制,是一种用于遍历集合(如列表、集合和映射等)的接口

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayListHashSet 等集合。

Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

  • next() - 返回迭代器的下一个元素,并将迭代器的指针移到下一个位置。

  • hasNext() - 用于判断集合中是否还有下一个元素可以访问。

  • remove() - 从集合中删除迭代器最后访问的元素(可选操作)

import java.util.Iterator; // 引入 Iterator 类

通过使用迭代器,我们可以逐个访问集合中的元素,而不需要使用传统的 for 循环或索引。这种方式更加简洁和灵活,并且适用于各种类型的集合。

获取一个迭代器

集合想获取一个迭代器可以使用 iterator() 方法:

Java 迭代器是一种单向遍历机制,即只能从前往后遍历集合中的元素,不能往回遍历

java中length属性是对于数组来说的,当用到数组长度时,则用到length;

java中length()是对于String来说的,如果想看字符串的长度,则用length()方法;

java中size()方法是对于泛型集合来说的,如果想知道泛型有多少元素,就调用此方法来查看

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口

  • E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型

  • objectName: 对象名。

vArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能

因为集合里存放的元素默认都是Object类型的,所以这里需要向下转型

接口就是规定要程序做什么,但不在其中实现

一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类

接口与类的区别:

  • 接口不能用于实例化对象。

  • 接口没有构造方法(构造器)。

  • 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。

  • 接口不能包含成员变量,除了 static 和 final 变量。

  • 接口不是被类继承了,而是要被类实现。

  • 接口支持多继承。

抽象类和接口的区别

  • \1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

  • \2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

  • \3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

  • \4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。

  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。

  • 接口中的方法都是公有的。

interface Animal {

public void eat();

public void travel();

}

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

实现一个接口的语法,可以使用这个公式:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值