JavaRush /Java 博客 /Random-ZH /喝咖啡休息#176。Array 和 ArrayList 之间的异同。如何编写有效的 equals() 方法

喝咖啡休息#176。Array 和 ArrayList 之间的异同。如何编写有效的 equals() 方法

已在 Random-ZH 群组中发布

Array 和 ArrayList 的异同

来源: Medium 本文重点了解 Array 和 ArrayList 的概念以及它们之间的区别。 喝咖啡休息#176。 Array 和 ArrayList 之间的异同。 如何编写高效的 equals() 方法 - 1

Java数组

数组是一种数据结构,允许您存储相同类型的值的有序序列。例如,您可以创建字符、数字等的数组。这适用于所有原始类型,甚至像String这样的对象。数组一旦创建,我们就无法更改其大小。下面是声明数组引用变量并分配数组的一般示例:
dataType[] arrayName = new dataType[numElements];
如果我们尝试添加超过数组大小的内容,我们会得到ArrayIndexOutOfBoundsException

数组声明

要声明数组,请在数据类型后使用[ ]字符。它们表明该变量是对数组的引用。数组引用变量可以引用各种大小的数组。new关键字在内存中创建空间来存储具有指定数量元素的数组。分配一个数组引用变量来引用这个新分配的数组。以下示例声明一个数组引用变量gameScores,分配一个包含四个整数的数组,并分配gameScores来引用分配的数组。
int[] gameScores = new int[4];
当使用new关键字初始化数组引用时,数组元素会自动初始化为默认值。整数和浮点数据类型元素的默认值为零,布尔元素的默认值为false。您还可以声明一个数组引用变量而不立即分配该数组,然后用分配的数组分配该变量。
int[] gameScores;

gameScores = new int[4];

使用非默认值初始化数组

您可以通过在用逗号分隔的大括号{}中指定初始值来用非默认值初始化数组元素。
int [] myArray = { 5 , 7 , 11 };
上面的示例创建了一个由三个整数元素组成的数组,其值为 5、7 和 11。此数组初始化不需要使用new 关键字,因为数组大小会自动设置为大括号中的元素数量。对于大型数组,可以通过首先定义数组,然后使用循环分配数组元素来完成初始化。可以使用从零开始的索引来访问数组元素。
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

数组列表

ArrayList是可调整大小的引用类型的元素的有序列表。它也是属于 Java Collection Framework 的java.util包中的一个类。ArrayList为我们提供了动态数组并自动处理调整它们的大小。当您向 ArrayList 添加元素时,内存大小会自动增加。您可以使用import java.util.ArrayList;来使用ArrayList 。我们还可以使用以下语句 创建一个ArrayList实例:
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList 的 大小可以增长以容纳它所需的元素。ArrayList不支持原始类型(例如int ),而是支持引用类型(例如Integer )。初学者中的一个常见错误是声明基本类型(例如int )的ArrayList,如ArrayList<int> myVals。这会导致编译错误:“意外类型,找到:int,必需:引用”。示例:让我们创建一个名为cars的ArrayList对象,它将存储字符串:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
要将元素添加到ArrayList ,请使用add()方法。要访问ArrayList的元素,请使用get()方法。
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
Java 中内置数组和ArrayList之间的区别在于,在第一种情况下,数组的大小无法更改(如果要向数组添加或从数组中删除元素,则需要创建一个新数组) )。而在ArrayList中,可以随时添加和删除元素。

Array 和 ArrayList 之间的相似之处

  • ArrayArrayList用于存储元素。
  • ArrayArrayList可以存储空值。
  • 这两个过程都在恒定时间内发生。
  • 它们可能有重复的值。
  • ArrayArrayList不保证有序元素的存在。

Array 和 ArrayList 之间的主要区别

数组 ( Array ) 和ArrayList之间的主要区别在于数组的静态性质和ArrayList 的动态性质。一旦创建,您就无法更改数组的大小,而ArrayList可以根据需要更改其大小。另一个重要的区别是数组是 Java 提供的基本功能。另一方面,ArrayList是Java中集合框架的一部分。我们可以使用方括号访问数组的元素,在方括号中我们可以指定索引。虽然有一组方法可以访问ArrayList 的元素并更改它们。尽管两者有所不同,但在其他方面仍然具有可比性。Java 中的这两种数据结构都基于索引并允许您存储对象。此外,它们允许空值和重复项。如果您事先知道对象的大小,那么最好使用数组。但如果你不确定大小,那么你应该使用ArrayList

如何编写有效的 equals() 方法

来源:Medium 这篇文章将帮助您更好地理解使用 Java 代码时equals()方法的使用。 如果我们谈论默认的equals()方法并且没有任何实现,那么它在很多方面类似于==操作。也就是说,该方法比较对象。例如,equals()比较两个字符串,如果字符串相等则返回true,否则返回false 。请注意,不建议使用==运算符来比较 Java 中的对象。原因是在比较对象时,只有当引用指向同一个对象时,==才会返回true 。避免问题的最简单方法是不重写equals方法,在这种情况下,类的每个实例仅等于其自身。只有当类具有与对象的简单标识不同的逻辑相等概念,并且超类尚未重写相等性时,才需要重写equals。因此,在使用equals()方法时,需要判断对象引用在逻辑上是否等价,是否引用同一个对象。

equals 方法的属性

每个equals方法都实现一个等价关系。它具有以下属性:
  • 自反:对于任何非空引用值x, x.equals (x)必须返回true

  • 对称:对于任何非空引用值xy仅当y.equals(x)返回true时, x.equals(y)才必须返回true

  • 传递性:对于任何非空引用值x y z,如果x.equals(y)返回truey.equals(z)返回true,则x.equals(z)也必须返回true

  • 一致:对于任何非空引用值xy,多次调用x.equals(y)必须一致返回true或一致返回false

  • 非空:对于任何非空引用值x, x.equals (null)必须返回false

让我们仔细看看每个属性:

自反性:

一个对象必须等于它自己。要验证这一点,请将类的实例添加到集合中。contains方法很可能表明该集合不包含您刚刚添加的实例。

对称:

两个对象(它们可以来自不同的类)必须彼此相等。

后续:

不要编写依赖于不可靠/易失资源的 equals方法。

非零:

如果传递给equals 的对象为null ,则始终返回true

我们总结一下:

这是质量等于方法的秘诀:
  1. 使用==运算符来测试参数是否是对此对象的引用。

  2. 使用instanceof运算符检查参数的类型是否正确。

  3. 将参数转换为正确的类型。

  4. 对于类中的每个“重要”字段,检查该参数字段是否与该对象的相应字段匹配:

    • 对于原始字段:其类型不是floatdouble,请使用==运算符进行比较。
    • 对于对象引用字段:递归调用equals方法;对于浮点字段,使用静态方法Float.compare(float, float); 对于双字段,请使用Double.compare(double, double)
    • 对于数组字段:将这些准则应用于每个元素。如果数组字段中的每个元素都很重要,请使用Arrays.equals()方法之一。
    • 某些对象引用字段可能包含空值。为了避免抛出NullPointerException,请使用静态方法Objects.equals(Object, Object)检查这些字段是否相等。
  5. 当你写完equals方法后,问自己三个问题:它是对称的吗?它是传递性的吗?他是否始终如一?

请记住,在覆盖equals时始终覆盖hashCode
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION