java面试笔记

一.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();
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值