Java开发常见基础问题
Java开发的多个方面,包括但不限于Java基础知识、多线程并发、JVM、框架使用、数据库、设计模式、网络编程等。
以下是一些常见的问题以及回答的方向:
Java 开发技术常见问题(一)
Java 基础知识
- 对象和类的区别是什么?
类是蓝图,对象是根据蓝图创建的具体实例。 - 什么是封装、继承和多态?
- 封装是隐藏对象的实现细节,只暴露操作的接口。
- 继承是从已有类派生新类的过程,新类能继承父类的属性和方法。
- 多态是同一个接口可以被不同的实例以不同的方式实现。
多线程并发
- 什么是线程安全?
线程安全是指在多线程环境中,代码的执行不会导致数据不一致或者程序状态异常。 - 如何保证线程安全?
可以使用synchronized关键字、Lock接口、volatile关键字、原子类等机制。
JVM
- JVM的内存模型是怎样的?
JVM内存模型包括方法区、堆、栈、程序计数器和本地方法栈。 - 什么是垃圾回收?
垃圾回收是JVM自动回收不再使用的对象所占用的内存。
框架使用
- Spring框架的核心是什么?
Spring框架的核心是控制反转(IoC)和面向切面编程(AOP)。 - 什么是MVC模式?
MVC模式将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分。
数据库
- 什么是SQL注入?如何预防?
SQL注入是一种攻击技术,攻击者可以通过在应用程序的输入字段中插入恶意SQL代码来破坏或操纵后端数据库。
预防方法包括使用预编译的SQL语句、对输入进行验证和转义等。 - 索引是如何工作的?
索引是一种数据结构,可以快速定位到数据库表中的行,加速查询速度。
设计模式
- 什么是单例模式?
单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。 - 工厂模式和抽象工厂模式有什么区别?
工厂模式用于创建一个接口的实例,而抽象工厂模式用于创建一系列相关或依赖对象的实例。
网络编程
- TCP和UDP有什么区别?
TCP是面向连接的、可靠的传输层协议,而UDP是无连接的、不保证可靠性的协议。 - HTTP和HTTPS有什么区别?
HTTP是超文本传输协议,而HTTPS是HTTP的安全版本,通过SSL/TLS进行加密。
其他常见问题
- 什么是RESTful API?
RESTful API是一种设计风格,用于网络应用程序之间的交互,使用标准的HTTP方法。 - 如何处理分布式系统中的一致性问题?
可以使用分布式锁、事务、最终一致性模型等策略。
Java 开发技术常见问题(二)
-
HashMap实现原理:
- HashMap基于哈希表的Map接口实现,通过键(Key)的hashCode来计算索引值,将键值对存储在哈希表中。
- 当发生哈希冲突时,HashMap使用链表或红黑树(Java 8及以上版本)来解决冲突。
-
ConcurrentHashMap实现原理:
- ConcurrentHashMap允许多个线程并发访问,通过分段锁(Segment)来提高并发性能。
- 它内部由多个Segment组成,每个Segment是一个类似HashMap的结构,可以独立进行扩容和同步。
-
红黑树:
- 红黑树是一种自平衡的二叉查找树,每个节点要么是红色,要么是黑色。
- 它通过颜色和特定的规则来保持树的平衡,查找、插入和删除操作的时间复杂度为O(log n)。
-
为什么允许局部不平衡:
- 局部不平衡允许红黑树在插入和删除操作中快速重新平衡,从而保持整体的平衡性。
-
TCP和UDP的区别:
- TCP是面向连接的、可靠的传输层协议,提供数据包的顺序传输、错误检测和重传机制。
- UDP是无连接的、不可靠的传输层协议,它提供更快的数据传输速度,但不保证数据包的顺序、完整性或可靠性。
-
为什么可靠和不可靠:
- TCP可靠是因为它能确保数据包的顺序和完整性,适用于需要可靠性的应用,如网页浏览。
- UDP不可靠是因为它不保证数据包的顺序和完整性,适用于对实时性要求高的应用,如视频会议。
-
一次HTTP请求的全过程:
- 包括DNS解析,将域名转换为IP地址。
- 通过IP地址定位主机,建立TCP连接(三次握手)。
- 发送HTTP请求,服务器处理请求并返回响应。
- 客户端接收响应,关闭TCP连接。
-
TCP三次握手:
- 第一次握手:客户端发送SYN到服务器,请求建立连接。
- 第二次握手:服务器收到SYN后,回复SYN-ACK,表示同意建立连接。
- 第三次握手:客户端收到SYN-ACK后,发送ACK,完成连接建立。
-
MySQL事务:
- 事务是一系列操作,要么全部成功,要么全部失败。
- 四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
- 四大隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。
-
ConcurrentHashMap和Hashtable的区别:
- ConcurrentHashMap支持高并发,使用分段锁提高性能。
- Hashtable是同步的,性能较低,且不允许空键和空值。
-
Spring IOC和AOP:
- IOC(控制反转):Spring容器负责管理对象的创建和依赖注入,降低组件间的耦合。
- AOP(面向切面编程):允许将横切关注点(如日志、事务)与业务逻辑分离。
- 优点:IOC简化了对象创建和管理,AOP提高了代码的模块化和可维护性。
-
常用的线程池:
- 固定大小的线程池(FixedThreadPool)。
- 缓存线程池(CachedThreadPool)。
- 单线程线程池(SingleThreadExecutor)。
- 调度线程池(ScheduledThreadPool)。
-
Runnable和Thread创建线程:
- Runnable是任务接口,可以被Thread执行。
- Thread是线程类,可以执行Runnable任务。
- 使用Runnable可以更好地实现多线程,因为它允许多个线程共享同一个任务。
-
Callable和Runnable的区别:
- Callable可以返回值和抛出异常,而Runnable不能。
- Callable通常与ExecutorService一起使用。
-
线程方法中的异常处理:
- 线程方法中的异常需要在方法内部捕获和处理。
- 主线程通常无法捕获到子线程中的异常,除非通过特定的机制(如Future)。
-
synchronized和锁的区别:
- synchronized是Java的关键字,用于同步方法或代码块。
- 锁(如ReentrantLock)是JDK提供的锁接口,提供了更多的灵活性和高级功能。
- synchronized使用简单,但功能有限;ReentrantLock功能强大,但使用复杂。
-
JVM的对象分配:
- 对象通常在堆(Heap)内存中分配。
- 类加载器在加载类时,Class对象会被分配到方法区(在Java 8之前)或元空间(Java 8及之后)。
Java 开发技术常见问题(三)
-
常用的设计模式介绍:
- 单例模式:确保一个类只有一个实例,并提供一个全局访问点。
- 装饰者模式:动态地给一个对象添加额外的职责,而不改变其结构。
-
Java会出现内存溢出吗?什么情况下会出现?
- 是的,Java也会出现内存溢出,特别是当JVM堆内存被占满且无法回收时。
-
双亲委派模型:
- 双亲委派模型是Java类加载机制,确保Java核心库的安全性和一致性。
- 它要求除了顶层的启动类加载器外,其余的类加载器都应先委托其父加载器试图加载某个类。
-
对象什么情况下进入老年代?
- 对象在新生代的Eden区和Survivor区之间经过多次GC后,如果仍然存活,会被晋升到老年代。
-
快速排序过程:
- 选择一个基准值(pivot)。
- 将数组分为两部分,一部分包含比基准值小的元素,另一部分包含比基准值大的元素。
- 递归地在这两部分上重复这个过程。
-
AOP实现原理:动态代理:
- 动态代理可以在运行时动态地创建代理对象,拦截方法调用,并在方法调用前后添加额外的行为。
-
BIO、NIO、AIO:
- BIO(阻塞I/O):每个连接都需要一个单独的线程处理,适合连接数较少的场景。
- NIO(非阻塞I/O):通过缓冲区和通道的概念,可以处理更多的并发连接,且线程数不变。
- AIO(异步I/O):进一步抽象,允许应用程序发出I/O请求而不必等待I/O操作完成。
-
消息中间件有哪些?他们之间的优劣势?
- 常见的消息中间件有Kafka、RabbitMQ、ActiveMQ等。
- Kafka适合高吞吐量的场景,RabbitMQ支持多种消息协议,ActiveMQ是JMS规范的实现。
-
Redis,持久化框架:
- Redis支持RDB和AOF两种持久化方式。
- RDB是快照方式,AOF是日志方式,记录每次写操作。
-
栈和队列:
- 栈:后进先出(LIFO)的数据结构。
- 队列:先进先出(FIFO)的数据结构。
-
垃圾回收算法:
- 标记-清除:标记需要回收的对象,然后清除它们。
- 复制算法:将内存分为两个区域,复制存活的对象到另一个区域,然后清除原区域。
- 标记-整理:在标记-清除的基础上,移动存活的对象,减少内存碎片。
-
MySQL的索引:
- 索引用于快速查找、排序和分组数据。
- 常见的索引类型有B树索引、哈希索引、全文索引等。
-
Tomcat 类加载器:
- Tomcat使用类加载器隔离每个Web应用,确保应用之间的独立性。
-
OOM内存泄漏,什么情况下会出现,如何排查:
- OOM(Out of Memory)当JVM堆内存耗尽时出现。
- 内存泄漏通常由于长时间持有对象引用导致。
- 排查内存泄漏可以使用工具如jmap、VisualVM等,分析堆转储文件。
Java 开发技术常见问题(四)
MQ消息投递失败处理
消息队列(MQ)消息投递失败可能由多种原因引起,如网络问题、服务不可用、消息格式错误等。以下是一些处理策略:
- 重试机制:实现消息重试逻辑,可以是自动重试,也可以是手动重试。
- 死信队列:对于无法投递的消息,可以将其发送到一个死信队列,以供后续分析和处理。
- 幂等性:确保消息处理是幂等的,即多次处理相同的消息不会导致不一致的问题。
- 事务性:如果MQ支持,可以使用事务确保消息的一致性和完整性。
- 监控和告警:建立监控系统,对消息队列的状态和性能进行监控,并在出现问题时发出告警。
- 资源优化:检查和优化MQ服务器的资源使用情况,如内存、CPU等。
- 错误处理:编写错误处理逻辑,对投递失败的消息进行记录和分析。
Kafka的ack机制
Kafka的ack机制指的是消息确认机制,它确保了消息的可靠性和一致性。Kafka提供了不同级别的ack:
- ack=0:生产者不会等待任何来自Broker的确认,可能会丢失消息。
- ack=1:只要集群中的Leader提交了消息,生产者就会收到确认,可能会重复发送消息。
- ack=all(或-1):只有当所有同步副本都提交了消息,生产者才会收到确认,确保了消息不会丢失也不会重复。
保持消息有序消费
为了保持消息的有序消费,可以采取以下策略:
- 单分区单消费者:确保每个消费者只消费一个分区的消息。
- 有序分区:设计消息时,根据业务逻辑将相关消息发送到同一个分区。
- 消费者组:使用消费者组,确保每个分区只分配给一个消费者。
- 消息键:使用消息键(key),Kafka会保证具有相同键的消息发送到同一个分区。
Java并发系统
Java并发系统涉及多个概念,包括:
- 悲观锁:假设最坏的情况,每次访问共享数据时都进行加锁。
- 乐观锁:假设没有冲突,只在提交更新时检查是否有其他线程进行了修改。
- 线程:Java中线程是程序执行的最小单元。
- 线程池:用于管理线程的创建和复用,提高性能和资源利用率。
- 同步机制:如synchronized关键字,用于控制对共享资源的并发访问。
- 并发集合:如ConcurrentHashMap,提供了线程安全的集合操作。
8G内存系统最多创建线程数
这个问题没有固定答案,因为线程的内存占用不仅包括线程本身的栈空间,还包括线程运行时占用的内存。一般来说,线程的栈大小默认为1M,但实际占用还要考虑其他因素,如操作系统的线程模型、页表大小等。理论上,8G内存的系统可以创建约8000个线程,但实际上会少得多。
Java程序启动时的线程
启动一个Java程序时,JVM会创建一些线程,包括:
- 主线程:执行main方法的线程。
- 垃圾回收线程:负责内存管理。
- 类加载器线程:负责加载类。
- 信号处理线程:处理操作系统信号。
- 监控线程:监控JVM状态。
对象进入老年代的情况
对象进入老年代(Tenured Generation)的情况包括:
- 大对象:超过一定大小的对象直接进入老年代。
- 多次GC后存活:在新生代经过多次GC后仍然存活的对象。
- 空间分配担保:当新生代空间不足以容纳新对象时,直接进入老年代。
Full GC和Young GC的区别
- Young GC:只清理新生代的垃圾。
- Full GC:清理整个堆空间,包括新生代、老年代和元空间。
索引的分类和创建索引的最佳实践
索引分类:
- 单列索引:一个索引只包含单个列。
- 复合索引:一个索引包含多个列。
- 唯一索引:保证索引列的值唯一。
- 全文索引:用于文本搜索。
创建索引的最佳实践:
- 选择性:选择具有高选择性的列进行索引。
- 最左前缀:复合索引要遵守最左前缀规则。
- 避免过度索引:过多的索引会降低写性能。
- 考虑查询模式:根据实际的查询需求来设计索引。
- 定期维护:定期重建索引以优化性能。
以上是一些基本的指导原则,具体情况还需要根据实际应用场景进行调整。
相关文章:
Java开发常见基础问题
Java开发的多个方面,包括但不限于Java基础知识、多线程并发、JVM、框架使用、数据库、设计模式、网络编程等。 以下是一些常见的问题以及回答的方向: Java 开发技术常见问题(一) Java 基础知识 对象和类的区别是什么࿱…...
大数据组件doc
1.flink Apache Flink Documentation | Apache Flink 2.kafka Apache Kafka 3.hbase Apache HBase ™ Reference Guide 4.zookeeper ZooKeeper: Because Coordinating Distributed Systems is a Zoo 5.spark Overview - Spark 3.5.1 Documentation 6.idea组件(…...

Docker Hub 国内镜像源配置
Docker Hub 国内镜像源配置 Docker Hub 国内镜像源是指在国内境内提供 Docker 镜像服务的镜像源。由于国际网络带宽等问题,国内用户下载 Docker 镜像通常速度较慢。因此,为了解决这个问题,一些国内的公司和组织提供了 Docker 镜像的国内镜像…...
持续总结中!2024年面试必问 20 道 Kafka面试题(一)
一、Kafka 的基础概念有哪些? Kafka 是一个分布式流处理平台,由 LinkedIn 开发,并于 2011 年成为 Apache 软件基金会的一部分。以下是 Kafka 的一些基础概念: Broker: Kafka 集群由多个 Broker 组成,每个 Broker 存储…...

Linux共享内存创建和删除
最近项目中使用到了共享内存记录下 创建共享内存: 删除共享内存: 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <u…...
微信小程序如何自定义tabbar
微信小程序自定义底部tabbar是一个提升用户体验和增加小程序个性化的重要功能。以下是自定义底部tabbar的步骤,以供参考: 一、自定义tabbar的重要性 微信小程序默认的底部导航栏(tabbar)样式和布局是固定的,开发者无…...

【并发程序设计】15.信号灯(信号量)
15.信号灯(信号量) Linux中的信号灯即信号量是一种用于进程间同步或互斥的机制,它主要用于控制对共享资源的访问。 在Linux系统中,信号灯作为一种进程间通信(IPC)的方式,与其他如管道、FIFO或共享内存等IPC方式不同&…...

【操作与配置】VS2017与MFC环境配置
【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境(IDE),适用于软件开发人员和团队。使用此应用程序,您可以构建和调试现代Web应用程序,并利用扩展帮助探索几乎任何编程语言。…...

遥感影像信息提取
刘老师(副教授),来自双一流重点高校,长期从事GIS/RS/3S技术及其生态环境领域中的应用等方面的研究和教学工作,并参与GIS的二次开发,发表多篇sci论文,具有资深的技术底蕴和专业背景。 专题一&am…...
LRU算法
文章目录 LRU算法LRU 如何实现LinkedHashMap来实现的LRU算法的缓存HashMap实现LRU算法的缓存 LRU算法 LRU(Least Recently Used)算法可以使用哈希表和双向链表来实现。哈希表用于快速查找数据,双向链表用于记录数据的访问顺序。以下是LRU算法…...

JVM运行时数据区 - 程序计数器
运行时数据区 Java虚拟机在执行Java程序的过程中,会把它管理的内存划分成若干个不同的区域,这些区域有各自的用途、创建及销毁时间,有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和结束而建立和销毁࿰…...

1.JAVA小项目(零钱通)
一、说明 博客内容:B站韩顺平老师的视频,以及代码的整理。此项目分为两个版本: 面向过程思路实现面向对象思路实现 韩老师视频地址:【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh4…...

Redis这一篇就够了
一.概述 Redis是什么? Redis是远程服务字典服务,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,Key-Value数据库,并提供多种语言的API。 redis会周期性把更新的数据写入磁盘或把…...

Java web应用性能分析之【jvisualvm远程连接云服务器】
Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 前面整理了java进程问题分析和分析工具,现在可以详细看看jvisualvm的使用,一般java进程都是部署云服务器,或者托管IDC机…...

springboot发送短信验证码,结合redis 实现限制,验证码有效期2分钟,有效期内禁止再次发送,一天内发送超3次限制
springboot结合redis发送短信验证码,实现限制发送操作 前言(可忽略)实现思路正题效果图示例手机号不符合规则校验图成功发送验证码示例图redis中缓存随机数字验证码,2分钟后失效删除redis缓存图验证码有效期内 返回禁止重复发送图验证码24小时内发送达到3次…...
【Python】使用 Pandas 统计每行数据中的空值
缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 🎵 邓紫棋《光年之外》 在数据分析…...
1pannel部署onenav导航容器编排模板
onenav导航 1pannel部署onenav导航容器编排模板 networks:1panel-network:external: true services:onenav:container_name: onenavimage: helloz/onenav:latestlabels:createdBy: Appsnetworks:- 1panel-networkports:- 127.0.0.1:{port}:80environment:- TZAsia/Shanghaivol…...

linux--实时性优化
linux--实时性优化 1 介绍2 实时性需求3 代表性实时系统4 嵌入式系统嵌入式软件系统结构处理器时钟节拍多任务机制任务调度方式任务调度算法时间片调度算法优先级调度算法基于优先级的时间片调度算法 5 cyclictest 测试工具命令说明命令分析参数含义 6 linux 实时性改进某版本上…...

React-基础样式控制
组件基础样式方案 React组件基础的样式控制有两种方式 1、行内样式(不推荐) 属性名是多个单词的需要使用驼峰写法 也可以把样式都提取到一个变量里,再赋值到style里 2、class类名控制 classnames优化类名控制 classnames是一个简单的JS库&…...

制作ChatPDF之前端Vue搭建(二)
前端界面 接上篇: 制作ChatPDF之Elasticsearch8.13.4搭建(一) 为了实现一个基于 Vue.js 的前端应用,用户可以上传 PDF 文件,输入查询,并在输出框中显示查询结果,你需要以下步骤: 初始化 Vue …...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...