大数据开发(Java面试真题-卷二)

大数据开发(Java面试真题)

  • 1、请简要说明Java中equeals()和hashCode()的作用及区别?
  • 2、Java中的四种访问修饰符及它们之间的区别?
  • 3、请解释Java中的异常处理机制,包括checked exception和unchecked exception?
  • 4、Java线程池的核心参数有哪些?
  • 5、Java中深拷贝和浅拷贝的区别是什么?
  • 6、Java中ArrayList和LinkedList区别是什么?
  • 7、Java中ArrayList扩容过程是什么?
  • 8、Java中HashMap底层实现是什么?
  • 9、Java中ConcurrentHashMap支持多并发的原理是什么?
  • 10、JVM中一个类加载的过程是什么样子?

1、请简要说明Java中equeals()和hashCode()的作用及区别?

equals()方法判断两个对象是否相同,在Object类中默认比较两个对象是否为同一引用。而hashCode()方法返回对象对应的哈希码值,主要被哈希表使用。

作用
-equals():主要用户判断两个对象内容是否相同(而不是引用地址),可以根据业务需求进行重写。
-hashCode():主要用于提高对对象的查找和存储效率,将对象映射为哈希表中的索引

区别

  1. equals()和hashCode()是不同目的所使用的方法,equals()用于判断对象内容相等性,hashCode()主要用于哈希表存储
  2. 如果两个对象调用equals()方法返回true,则它们的hashCode值应该一样,但反之则不成立

2、Java中的四种访问修饰符及它们之间的区别?

Java中有四种访问修饰符:public、protected、private和default(即没有明确的修饰符)。它们用于限定类、方法和变量对其它类或子类的可见性。

-public:可以被所有类访问。被public修饰的类、方法和变量都可以在任何地方访问。
-protected只能在声明所在类或者子类中使用。被protected修饰的方法和成员变量对于同一包内其它类也是可见的
-private:仅可以在声明所在类内部使用。私有对象无法从该类外部直接访问。
-default:没有明确指定访问级别,也称为包级私有访问权限。默认情况下,只允许同一个包内的其它类进行访问

3、请解释Java中的异常处理机制,包括checked exception和unchecked exception?

Java的异常处理机制适用于处理程序运行时可能出现的错误和异常情况。Java中的异常可分为两种类型:checked exception(被检查的异常)和unchecked exception(未被检查的异常)
-Checked Exception:这些在编译时由编译器强制要求进行捕获或声明抛出。例如,‘IOException’、'SQLException’等。如果不对这些异常进行try-catch捕获或throws声明抛出,代码将无法通过编译。
-Unchecked Exception:这些是在运行时发生且不需要显式捕获或声明抛出。常见的Unchecked Exceptions包括"NullPointerException",'ArrauIndexOutOfBoundsException’等。
对于Checked Exceptions,开发者必须根据具体情况选择合适的方式来处理它们,比如使用try-catch快来捕获并处理该类异常;而对于Unchecked Exceptions通常可以通过良好的编程实践避免其发生,或者选择适当层次向上抛出以由调用方去负责处理

4、Java线程池的核心参数有哪些?

corePoolSize:线程池的基本大小,即在没有任务执行时线程池的大小,并且只有在工作队列满了的情况下,才会创建超出这个数量的线程。
maximunPoolSize线程池最大线程数。这是线程池可以容纳的最大线程数,超出这个数的线程会被拒绝。
workQueue当线程池中的线程都被使用时,新任务会被放在这个队列中等待被执行。这个参数通常是一个实现了BlockingQueue、LinkedBlockingQueue或SynchronousQueue。
threadFactory:用于创建新线程的工厂。使用这个工厂可以自定义如何创建线程,例如设置线程的名称、优先级等。
handler当线程池和工作队列都满了,用于处理被拒绝的任务。常见的实现有AbortPolicy(直接抛出异常)、CallerRunsPolicy(用调用者的线程执行任务)、DiscardPolicy(静默丢弃任务)和DiscardOldestPolicy(丢弃队列中最旧的任务)。
keepAliveTime当线程池中的线程数量超过corePoolSize时,这是多余的空闲线程在被终止前等待新任务的最长的时间
timeUnitkeepAliveTime参数的时间单位,如TimeUnit.SECONDS、TimeUnit.MILLISECONDS等。
这些参数共同决定了线程池的创建、运行和任务处理策略。

5、Java中深拷贝和浅拷贝的区别是什么?

在Java中,深拷贝和浅拷贝是对于对象复制的两种不同方式。

浅拷贝:是创建一个新对象,该对象的实例变量与原对象相同,如果有引用类型的成员变量,浅拷贝仅仅复制了引用而不是创建新的对象。这意味着原对象和浅拷贝对象会共享相同的引用类型成员变量,对其中一个对象的修改会影响到另一个对象

深拷贝:是创建一个新对象,该对象的所有实例变量都会被复制,并且会为引用类型的成员变量创建新的对象。这意味着原对象和深拷贝对象是完全独立的,对其中一个对象的修改不会影响到另一个对象
在Java中,可以通过实现Cloneable接口和重写clone()方法来实现浅拷贝。对于深拷贝,可以通过实现Serializable接口并使用对象序列化和反序列化来实现,或者通过手动复制所有引用类型成员变量的值来实现
需要注意的是,如果引用类型成员变量也实现了Cloneable接口并进行了深拷贝,那么在进行深拷贝时需要在clone()方法中递归调用成员变量clone()方法,确保所有层级的引用类型对象都被正确复制。

6、Java中ArrayList和LinkedList区别是什么?

ArrayList和LInkedList是Java中两种不同的集合类,它们的区别主要体现在以下几个方面:

  1. 数据结构ArrayList是基于动态数组实现的,通过数组实现元素的存储和访问;而LinkedList则是基于双向链表实现的,通过链表节点实现元素的存储和访问。
  2. 插入和删除操作ArrayList在尾部进行插入和删除操作比较高效,因为它使用数组实现,可以直接在尾部进行元素的增删;而在中间或头部进行插入和删除操作时,由于需要移动元素,效率较低。而LinkedList在任意位置进行插入和删除操作效率较高,因为它只需要更改节点的指针即可。
  3. 随机访问ArrayList支持通过下标进行随机访问,可以通过索引快速定位元素;而LinkedLisk不支持直接通过下标访问,需要从头节点或尾节点开始遍历链表,直到找到对应位置的元素。
  4. 内存访问ArrayList在存储元素时需要预留一定的空间,当元素数超过预留空间时,需要进行动态扩容;而LinkedList则不需要进行扩容操作,但是每个节点需要存储额外的指针信息,相对于ArrayList来说占用的内存较多。

综上所述,如果需要频繁进行插入和删除操作,并且不需要频繁随机访问元素,可以选择使用LinkedList;如果需要频繁随机访问元素,可以选择使用ArrayList

7、Java中ArrayList扩容过程是什么?

  1. 在创建ArrayList对象时,默认会创建一个初始容量为10的数组
  2. 当添加新元素时,如果当前数组已满(即元素个数等于数组容量),则会触发扩容操作
  3. 扩容操作会创建一个新的数组,新数组的容量是原数组容量的1.5倍(JDK1.4之前为原容量的2倍)
  4. 将原数组中的元素逐个复制到新数组中。
  5. 更新ArrayList内部的引用指向新数组
  6. 新元素添加到新数组中

8、Java中HashMap底层实现是什么?

Java中HashMap底层实现是通过哈希表(HashTable)和链表(LinkedList)结合的方式来实现的。具体来说,HashMap内部维护了一个数组,数组的每个元素是一个链表的头节点。当我们往HashMap中插入键值对时,首先会根据键的哈希值计算出在数组中的位置,然后将该键值对插入到对应链表的末尾。如果发生哈希冲突,即多个键的哈希值相同时,会将新的键值对插入到链表的头部。当链表的长度超过一定阈值(默认为8),链表就会转化为红黑树,以提高查询效率。在进行查询操作时,根据键的哈希值找到对应链表或红黑树,然后再遍历链表或搜索红黑树,找到对应值。这种底层实现方式使得HashMap再插入、删除和查找操作上都具有较高的效率。

9、Java中ConcurrentHashMap支持多并发的原理是什么?

ConcurrentHashMap是Java中线程安全的哈希表实现,它支持多并发操作的原理主要有以下几点:

  1. 分段锁:ConcurrentHashMap内部将数据分成多个段,每个段都可以独立地进行加锁和解锁操作。这样不同的线程可以同时访问不同的段,从而提高并发能力。
  2. 锁分离:与传统的同步容器不同,ConcurrentHashMap的读操作并不需要加锁,多个线程可以同时进行读操作,只要写操作需要加锁。这样可以避免不必要的阻塞,提高了并发读的效率。
  3. CAS(比较并交换)操作:ConcurrentHashMap使用了CAS操作来保证线程安全。在并发写操作时,通过CAS操作来实现无锁的数据更新
  4. 红黑树:ConcurrentHashMap中的每个段内部使用了红黑树来存储数据,当链表长度超过阈值时,会将链表转化为红黑树,这样可以保证在最坏的情况下仍然有较高的性能。

10、JVM中一个类加载的过程是什么样子?

  1. 加载:类加载的第一步是加载,即通过类的全限定名找到对应的二进制字节码文件。这个过程可以通过类加载器完成,类加载器会根据类的名称定位到类文件,并将其读取到内存中
  2. 验证:在加载完成后,JVM会对加载的类进行验证,确保类文件的字节码符合JVM规范,不会危害JVM的安全。验证的过程包括文件格式验证、元数据验证、字节码验证以及符号引用验证。
  3. 准备:在验证通过后,JVM会为类的静态成员遍历分配内存空间,并设置默认初始值。这个过程并不会为实例变量分配空间,只是为静态变量分配。
  4. 解析:解析阶段是将符号引用替换为直接引用的过程。符号引用是一种编译时的引用,直接引用是在运行时可直接指向内存地址的引用。解析过程包括将常量池中的符号引用替换为直接引用、将类、方法、字段等符号解析为具体的内存地址
  5. 初始化:在准备阶段完成后,JVM会开始执行类的初始化过程。类初始化时会执行类的静态代码块和静态变量的赋值操作。这个过程是类加载的最后一个阶段。
  6. 使用:类加载完成后,就可以使用该类创建对象、调用方法等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 学习笔记(10)

十、 进程管理 进程就是运行中的程序,一个运行着的程序,可能有多个进程。 比如 LinuxSir.Org 所用的 WWW 服务器是 apache 服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户来同时请 求 htt…

QT debug编译失败:xxx/bin/ld.exe: cannot find -lxxd1

原因:由于编译时,使用debug模式下,动态库没有对应的lxxd1中的xx库 解决方案1:改为release编译; 解决方案2:在引用的三方pri文件中,去掉多余的d #修改前 if(!debug_and_release|build_pass):CON…

沃德的背包

题目描述 沃德进入源码世界的路上有很多宝石,可是沃德的背包只能背总重量不超过m的宝石,路上一共有n个宝石,每个宝石的重量为wi,请你帮沃德选择尽量多的宝石装进背包,请注意宝石的总重量不超过m。 输入描述 第一行输…

Django官网项目 二

官网地址:Writing your first Django app, part 2 | Django documentation | Django 创建模组: 注册model (bug:没有加后面的逗号) 在manage.py 的目录下: python manage.py makemigrations polls pyth…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这个N个节点中,每个节点存储总数据的1/N。 如下图&#xff1…

C++ 根据公式计算椭圆任意点到中心的距离

#include <iostream> using namespace std;double fact(int x) //定义阶乘函数。注意是double类型 {double y x; //注意是double类型for (int i x-1; i > 0; i--)y * i;return y; };double My_sin(int x) //定义sin函数。注意是double类型 {double y 0; //注意是do…

【视频图像取证篇】Amped FIVE专业法医图像和视频增强软件之模糊图像去隔行功能

【视频图像取证篇】Amped FIVE专业法医图像和视频增强软件之模糊图像去隔行功能 法医图像和视频增强软件&#xff0c;专业又强大&#xff01;&#xff01;&#xff01;超过 140 种过滤器和工具&#xff0c;用于分析、恢复和增强数字图像和视频。Amped FIVE能够稳定抖动的视频&…

Linux:ansible-playbook配置文件(剧本)(进阶)

Linux&#xff1a;ansible-playbook配置文件&#xff08;剧本&#xff09;_ansible-playbook -i参数-CSDN博客https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522s…

LaTeX排版论文的常见问题汇总(持续更新中)

文章目录 LaTeX排版论文的常见问题汇总&#xff08;持续更新中&#xff09;1.如何上传期刊或会议提供的LaTeX模板&#xff1f;2.模板中各文件的说明3.LaTeX中如何设置字体大小&#xff1f;3.1如何设置表格中的字体大小&#xff1f;3.2如何设置表格、图片标题的字体大小&#xf…

A/D转换

硬件电路模型 模数转换代码 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" #include "XPT2046.h"unsigned int ADValue; int main(){LCD_Init();LCD_ShowString(1,1,"ADJ NTC RG");while(1){ADValue …

什么是Vue的服务端渲染(SSR)?它有什么作用?

Vue的服务端渲染&#xff08;SSR&#xff09;是指将Vue组件在服务器端进行渲染&#xff0c;然后将已经渲染好的页面返回给浏览器&#xff0c;相比于传统的客户端渲染&#xff0c;SSR可以更好地优化SEO和加速首屏加载速度。在传统的客户端渲染中&#xff0c;浏览器需要加载所有的…

【MySQL系列】在 MacOS 上安装 MySQL

在 MacOS 上有两种方式安装 MySQL 服务器&#xff1a;通过 brew 安装和通过安装包安装。 文章目录 1、通过 brew 安装 MySQL1.1、安装 MySQL1.2、启动 MySQL 服务器1.3、配置 MySQL 服务器1.4、MySQL 服务器管理命令 2、通过安装包安装 MySQL2.1、下载安装包2.2、安装 MySQL2.3…

深入理解快速排序算法:从原理到实现

目录 1. 引言 2. 快速排序算法原理 3. 快速排序的时间复杂度分析 4. 快速排序的应用场景 5. 快速排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现快速排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#…

30、类和接口

文章目录 接口概念接口和类之间有何关系&#xff1f; 可以使用接口来约束类接口继承接口接口还可以继承类接口为什么可以继承类内层原因&#xff1a;接口为什么可以继承类 用得出的结论解释最初的demo接口继承类的一些限制 接口概念 接口&#xff08;Interfaces&#xff09;可…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

Ai 快捷键学习

Ai 快捷键学习 Ait 鼠标滚轮 实现页面的放大和缩小 空格鼠标左键 抓手工具 ctrl r 调出标尺&#xff0c;可以通过标尺来对其图片 ctrl &#xff1b; 隐藏标尺 ctrl ‘ 调用网格标尺 再按一次就是取削 ctrl shiftz 反向撤回 tab 快速全屏 ctsls / ctrlshift…

完全解析淘宝天猫详情接口API:购物小白也能秒变高手

在如今的电商领域中&#xff0c;淘宝和天猫是最为重要和热门的平台之一。作为购物平台的用户&#xff0c;我们通常只是浏览商品的页面&#xff0c;点击购买和支付&#xff0c;却未能深入了解背后的技术信息。然而&#xff0c;淘宝天猫详情接口API的了解和运用&#xff0c;联讯数…

力扣hot4--双指针

题目&#xff1a; 双指针想法&#xff1a; i 指针在数组不为 0 的地方停留&#xff0c;j 指针在每个地方停留&#xff0c;依次交换 i 和 j 指针。当 i 指针遍历完所有数组元素时&#xff0c;j 指针指向的元素及后面的元素都为0。 代码如下&#xff1a; C版本 class Solution …

冒泡、插入、希尔、选择、堆排序、快速排序(附源码)

目录 插入排序&#xff1a; 核心思想&#xff1a; 时间复杂度&#xff1a; 冒泡排序&#xff1a; 核心思想&#xff1a; 时间复杂度&#xff1a; 希尔排序&#xff1a; 核心思想&#xff1a; 时间复杂度&#xff1a; 选择排序&#xff1a; 核心思想&#xff1a; 时间…

告别手动填写邀请码,这款App数据统计工具帮你轻松实现

在移动互联网时代&#xff0c;App的推广和运营已成为各大企业的必修课。然而&#xff0c;面对错综复杂的推广渠道和浩如烟海的数据&#xff0c;如何精准地追踪用户来源、优化推广策略&#xff0c;一直是困扰着运营者的难题。今天&#xff0c;我们就来聊聊一款能够帮助你轻松解决…