Java基础测试题 - 核心类库(一)

1. 数组( A r r a y s Arrays Arrays)和列表( A r r a y L i s t ArrayList ArrayList)有什么区别?

数组:( A r r a y Array Array),是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有 100 100 100 个房间,从 001 001 001 100 100 100 每个房间都有固定编号,通过编号就可以快速找到租房子的人。

采用该结构的集合,对元素的存取有如下的特点:

  1. 查找元素快:通过索引,可以快速访问指定位置的元素;

  2. 增删元素慢:指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的 位置。

  3. 指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组指定索引位置元素不复制到新数组中。

区别:

A r r a y Array Array 可以包含基本类型和对象类型, A r r a y L i s t ArrayList ArrayList 只能包含对象类型。 A r r a y Array Array 大小是固定的, A r r a y L i s t ArrayList ArrayList 的大小是动态变化的。 A r r a y L i s t ArrayList ArrayList 提供了更多的方法和特性,比如: a d d A l l ( ) addAll() addAll() r e m o v e A l l ( ) removeAll() removeAll() i t e r a t o r ( ) iterator() iterator() 等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。


2. A r r a y L i s t ArrayList ArrayList V e c t o r Vector Vector 的区别?

A r r a y L i s t ArrayList ArrayList 集合: j a v a . u t i l . A r r a y L i s t java.util.ArrayList java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 A r r a y L i s t ArrayList ArrayList 是最常用的集合。 A r r a y L i s t ArrayList ArrayList V e c t o r Vector Vector 的区别就是 A r r a y L i s t ArrayList ArrayList 是线程不安全的, V e c t o r Vector Vector 是线程安全的, V e c t o r Vector Vector中的方法都是同步方法 ( s y n c h r o n i z e d synchronized synchronized),所以 A r r a y L i s t ArrayList ArrayList 的执行效率要高于 V e c t o r Vector Vector,它也是用的最广泛的一种集合。

详细解析(主要包括两个方面):

1)同步性: V e c t o r Vector Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 A r r a y L i s t ArrayList ArrayList 是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用 A r r a y L i s t ArrayList ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用 V e c t o r Vector Vector,因为不需要我们自己再去考虑和编写线程安全的代码。

2)数据增长: A r r a y L i s t ArrayList ArrayList V e c t o r Vector Vector 都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加 A r r a y L i s t ArrayList ArrayList V e c t o r Vector Vector 的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。 V e c t o r Vector Vector 默认增长为原来两倍,而 A r r a y L i s t ArrayList ArrayList 的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的 1.5 1.5 1.5 倍)。 A r r a y L i s t ArrayList ArrayList V e c t o r Vector Vector 都可以设置初始的空间大小,Vector 还可以设置增长的空间大小,而 A r r a y L i s t ArrayList ArrayList 没有提供设置增长空间的方法。

这两个类虽然都是 L i s t List List 接口的子类,但是使用起来有如下的区别:

No区别点ArrayListVector
1时间是新的类,是在 JDK 1.2 之后推出的是旧的类是在 JDK 1.0 的时候就定义的
2性能性能较高,是采用了异步处理性能较低,是采用了同步处理
3输出支持 Iterator、ListIterator 输出除了支持 Iterator、ListIterator 输出,还支持 Enumeration 输出

3. H a s h M a p HashMap HashMap, T r e e M a p TreeMap TreeMap, H a s h T a b l e HashTable HashTable 的区别?

一、 H a s h M a p HashMap HashMap T r e e M a p TreeMap TreeMap 区别:

1、 H a s h M a p HashMap HashMap 是基于散列表实现的,时间复杂度平均能达到 O ( 1 ) O(1) O(1) T r e e M a p TreeMap TreeMap 基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到 O ( l o g n ) O(log n) O(logn)
2、 H a s h M a p HashMap HashMap T r e e M a p TreeMap TreeMap 都继承 A b s t r a c t M a p AbstractMap AbstractMap 抽象类; T r e e M a p TreeMap TreeMap 实现 S o r t e d M a p SortedMap SortedMap 接口,所以 T r e e M a p TreeMap TreeMap 是有序的, H a s h M a p HashMap HashMap 是无序的。

二、 H a s h M a p HashMap HashMap H a s h t a b l e Hashtable Hashtable 的区别:

H a s h M a p HashMap HashMap H a s h t a b l e Hashtable Hashtable 都实现了 M a p Map Map 接口,但决定用哪一个之前先要弄清楚它们之间的区别。主要的区别有:线程安全性,同步( s y n c h r o n i z a t i o n synchronization synchronization),以及速度。
H a s h M a p HashMap HashMap 几乎可以等价于 H a s h t a b l e Hashtable Hashtable,除了 H a s h M a p HashMap HashMap 是非 s y n c h r o n i z e d synchronized synchronized 的,并可以接受 n u l l null null ( H a s h M a p HashMap HashMap 可以接受为 n u l l null null 的键值( k e y key key)和值( v a l u e value value),而 H a s h t a b l e Hashtable Hashtable 则不行)。 H a s h M a p HashMap HashMap 是非 s y n c h r o n i z e d synchronized synchronized,而 H a s h t a b l e Hashtable Hashtable s y n c h r o n i z e d synchronized synchronized,这意味着 H a s h t a b l e Hashtable Hashtable 是线程安全的,多个线程可以共享一个 H a s h t a b l e Hashtable Hashtable;而如果没有正确的同步的话,多个线程是不能共享 H a s h M a p HashMap HashMap 的。 J a v a 5 Java 5 Java5 提供了 C o n c u r r e n t H a s h M a p ConcurrentHashMap ConcurrentHashMap,它是 H a s h T a b l e HashTable HashTable 的替代,比 H a s h T a b l e HashTable HashTable 的扩展性更好。另一个区别是 H a s h M a p HashMap HashMap 的迭代器( I t e r a t o r Iterator Iterator)是 f a i l − f a s t fail-fast failfast 迭代器,而 H a s h t a b l e Hashtable Hashtable e n u m e r a t o r enumerator enumerator 迭代器不是 f a i l − f a s t fail-fast failfast 的。所以当有其它线程改变了 H a s h M a p HashMap HashMap 的结构(增加或者移除元素),将会抛出 C o n c u r r e n t M o d i f i c a t i o n E x c e p t i o n ConcurrentModificationException ConcurrentModificationException,但迭代器本身的 r e m o v e ( ) remove() remove() 方法移除元素则不会抛出 C o n c u r r e n t M o d i f i c a t i o n E x c e p t i o n ConcurrentModificationException ConcurrentModificationException 异常。但这并不是一个一定发生的行为,要看 J V M JVM JVM。这条同样也是 E n u m e r a t i o n Enumeration Enumeration I t e r a t o r Iterator Iterator 的区别。由于 H a s h t a b l e Hashtable Hashtable 是线程安全的也是 s y n c h r o n i z e d synchronized synchronized,所以在单线程环境下它比 H a s h M a p HashMap HashMap 要慢。如果你不需要同步,只需要单一线程,那么使用 H a s h M a p HashMap HashMap 性能要好过 H a s h t a b l e Hashtable Hashtable H a s h M a p HashMap HashMap 不能保证随着时间的推移 M a p Map Map 中的元素次序是不变的。


4. H a s h M a p HashMap HashMap 的工作原理是什么?


H a s h M a p HashMap HashMap 基于 h a s h i n g hashing hashing 原理,我们通过 p u t ( ) put() put() g e t ( ) get() get() 方法储存和获取对象。当我们将键值对传递给 p u t ( ) put() put() 方法时,它调用键对象的 h a s h C o d e ( ) hashCode() hashCode() 方法来计算 h a s h c o d e hashcode hashcode ,然后找到 b u c k e t bucket bucket 位置来储存值对象。当获取对象时,通过键对象的 e q u a l s ( ) equals() equals() 方法找到正确的键值对,然后返回值对象。 H a s h M a p HashMap HashMap 使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 H a s h M a p HashMap HashMap 在每个链表节点中储存键值对对象。

5. 什么是序列化,如何实现序列化?

序列化:把对象转换为字节序列的过程称为对象的序列化。

什么情况下需要序列化:

  1. 当你想把你内存中的对象状态保存到一个文件或者数据库中的时候;
  2. 当你想套接字在网络上传送对象的时候;
  3. 当你想通过 R M I RMI RMI 传输对象的时候。

如何实现序列化:实现 Serializable 接口即可。


如有哪个知识点需要补充,劳烦各位大佬在评论区留言O(∩_∩)O哈哈~

在这里插入图片描述

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值