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

news/2024/4/19 14:18:40/文章来源:https://blog.csdn.net/key_honghao/article/details/136434016

大数据开发(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.luyixian.cn/news_show_996114.aspx

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

相关文章

redis IO多路复用模型详解

一、IO 1.1、IO模型 我们常说的IO&#xff0c;指的是文件的输入和输出 &#xff0c;但是在操作系统层面是如何定义IO的呢&#xff1f;到底什么样的过程可以叫做是一次IO呢&#xff1f; 拿一次磁盘文件读取为例&#xff0c;我们要读取的文件是存储在磁盘上的&#xff0c;我们的…

异步编程实战:使用C#实现FTP文件下载及超时控制

博客标题: 异步编程实战&#xff1a;使用C#实现FTP文件下载及超时控制 如果你的函数不是async&#xff0c;你仍然可以实现相同的超时功能&#xff0c;但你将不得不依赖更多的同步代码或使用.Result或.GetAwaiter().GetResult()来阻塞等待任务完成&#xff0c;这可能导致死锁的风…

1.初识python

1.初识python 编程语言是用来定义计算机程序的语言&#xff0c;用来向计算机发出指令。 1.python语言是一种面向对象的解释型高级编程语言。 解释型语言&#xff1a;使用专门的解释器对源码程序逐行解释成特定平台的机器并立即执行&#xff0c;是代码在执行时才被解释器一行行…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TapGesture)

支持单击、双击和多次点击事件的识别。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 TapGesture(value?: { count?: number, fingers?: number }) 参数&#xff1a; 参数名称参数类型必填参…

2024最新算法:斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)求解23个基准函数(提供MATLAB代码)

一、斑翠鸟优化算法 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵感。PKO 算法围绕三个不…

React富文本编辑器开发(二)

我们接着上一节的示例内容&#xff0c;现在有如下需求&#xff0c;我们希望当我们按下某个按键时编辑器有所反应。这就需要我们对编辑器添加事件功能onKeyDown, 我们给 Editor添加事件&#xff1a; SDocor.jsx import { useState } from react; import { createEditor } from…

「媒体宣传」品牌发布会活动策划注意点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 品牌发布会活动策划的媒体宣传方面&#xff0c;以下是关键的注意点&#xff1a; 一、目标与定位 明确核心信息和品牌重点。 设定清晰的目标受众。 二、媒体选择 针对性选择主流媒体、…

【详识C语言】自定义类型之二:枚举

本章重点 枚举 枚举类型的定义 枚举的优点 枚举的使用 枚举 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举。 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举。…

大数据智能化-长视频领域

随着数字化时代的到来&#xff0c;长视频领域的发展迎来了新的机遇和挑战。在这一背景下&#xff0c;大数据智能化技术的应用成为长视频行业提升用户体验、优化运营管理的重要手段之一。本文将从优爱腾3大长视频背景需求出发&#xff0c;分析静态资源CDN、视频文件存储与分发、…

力扣(LeetCode)数据结构练习题(2)

今天又写了两道关于链表的练习题&#xff0c;来给大家分享一下。巩固一下上一篇学到的链表知识&#xff0c;题目可以然我们更清楚的认识链表。 目录 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 给你单链表的头结点 head &#xff0c;请…

【Java设计模式】八、装饰者模式

文章目录 0、背景1、装饰者模式2、案例3、使用场景4、源码中的实际应用 0、背景 有个快餐店&#xff0c;里面的快餐有炒饭FriedRice 和 炒面FriedNoodles&#xff0c;且加配菜后总价不一样&#xff0c;计算麻烦。如果单独使用继承&#xff0c;那就是&#xff1a; 类爆炸不说&a…

mac 下redis

安装 Redis brew install redis 安装完成后&#xff0c;我们可以使用以下命令来确认 Redis 是否正确安装&#xff1a; redis-cli ping 启动 Redis redis-server 后台启动 Redis&#xff0c;可以使用以下命令&#xff1a; redis-server --daemonize yes 指定配置文件启动…

阿里云配置服务器详细指南

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Ubuntu 22.04修改静态ip

1. 备份原网络配置文件 # 配置文件名称因机器设置有异 cd /etc/netplan cp 01-network-config.yaml 01-network-config.yaml.bak# 文件内容如下 network:version: 2renderer: NetworkManager2. 修改配置文件 使用 ipconfig 命令查看网络信息&#xff0c;ip addr 命令也可 我这…

【QT】控件的用法介绍

QLabel&#xff08;很重要&#xff09; QPixmap在Qt中代表的就是一张图片 QPicture不是图片 如果图片不能完整显示&#xff0c;那就是没有布局 //添加静态图片如果构造的时候没有指定&#xff0c;可以在外面用load()指定图片路径ui->label->setPixmap(QPixmap(":…

量化人这样用Jupyter(2) - JupySQL, D-tale

当我们使用 Jupyter 时,很显然我们的主要目的是探索数据。这篇文章将介绍如何利用 JupySQL 来进行数据查询–甚至代替你正在使用的 Navicat, dbeaver 或者 pgAdmin。此外,我们还将介绍如何更敏捷地探索数据,相信这些工具,可以帮你省下 90%的 coding 时间。 原文发表在这里…

《探索虚拟与现实的边界:VR与AR谁更能引领未来?》

引言 在当今数字时代&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术正以惊人的速度发展&#xff0c;并逐渐渗透到我们的日常生活中。它们正在重新定义人与技术、人与环境之间的关系&#xff0c;同时也为各行各业带来了全新的可能性。…

第五节 JDBC驱动程序类型

JDBC驱动程序是什么&#xff1f; JDBC驱动程序在JDBC API中实现定义的接口&#xff0c;用于与数据库服务器进行交互。 例如&#xff0c;使用JDBC驱动程序&#xff0c;可以通过发送SQL或数据库命令&#xff0c;然后使用Java接收结果来打开数据库连接并与数据库进行交互。 JDK…

MATLAB BP神经网络工具箱

1. 原理 BP神经网络结构&#xff1a; Matlab神经网络工具箱&#xff1a; BP神经网络定义&#xff1a; netnewff(PR,[S1 S2...SNl],{TF1 TF2...TFNl},BTF,BLF,PF) 其中&#xff1a; PR --输入元素的最小值和最大值的Rx2矩阵R SI -- 第 i 层的大小&#xff0c;对于Nl层&…

YOLOV8介绍

原文链接&#xff1a; 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署&#xff08;实战&#xff09;&#xff08;&#xff09;有具体部署和训练实现代码YOLOV8模型训练部署&#xff08;实战&#xff09;&…