一.java基础
1.1
hashCode 是Java中Object类的一个方法,它返回对象的哈希码值。在Java中,哈希码用于支持哈希表数据结构,如HashMap、HashSet等。下面是hashCode的主要作用:
(1).在哈希表中查找对象: 哈希表是一种常用的数据结构,它使用哈希码来快速查找对象。hashCode方法的返回值可以被用作哈希表中的索引,帮助快速定位对象的存储位置。这样可以在常数时间内执行查找操作。
(2).在集合中确保对象的唯一性: 当你将对象添加到HashSet等集合中时,集合会使用hashCode来检查是否已经存在相同的对象。如果两个对象的哈希码相等,集合会进一步使用equals方法来比较对象的内容,以确保对象的唯一性。
(3).优化搜索性能: 在一些搜索算法中,哈希码可以用于快速排除不可能匹配的对象,从而提高搜索性能。这在大规模数据集的情况下特别有用。
(4).分布式系统中的一致性: 在分布式系统中,哈希码有时用于确定数据在不同节点之间的分布,以实现负载均衡和一致性哈希等策略。
需要注意的是,虽然hashCode方法在很多情况下是有用的,但是它并不是唯一确定对象相等性的标准。实际上,不同的对象可以有相同的哈希码(哈希冲突)。因此,在比较对象相等性时,还需要使用equals方法进行验证。在Java中,如果两个对象的hashCode相等,它们并不一定相等;而如果两个对象相等,它们的hashCode必须相等。
1.2ArrayList和linkedList的区别
ArrayList和LinkedList都是Java中常见的集合类,它们都实现了List接口,但它们在内部实现和性能方面有一些显著的区别。
底层数据结构:
ArrayList: 使用动态数组实现。它提供了随机访问元素的能力,因为它通过索引直接访问元素。
LinkedList: 使用双向链表实现。在链表中,每个元素都包含一个指向前一个和后一个元素的引用,这使得在列表中间插入和删除元素更为高效。
随机访问性能:
ArrayList: 由于底层是数组,因此可以通过索引直接访问元素,因此随机访问的性能较好。
LinkedList: 在链表中进行随机访问需要从头部或尾部开始遍历,因此随机访问的性能较差。时间复杂度为O(n),n是元素的索引位置。
插入和删除操作:
ArrayList: 在中间插入或删除元素时,需要移动元素来保持数组的顺序,因此这些操作可能较慢。在尾部进行添加或删除元素时效率较高。
LinkedList: 由于是双向链表,插入和删除元素的效率较高,特别是在链表中间进行这些操作。
空间占用:
ArrayList: 由于底层是数组,它通常比LinkedList占用更少的内存空间。
LinkedList: 每个元素都需要额外的空间来存储前后元素的引用,因此通常占用的内存空间较大。
迭代性能:
ArrayList: 由于可以直接访问元素,因此在迭代时效率较高。
LinkedList: 在迭代时需要通过引用一个个地遍历链表,因此相对较慢。
使用 ArrayList 当你需要快速随机访问元素,而且对于添加和删除操作不太敏感。使用 LinkedList 当你需要频繁执行插入和删除操作,而对于随机访问不太敏感。、
1.3.序列化与反序列化
(1)序列化(Serialization):
序列化是将对象转换为字节流的过程。在Java中,可以通过实现 Serializable
接口来指示对象是可序列化的。实现该接口的对象可以被写入到输出流(如文件、网络流等),并在需要时通过反序列化重新构建对象。
(2)反序列化(Deserialization):反序列化是将字节流重新转换为对象的过程。同样,对象的类必须实现 Serializable
接口,以确保对象可以被正确地反序列化。
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serialized_object.dat"))) {
// 反序列化对象
MyClass myObject = (MyClass) ois.readObject();
System.out.println("Object deserialized successfully.");
// 使用反序列化得到的对象
System.out.println("intValue: " + myObject.getIntValue());
System.out.println("stringValue: " + myObject.getStringValue());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}