Java基础测试题 - 核心类库(一)
1. 数组(ArraysArraysArrays)和列表(ArrayListArrayListArrayList)有什么区别?
数组:(ArrayArrayArray),是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有 100100100 个房间,从 001001001 到 100100100 每个房间都有固定编号,通过编号就可以快速找到租房子的人。
采用该结构的集合,对元素的存取有如下的特点:
查找元素快:通过索引,可以快速访问指定位置的元素;
增删元素慢:指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的 位置。
指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组指定索引位置元素不复制到新数组中。
区别:
ArrayArrayArray 可以包含基本类型和对象类型,ArrayListArrayListArrayList 只能包含对象类型。 ArrayArrayArray 大小是固定的,ArrayListArrayListArrayList 的大小是动态变化的。 ArrayListArrayListArrayList 提供了更多的方法和特性,比如:addAll()addAll()addAll(),removeAll()removeAll()removeAll(),iterator()iterator()iterator() 等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
2. ArrayListArrayListArrayList 和 VectorVectorVector 的区别?
ArrayListArrayListArrayList 集合:java.util.ArrayListjava.util.ArrayListjava.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayListArrayListArrayList 是最常用的集合。ArrayListArrayListArrayList 和 VectorVectorVector 的区别就是 ArrayListArrayListArrayList 是线程不安全的,VectorVectorVector 是线程安全的,VectorVectorVector中的方法都是同步方法 (synchronizedsynchronizedsynchronized),所以 ArrayListArrayListArrayList 的执行效率要高于 VectorVectorVector,它也是用的最广泛的一种集合。
详细解析(主要包括两个方面):
1)同步性:VectorVectorVector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayListArrayListArrayList 是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用 ArrayListArrayListArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用 VectorVectorVector,因为不需要我们自己再去考虑和编写线程安全的代码。
2)数据增长:ArrayListArrayListArrayList 与 VectorVectorVector 都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加 ArrayListArrayListArrayList 与 VectorVectorVector 的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。VectorVectorVector 默认增长为原来两倍,而 ArrayListArrayListArrayList 的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的 1.51.51.5 倍)。ArrayListArrayListArrayList 与 VectorVectorVector 都可以设置初始的空间大小,Vector 还可以设置增长的空间大小,而 ArrayListArrayListArrayList 没有提供设置增长空间的方法。
这两个类虽然都是 ListListList 接口的子类,但是使用起来有如下的区别:
No | 区别点 | ArrayList | Vector |
---|---|---|---|
1 | 时间 | 是新的类,是在 JDK 1.2 之后推出的 | 是旧的类是在 JDK 1.0 的时候就定义的 |
2 | 性能 | 性能较高,是采用了异步处理 | 性能较低,是采用了同步处理 |
3 | 输出 | 支持 Iterator、ListIterator 输出 | 除了支持 Iterator、ListIterator 输出,还支持 Enumeration 输出 |
3. HashMapHashMapHashMap,TreeMapTreeMapTreeMap,HashTableHashTableHashTable 的区别?
一、HashMapHashMapHashMap 和 TreeMapTreeMapTreeMap 区别:
1、HashMapHashMapHashMap 是基于散列表实现的,时间复杂度平均能达到 O(1)O(1)O(1)。 TreeMapTreeMapTreeMap 基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到 O(logn)O(log n)O(logn)。
2、HashMapHashMapHashMap、TreeMapTreeMapTreeMap 都继承 AbstractMapAbstractMapAbstractMap 抽象类;TreeMapTreeMapTreeMap 实现 SortedMapSortedMapSortedMap 接口,所以 TreeMapTreeMapTreeMap 是有序的,HashMapHashMapHashMap 是无序的。
二、HashMapHashMapHashMap 和 HashtableHashtableHashtable 的区别:
HashMapHashMapHashMap 和 HashtableHashtableHashtable 都实现了 MapMapMap 接口,但决定用哪一个之前先要弄清楚它们之间的区别。主要的区别有:线程安全性,同步(synchronizationsynchronizationsynchronization),以及速度。
HashMapHashMapHashMap 几乎可以等价于 HashtableHashtableHashtable,除了 HashMapHashMapHashMap 是非 synchronizedsynchronizedsynchronized 的,并可以接受 nullnullnull (HashMapHashMapHashMap 可以接受为 nullnullnull 的键值(keykeykey)和值(valuevaluevalue),而 HashtableHashtableHashtable 则不行)。HashMapHashMapHashMap 是非 synchronizedsynchronizedsynchronized,而 HashtableHashtableHashtable 是 synchronizedsynchronizedsynchronized,这意味着 HashtableHashtableHashtable 是线程安全的,多个线程可以共享一个 HashtableHashtableHashtable;而如果没有正确的同步的话,多个线程是不能共享 HashMapHashMapHashMap 的。Java5Java 5Java5 提供了 ConcurrentHashMapConcurrentHashMapConcurrentHashMap,它是 HashTableHashTableHashTable 的替代,比 HashTableHashTableHashTable 的扩展性更好。另一个区别是 HashMapHashMapHashMap 的迭代器(IteratorIteratorIterator)是 fail−fastfail-fastfail−fast 迭代器,而 HashtableHashtableHashtable 的 enumeratorenumeratorenumerator 迭代器不是 fail−fastfail-fastfail−fast 的。所以当有其它线程改变了 HashMapHashMapHashMap 的结构(增加或者移除元素),将会抛出 ConcurrentModificationExceptionConcurrentModificationExceptionConcurrentModificationException,但迭代器本身的 remove()remove()remove() 方法移除元素则不会抛出 ConcurrentModificationExceptionConcurrentModificationExceptionConcurrentModificationException 异常。但这并不是一个一定发生的行为,要看 JVMJVMJVM。这条同样也是 EnumerationEnumerationEnumeration 和 IteratorIteratorIterator 的区别。由于 HashtableHashtableHashtable 是线程安全的也是 synchronizedsynchronizedsynchronized,所以在单线程环境下它比 HashMapHashMapHashMap 要慢。如果你不需要同步,只需要单一线程,那么使用 HashMapHashMapHashMap 性能要好过 HashtableHashtableHashtable。HashMapHashMapHashMap 不能保证随着时间的推移 MapMapMap 中的元素次序是不变的。
4. HashMapHashMapHashMap 的工作原理是什么?
HashMapHashMapHashMap 基于 hashinghashinghashing 原理,我们通过 put()put()put() 和 get()get()get() 方法储存和获取对象。当我们将键值对传递给 put()put()put() 方法时,它调用键对象的 hashCode()hashCode()hashCode() 方法来计算 hashcodehashcodehashcode ,然后找到 bucketbucketbucket 位置来储存值对象。当获取对象时,通过键对象的 equals()equals()equals() 方法找到正确的键值对,然后返回值对象。HashMapHashMapHashMap 使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。HashMapHashMapHashMap 在每个链表节点中储存键值对对象。
5. 什么是序列化,如何实现序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化。
什么情况下需要序列化:
- 当你想把你内存中的对象状态保存到一个文件或者数据库中的时候;
- 当你想套接字在网络上传送对象的时候;
- 当你想通过 RMIRMIRMI 传输对象的时候。
如何实现序列化:实现 Serializable 接口即可。
如有哪个知识点需要补充,劳烦各位大佬在评论区留言O(∩_∩)O哈哈~
Java基础测试题 - 核心类库(一)相关推荐
- Java基础测试题 - 核心类库(二)
1. 进程和线程有什么区别? 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间: 线程: 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个 ...
- 那年学过的Java笔记三核心类库一
核心类库一: 抽象类 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰 具体语法格式如下: 访问控制符 abstract 返回值类型 方法名称( ...
- 那年学过的Java笔记三核心类库三
线程 基本概念 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件. 进程 - 主要指运行在内存中的程序. 目前主流的操作系统都支持多进程,是为了让操作系统同时执行多个任务,但进程是重量级的 ...
- 那年学过的Java笔记三核心类库二
集合类 数组和集合的比较 数组的特点: 本质上就是一段连续的存储空间,用于记录多个类型相同的数据. 支持下标访问,可以实现随机访问. 数组一旦定义则长度固定,无法自动调整内存空间的大小. 增删元素不方 ...
- java web基础编程题_云课堂javaweb微专业Java基础测试题3
题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相 ...
- jre包括jvm和java核心类库_JDK、JRE、JVM分别是什么及它们之间的有什么关联
JDK JDK:Java Development Kit 是Java的标准开发工具包(普通用户只需要安装 JRE来运行 Java 程序.而程序开发者必须安装JDK来编译.调试程序).它提供了编译.运行 ...
- java基础试题_java基础测试题_含答案.doc
java基础测试题_含答案 Java基础试题 姓名 一.选择题(每题2分,共30分) 请写出标识符的命名规则描述正确的是[多选]( ABCD ) A.由英文字母.数字._和$组成,长度不限. B.标识 ...
- java基础测试大集合 今天收罗精选一下Java题 适合小白挑战和新手回顾
基础一 1.JRE是什么?作用是什么? JRE是java运行环境.它包含了JVM和一些支撑java运行的核心类库. 2.JDK的是什么?作用是什么? JDK是java开发环境.它包含了运行java所需 ...
- 1.JAVA基础汇总
参考资料:马士兵JAVA基础,高琪JAVA300集 JAVA全面thinkwon面试题:Java基础知识面试题(2020最新版)_ThinkWon的博客-CSDN博客_java基础知识面试题 JAVA ...
最新文章
- 用C写有面向对象特点的程序
- ISAPI在IIS7上的配置
- Docker的原理及特性介绍
- oracle可以面向对象吗,Jbdc助手-数据库操作面向对象的实现(oracle)
- JavaMoney规范(JSR 354)与对应实现解读
- Java 三位正整数的个十百位数字的立方和
- php 服务器方案,分享几种常见WEB服务器配置方案
- SCCM 2016 配置管理系列(Part5)
- matlab程序中,如何解决矢量长度必须相同的问题
- oracle 11gdata guard,Oracle 11g Data Guard配置
- windows 获取系统CPU和进程CPU 内存等信息
- Vivado定制DDR3 IP核注意事项
- 10-1-数据库连接池
- 阿里Java开发手册思考(二)
- hashmap的负载因子为什么是0.75而不是其他值或者1
- 单片机、嵌入式ARM学习网站推荐(多年的积累)
- Oracle PeopleSoft 登录,peoplesoft不能登录DB解决方法
- 3D动作绑定_3D动漫制作软件,你知道几个?
- Let's Use Chinaese in Flex Successfully
- Python脚本25:将两张图片拼在一起