java面试题:集合

1.如何理解java中的序列化

在Java中,

序列化是指将对象转换为字节流的过程,可以将这些字节流保存在文件中、在网络上发送或者在内存中传输。

序列化的主要目的

是实现对象的持久化(保存到磁盘或者数据库中)、对象的传输(通过网络传输对象)、对象的克隆等。

Java中的序列化可以通过实现Serializable接口来完成,该接口是一个标记接口,没有任何方法需要实现。如果一个类实现了Serializable接口,就表示该类的对象可以被序列化。

当一个对象需要被序列化时,**会将对象的状态以及相关的类信息转换为字节流。**这些字节流可以通过流的方式写入文件或者通过网络进行传输。反序列化则是将字节流重新转换为对象。

在序列化的过程中,如果对象的某些属性不希望被序列化,可以使用transient关键字修饰这些属性,这样在序列化时会忽略这些属性。

需要注意的是,序列化和反序列化的过程是Java对象和字节流之间的转换,所以只有Java环境下才能进行序列化和反序列化操作。

总之,通过序列化,可以将对象转换为字节流,实现对象的持久化、传输和克隆等功能

3.java中HashMap的工作原理是什么

HashMap是Java中常用的数据结构,它是基于哈希表实现的。

在HashMap中,数据是以键值对(Key-Value)的形式存储的。每个键对应一个唯一的值,通过键可以快速地获取对应的值,从而实现高效的查找操作。

HashMap内部通过一个数组来存储数据,这个数组被称为哈希表。当我们要将键值对存储到HashMap中时,首先会根据键的hashCode值计算出数组下标,然后将键值对存储到该下标对应的位置。

具体的步骤如下:

  1. 当向HashMap中添加一个键值对时,首先会调用键的hashCode()方法来计算哈希码。哈希码是一个整数,用于确定键值对在数组中的位置。
  2. 然后,根据哈希码使用哈希函数(通常是取模运算)计算出数组下标。不同的哈希函数可能会得到相同的下标,这种情况称为哈希冲突。
  3. 如果发生哈希冲突,HashMap会使用链表或红黑树来解决冲突。在Java 8之前,HashMap使用的是链表解决冲突,当链表长度超过一定阈值(默认为8)时,会将链表转换为红黑树,以提高查找效率。而在Java
    8及之后的版本中,如果链表长度小于等于6,会将红黑树转换回链表,以节省空间。
  4. 当需要获取某个键对应的值时,HashMap会先通过键的hashCode()方法计算哈希码,然后根据哈希码找到数组中的位置。如果该位置上有链表或红黑树,会通过键的equals()方法遍历链表或红黑树,直到找到对应的值。

总结起来,HashMap的工作原理可以简单归纳为:通过哈希码和哈希函数将键值对映射到数组中的位置,并使用链表或红黑树解决哈希冲突,以实现快速的查找操作。

7.hashset 和 treeset有什么去别并举例说明

HashSet和TreeSet都是Java中常用的Set集合实现类,它们之间的主要区别在于底层数据结构和元素排序方式。

  1. HashSet:
  • 底层数据结构:HashSet使用哈希表作为底层数据结构。
  • 元素唯一性:HashSet保证集合中的元素是唯一的,不允许重复。
  • 元素顺序:HashSet中的元素是无序的,添加和获取元素的顺序可能不同。元素重复就不会被添加
  • 例子:
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("apple"); // **重复元素,不会被添加进集合**
System.out.println(set); // 输出结果可能为 [banana, apple, orange]
  1. TreeSet:

底层数据结构:TreeSet使用红黑树作为底层数据结构。

  • 元素唯一性:TreeSet保证集合中的元素是唯一的,不允许重复。
  • 元素顺序:TreeSet中的元素是有序的,默认按照元素的自然顺序进行排序。也可以通过实现Comparable接口或传入比较器(Comparator)来指定自定义的排序方式。
  • 例子:
TreeSet<Integer> set = new TreeSet<>();
set.add(3);
set.add(1);
set.add(2);
set.add(1); // 重复元素,不会被添加进集合
System.out.println(set); // 输出结果为 [1, 2, 3]

需要注意的是,当使用自定义的对象作为元素时,需要根据对象的hashCode()和equals()方法来确保元素的唯一性,以及根据compareTo()方法或比较器来实现元素的排序。

9.请举例说明collection 和conllections的区别?

Collection和Collections是Java中两个不同的概念。

  1. Collection:
  • Collection是Java中的一个接口,它是Java中所有集合类的父接口。它定义了一系列操作集合的方法,如添加、删除、遍历等。
  • Collection接口的常见实现类有List、Set和Queue。
  • 例子:
Collection<String> collection = new ArrayList<>();
collection.add("apple");
collection.add("banana");
collection.add("orange");
System.out.println(collection); // 输出结果为 [apple, banana, orange]
  1. Collections:
  • Collections是Java中的一个工具类,提供了一系列操作集合的静态方法。它包含的方法可以用于对集合进行排序、搜索、反转等操作。
  • Collections类中的方法都是静态方法,可以直接通过类名调用。
  • 例子:
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
Collections.sort(list); // 对集合进行排序
System.out.println(list); // 输出结果为 [1, 2, 3]

总结:

  • Collection是一个接口,定义了集合类的基本操作。
  • Collections是一个工具类,提供了一系列操作集合的静态方法。
  • Collection用于操作集合类的对象,而Collections用于操作集合类的工具方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值