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

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

  • 1、简要介绍以下JVM有几种垃圾收集器?
  • 2、Java中Synchronized的底层原理是什么?
  • 3、Java String为什么是不可变的?为什么要设计成不可变?
  • 4、泛型?
  • 5、常用的反射方法?
  • 6、Java集合类型?
  • 7、HashMap原理?转换成红黑树条件?为什么这么设计?
  • 8、Java线程安全的HashMap?ConcurrentHashMap和HashTable的区别?ConcurrentHashMap原理?

1、简要介绍以下JVM有几种垃圾收集器?

  1. Serial收集器:Serial收集器是JVM中最古老的一种垃圾回收器,它以单线程方式进行垃圾收集工作,适用于小型或者单核处理器的应用场景。
  2. Parallel收集器:Parallel收集器是Serial收集器的改进版本,它使用多线程进行垃圾收集,提高了垃圾收集的效率,适用于多核处理器的应用常见。
  3. CMS收集器:CMS收集器是一种以获取最短回收停顿时间为目标的收集器,它通过并发的方式进行垃圾收集,能够在主程序运行的同时进行垃圾收集,适用于对响应时间有较高要求的应用场景
  4. G1收集器:G1收集器是一种面向服务端应用的垃圾收集器,它将堆内存划分为多个区域,并根据垃圾产生情况优先回收垃圾角度的区域,可以达到较低的停顿时间和更好的吞吐量。

2、Java中Synchronized的底层原理是什么?

Synchronized是Java中用于实现线程同步的关键字,它的底层原理是通过对象监视器(也称为内部锁或监视锁)来实现的。
当一个线程进入synchronized代码块时,它会尝试获取对应对象的监视器。如果该监视器没有被其它线程占用,则该线程获取到监视器并执行代码块中的逻辑。如果监视器已经被其它线程占用,该线程就会进入阻塞状态,等待监视器的释放
在Java虚拟机中,每个对象都有一个与之关联的监视器锁。当一个线程获取到该对象的监视器锁时,其它线程就无法同时获取该对象的监视器锁,它们会被阻塞直到锁被释放。
在方法上适用synchronized关键字时,它会对该方法的整个代码块进行加锁,以保证同一时间只有一个线程可以执行该方法。而在代码块上使用synchronized关键字时,它只会对该代码块进行加锁,其它线程仍然可以同时执行其它非同步代码块
需要注意的是,synchronized关键字会引入一定的性能开销,因为每次进入synchronized代码块或方法时,都会进行加锁或解锁的操作。因此,在使用synchronized时需要权衡线程安全和性能之间的平衡。

3、Java String为什么是不可变的?为什么要设计成不可变?

Java中的String是不可变的,这是因为String类被设计成了不可变的对象。这意味着一旦一个String对象被创建,它的值就不能被修改。

不可变有以下几个原因:

  1. 线程安全:不可变的特性使得String对象在多线程环境中是安全的。因为它的值不可变,不会被其它线程修改,所以不需要同步控制
  2. 缓存哈希值:String类将哈希值缓存在对象中,因为它是不可变的,所以哈希值只需要计算一次,而不需要每次使用时重新计算。这样可以提高性能。
  3. 字符串池:Java中的字符串池是为了节省内存而设计的。不可变的String对象可以被共享并重复使用,避免了创建多个相同值得字符串对象。这样可以减少内存占用,提高性能。
  4. 安全性:字符串作为参数传递给一些敏感得API时,不可变的特性可以确保参数的值不会被修改,从而保证数据的安全性。

综述所述,Java中的String被设计成不可变的主要是为了提高性能、确保线程安全以及节省内存

4、泛型?

泛型是Java中一种参数化类型的概念,它允许我们在编写类、接口和方法时使用未知的数据类型。通过使用泛型,我们可以创建通用的代码,可以在不同的数据类型上进行操作,提高代码的复用性和类型安全性。泛型使用尖括号<>来定义,可以用于类、接口和方法的声明和实例化中。在使用泛型时,可以指定具体的数据类型,也可以使用通配符来表示未知的数据类型

5、常用的反射方法?

常用的反射方法有:

  1. 获取Class对象:通过Class.forName(),对象.getClass()、类名.class等方式获取一个类的Class对象。
  2. 创建实例:通过Class对象的newInstance()方法创建类的实例。
  3. 获取类的成员变量:通过Class对象的getField()、getDeclaredField()等方法获取类的公共或私有成员变量。
  4. 获取类的方法:通过Class对象的getMethod()、getDeclaredMethod()等方法获取类的公共或私有方法。
  5. 调用方法:通过Method对象的invoke()方法调用方法。
  6. 修改成员变量的值:通过Field对象的set()方法修改成员变量的值。
  7. 调用构造函数:通过Class对象的getConstructor()、getDeclaredConstructor()等方法获取类的公共或私有构造函数,并通过Constructor对象的newInstance()方法创建类的实例。
    这些方法可以在运行时动态地获取和操作类的信息,使得我们可以在不知道具体类名地情况下,通过反射机制来调用类地方法、访问成员变量等

6、Java集合类型?

Java集合类型有以下几种:

  1. List(列表):List是一个有序的集合,可以包含重复元素。常见的实现类有ArrayList和LinkedList。
  2. Set(集合):Set是一个不允许重复元素的集合。常见的实现类有HashSet和TreeSet。
  3. Map(映射):Map是一种键值对的集合,每个键只能对应一个值。常见的实现类有HashMap和TreeMap。
  4. Queue(队列):Queue是一种先进先出(FIFO)的集合。常见的实现类有LinkedList和PriorityQueue。
  5. Stack(栈):Stack是一种后进先出的集合。常见的实现类有Stack。
  6. Vector(向量):Vector是一个动态数组,与ArrayList类似,但是它是线程安全的。

7、HashMap原理?转换成红黑树条件?为什么这么设计?

HashMap是Java中常见的一种数据结构,它基于哈希表实现。具体原理如下:

  1. HashMap内部由一个数组和链表(或红黑树)组成。数组是HashMap的主体,用于存储键值对。链表和红黑树用于解决哈希冲突,提高查找效率。
  2. 添加一个键值对到HashMap中时,首先根据键的hashCode()方法计算出一个哈希值,然后通过哈希值与数组长度取模,得到在数组中的位置。如果该位置上已经存在其它键值对,就发生了哈希冲突
  3. 如果发生哈希冲突,会在该位置上的链表或红黑树上顺序查找键值对。如果键已经存在,则更新对应的值。如果键不存在,则在链表或红黑树的末尾添加新的键值对
  4. 链表长度超过阈值(默认为8)时,链表会转换为红黑树

转换为红黑树的条件如下:
-当链表长度达到8时,且当前数组长度大于等于64,HashMap会将链表转换为红黑树。
-当红黑树节点数量小于等于6时,HashMap会将红黑树转换为链表

这样设计的原因是,当链表长度过长时,查找效率会降低,因为需要遍历链表进行查找。而红黑树相比链表,具有更高效的查找、插入和删除操作,能够更好地提高HashMap的性能。同时,对于较小的链表,转换为红黑树的开销反而比链表更大,所以在节点数量小于等于6时,会将红黑树转换回链表,以节省内存空间

8、Java线程安全的HashMap?ConcurrentHashMap和HashTable的区别?ConcurrentHashMap原理?

Java线程安全的HashMap可以使用ConcurrentHashMap来实现。ConcurrentHashMap是Java并发包中的一个线程安全的哈希表实现,它比传统的HashTable和同步的HashMap具有更好的并发性能
ConcurrentHashMap和HashTable的区别如下:

  1. 锁机制ConcurrentHashMap使用了分段锁(Segment),每个Segment相当于一个小的HashTable,只锁住当前操作的Segement而不是整个HashTable;而HashTable在每次操作时都锁住整个HashTable
  2. 并发性ConcurrentHashMap允许多个线程同时读取,而写操作会锁住相关的Segment,使得在并发写入时性能更好;HashTable在写操作时需要锁住整个HashTable,导致并发写入性能较差。
  3. 扩容机制ConcurrentHashMap在扩容时只需要锁住相关的Segment,不影响其它Segment的读写操作,提高了并发性能;HashTable在扩容时需要锁住整个HashTable,导致其它线程无法读写,性能较差。

ConcurrentHashMap的原理是基于分段锁(Segment)实现的。它将整个哈希表分成多个小的HashTable(Segment),每个Segment独立地进行锁定和扩容操作。这样可以提高并发性能,允许多个线程同时读取,而写操作只需要锁定相关地Segment,不影响其它Segment的读写操作。同时ConcurrentHashMap使用CAS算法来保证并发操作的一致性和线程安全性。

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

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

相关文章

深入Java日志框架及其最佳实践

概述 在Java应用开发中&#xff0c;日志框架是确保应用稳定性和可观察性的关键组件。它帮助开发者记录应用的行为、诊断问题&#xff0c;并监控系统的健康状况。随着Java生态系统的不断发展&#xff0c;各种日志框架也应运而生&#xff0c;各有特点和优势。本文将详细探讨几个…

redis进阶(一)

文章目录 前言一、Redis中的对象的结构体如下&#xff1a;二、压缩链表三、跳跃表 前言 Redis是一种key/value型数据库&#xff0c;其中&#xff0c;每个key和value都是使用对象表示的。 一、Redis中的对象的结构体如下&#xff1a; /** Redis 对象*/ typedef struct redisO…

c# .net8 香橙派orangepi + hc-04蓝牙 实例

这些使用c# .net8开发&#xff0c;硬件 香橙派 orangepi 3lts和 hc-04蓝牙 使用场景&#xff1a;可以通过这个功能&#xff0c;手机连接orangepi进行wifi等参数配置 硬件&#xff1a; 1、带USB口的linux开发板orangepi 2、USB 转TTL 中转接蓝牙&#xff08;HC-04) 某宝上买…

Vue的响应式原理是如何实现的

Vue的响应式原理主要**基于JavaScript的Object.defineProperty方法实现**。具体如下&#xff1a; 1. 数据劫持&#xff08;Data Hijacking&#xff09; Vue在初始化时&#xff0c;会遍历data对象中的所有属性&#xff0c;并使用Object.defineProperty将这些属性转换为getter/s…

Flink:Temporal Table Function(时态表函数)和 Temporal Join

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

AR时间序列模型

AR时间序列模型&#xff08;AutoRegressive Time Series Model&#xff09;是一种用于分析和预测时间序列数据的统计模型。该模型假设未来的观测值与过去的观测值相关&#xff0c;且该相关性可以通过线性回归来描述。 AR模型的基本思想是将当前时刻的观测值表示为过去几个时刻…

设计模式(十五)状态模式

请直接看原文:设计模式系列 ------------------------------------------------------------------------------------------------------------------------------- 前言 建议在阅读本文前先阅读设计模式&#xff08;十一&#xff09;策略模式这篇文章&#xff0c;虽说状态…

java.sqlrecoverableexception: io error: the network adapter could not establ

数据库相关学习资料下载地址&#xff1a; 数据库相关资料合集 Java SQLRecoverableException: IO Error: The Network Adapter Could Not Establish Connection 在进行Java开发中&#xff0c;经常会遇到与数据库进行交互的情况。然而&#xff0c;有时候我们可能会遇到java.sq…

Redis过期删除策略

1、定时删除&#xff1a; 一旦键过期就立即从内存中删除&#xff0c;节省内存空间&#xff0c;但删除过程会占用大量CPU时间&#xff0c;可能影响服务器的响应时间和吞吐量。 2、惰性删除&#xff1a; 并不会立即从内存中删除过期键&#xff0c;而是在需要访问时才会检查是否…

【MATLAB】MVMD_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 MVMD_MFE_SVM_LSTM神经网络时序预测算法结合了多变量多尺度分解&#xff08;MVMD&#xff09;、多尺度特征提取&#xff08;MFE&#xff09;、支持向量机&#xff08;SVM&#xff09;和长…

Python爬虫之爬取并下载哔哩哔哩视频

亲自使用过&#xff0c;太好用了 # 导入requests模块&#xff0c;模拟发送请求 import requests # 导入json import json # 导入re import re# 定义请求头 headers {Accept: */*,Accept-Language: en-US,en;q0.5,User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6…

小米消息队列的选型与实践

之前写了一篇关于消息队列的文章&#xff1a;《消息队列介绍与对比》&#xff0c;本文主要介绍消息队列在实际工作中的使用情况&#xff08;截止到2023年&#xff0c;因为我2023年离职了&#xff0c;后续的情况不了解了&#xff0c;哈哈&#xff09;。 市面上的多种消息队列都有…

node问题: command not found: nodemon

如何安装并使用 nodemon npm i -g nodemon 问题与解决方案&#xff1a; 问题&#xff1a;zsh: command not found: nodemon 解决方案&#xff1a; 在你的 package.json 中加入&#xff1a; "scripts": {"auto": "npx nodemon server.js" }…

单例模式及应用场景

如果希望自己的代码更优雅、可维护性更高以及更简洁&#xff0c;往往离不开设计模式这一解决方案。 在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化&#xff08;将变与不变分离&#xff0c;确保变化的部分灵活&#xff0c;不变的部分稳定&#xff09;。 那么来…

[嵌入式系统-36]:龙芯1B 开发学习套件 -5- PMON常见命令

目录 0. 开机时按c键进入pmon模式 &#xff08;自启动模式时&#xff09; 1、帮助命令 h 2、显示设备信息 devls 3.重启&#xff1a;reboot 4、设置环境变量 set/unset 5.查询环境变量&#xff1a;env 6.网络设置相关命令&#xff1a; ①设置IP&#xff1a;ifconfig&am…

Linux 基础IO(1)内存文件

文章目录 铺垫文件的系统调用接口文件描述符缓冲区 铺垫 文件文件内容 文件属性访问文件之前&#xff0c;都要先打开文件&#xff0c;而要访问&#xff0c;修改&#xff0c;编辑文件&#xff0c;文件就必须加载到内存中程序运行起来变成进程&#xff0c;被CPU调度&#xff0c;…

详解Win 7重置电脑操作步骤

文章目录 介绍Win 7 重置系统的方法&#xff1a;1.按下键盘上的Windows键和R键&#xff0c;打开运行窗口&#xff0c;输入sysprep 点击回车确定。2.之后就会出现如下界面&#xff0c;在这个新打开的窗口中双击 sysprep 程序3.选择【进入系统全新体验&#xff08;00BE) 】&#…

基于SpringBoot的在线拍卖系统(附项目源码+论文)

摘要 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、留言板管理、系统管理&#xff0c;用户&#xff1b;首页、个人中心、历史竞拍管理、竞拍订单管理、留言板管理&#xff0…

Linux重新获取IP地址

你可以通过重启客户端来获取新的IP地址。可以使用以下命令来重启DHCP客户端&#xff1a; sudo dhclient -r # 释放当前IP sudo dhclient # 获取新的IP 这将释放当前的IP地址&#xff0c;并请求新的IP地址。 使用ifdown和ifup命令&#xff1a;另一种方法是使用ifdown和i…

STM32学习和实践笔记(1): 装好了的keil μVision 5

2019年3月在淘宝上买了这块STM32的开发板&#xff0c;学了一段时间后就丢下了&#xff0c;今天重新捡起来&#xff0c;决定好好学习、天天向上。 对照教程&#xff0c;今天先把keil5装上了。 装的过程有以下几点值得记录下&#xff1a; 1&#xff09;用注册机时&#xff0c;…