高级Java开发面试常用题的答案2

Java 高级面试问题及答案 反射是 Java 提供的一种能力,允许程序在运行时查询和操作类的对象,包括类的属性、方法和构造器等。通过反射,你可以在运行时创建对象、调用方法、访问属性等,即使这些信息在编译时是未知的。动态加载类:可以在运行时加载并初始化类,而不必在编译时就完全知道要加载的类。动态调用方法:可以调用对象的任意方法,即使这些方法在编写代码时是未知的。访问对象的属性:可以读取或修改对象的属性,即使这些属性在编译时不可见。实现通用的框架:许多设计模式和框架,如依赖注入、ORM(对象关系映射)等,都依赖于反射来实现。 阅读详情

三、JVM

· JVM堆的基本结构。

 

java_heap_struct.jpg

参考阅读:JVM内存堆布局图解分析

· JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程?

基本的算法有:

  1. 标记-清除算法
  2. 等待被回收对象在被标记后直接对对象进行清除,会带来另一个新的问题——内存碎片化。如果下次有比较大的对象实例需要在堆上分配较大的内存空间时,可能会出现无法找到足够的连续内存而不得不再次触发垃圾回收。
  3. 复制算法(Java堆中新生代的垃圾回收算法)
  4. 此GC算法实际上解决了标记-清除算法带来的“内存碎片化”问题。首先还是先标记处待回收内存和不用回收的内存,下一步将不用回收的内存复制到新的内存区域,这样旧的内存区域就可以全部回收,而新的内存区域则是连续的。它的缺点就是会损失掉部分系统内存,因为你总要腾出一部分内存用于复制。
  5. 标记-压缩算法(或称为标记-整理算法,Java堆中老年代的垃圾回收算法)
  6. 对于新生代,大部分对象都不会存活,所以在新生代中使用复制算法较为高效,而对于老年代来讲,大部分对象可能会继续存活下去,如果此时还是利用复制算法,效率则会降低。标记-压缩算法首先还是“标记”,标记过后,将不用回收的内存对象压缩到内存一端,此时即可直接清除边界处的内存,这样就能避免复制算法带来的效率问题,同时也能避免内存碎片化的问题。老年代的垃圾回收称为“Major GC”。

 

  1.  
  2. jvm_gc.png

CMS的基本流程:

  1. 初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了。
  2. 并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
  3. 并发预清理 :并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作,因为下一个阶段会Stop The World。
  4. 重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从"跟对象"开始向下追溯,并处理对象关联。
  5. 并发清理 :清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
  6. 并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收

延伸说明:

  • CMS(Concurrent Mark-Sweep) 在启动JVM参数加上-XX:+UseConcMarkSweepGC,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除(Mark-Sweep)。CMS不会整理、压缩堆空间。这样就会有一个问题:经过CMS收集的堆会产生空间碎片。CMS的另一个缺点是它需要更大的堆空间。
  • 如果你的应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU(也就是硬件牛逼),那么使用CMS来收集会给你带来好处。还有,如果在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS。

· JVM有哪些常用启动参数可以调整,描述几个?

各主要JVM启动参数的作用如下:

-Xms:设置jvm内存的初始大小

-Xmx:设置jvm内存的最大值

-Xmn:设置新域的大小(这个似乎只对jdk1.4来说是有效的,后来就废弃了)

-Xss:设置每个线程的堆栈大小(也就是说,在相同物理内存下,减小这个值能生成更多的线程)

-XX:NewRatio:设置新域与旧域之比,如-XX:NewRatio=4就表示新域与旧域之比为1:4

-XX:NewSize:设置新域的初始值

-XX:MaxNewSize:设置新域的最大值

-XX:MaxPermSize:设置永久域的最大值

-XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个Survivor区则用来存放每次垃圾回收后存活下来的对象)

-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime

JVM启动参数使用中常见的错误:

java.lang.OutOfMemoryError相信很多开发人员都用到过,这个主要就是JVM参数没有配好引起的,但是这种错误又分两种:java.lang.OutOfMemoryError:Javaheapspace和java.lang.OutOfMemoryError:PermGenspace,其中前者是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置,而后者是有关永久域的内存溢出,可以通过配置-XX:MaxPermSize来设置。

· 如何查看JVM的内存使用情况?

jstat,jmap,jstack,j viusalvm

· Java程序是否会内存溢出,内存泄露情况发生?举几个例子。

  1. 静态集合类引起内存泄漏:

 
Static Vector v = new Vector(10); for (int i = 1; i<100; i++) { Object o = new Object(); v.add(o); o = null; } //o的对象还在Vector中,因此需要从中移除,或者直接把vector=null 
  1. 各种资源性连接没有正确关闭.比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。
  2. 不正确使用单例模式是引起内存泄漏的一个常见问题.
  3. 当集合里面的对象属性被修改后,造成该对象的Hashcode改变了,再调用remove()方法时不起作用。

· 你常用的JVM配置和调优参数都有哪些?分别什么作用?

  1. Trace跟踪参数(跟踪GC、类、变量的内存变化情况)
  • 打开GC跟踪日志(每次执行GC的信息都能打印,获得执行时间,空间大小):
  • -verbose:gc 或 -XX:+printGC 或 -XX:+printGCDetails
  • 类加载监控:(监控类加载的顺序)-XX:+TraceClassLoading
  1. 堆的分频参数
  • -Xmx1024M 指定最大堆,JVM最多能够使用的堆空间 (超过该空间引发OOM)
  • -Xms128M 指定最小堆,JVM至少会有的堆空间(尽可能维持在最小堆)
  • -Xmn 128M(new) 设置新生代大小
  1. 栈的分配参数
  2. -Xss 每个线程都有独立的栈空间(几百k,比较小)需要大量线程时,需要尽可能减小栈空间
  3. 栈空间太小-----StackOverFlow栈溢出(一般递归时产生大量局部变量导致)
  4. 总结:
  5. 1.根据实际情况调整新生代和幸存代的大小
  6. 2.官方推荐:新生代占堆空间3/8
  7. 3.幸存代占新生代1/10
  8. 4.OOM时,dump出堆到文件,方便排查

· 常用的GC策略,什么时候会触发YGC,什么时候触发FGC?

常见内存回收策略:

  1. 串行&并行
  2. 串行:单线程执行内存回收工作。十分简单,无需考虑同步等问题,但耗时较长,不适合多cpu。
  3. 并行:多线程并发进行回收工作。适合多CPU,效率高。
  4. 并发& stop the world
  5. stop the world:jvm里的应用线程会挂起,只有垃圾回收线程在工作进行垃圾清理工作。简单,无需考虑回收不干净等问题。
  6. 并发:在垃圾回收的同时,应用也在跑。保证应用的响应时间。会存在回收不干净需要二次回收的情况。
  7. 压缩&非压缩&copy
  8. 压缩:在进行垃圾回收后,会通过滑动,把存活对象滑动到连续的空间里,清理碎片,保证剩余的空间是连续的。
  9. 非压缩:保留碎片,不进行压缩。
  10. copy:将存活对象移到新空间,老空间全部释放。(需要较大的内存。)
  • YGC :对新生代堆进行GC: edn空间不足
  • FGC的时机:old空间不足; 2.perm空间不足;3.显示调用System.gc() ,包括RMI等的定时触发; 4.YGC时的悲观策略;dump live的内存信息时(jmap –dump:live)。

四、多线程/并发

· 如何创建线程?如何保证线程安全?

保证线程安全: 竞争与原子操作、同步与锁、可重入、使用valatile防止CPU过度优化。

  1. 继承Thread类,必须重写run方法,在run方法中定义需要执行的任务。
  2. 实现Runnable接口。

 
MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); class MyRunnable implements Runnable{... } 

Note: Java如何创建进程:

第一种方式是通过Runtime.exec()方法来创建一个进程,第二种方法是通过ProcessBuilder的start方法来创建进程。

· 什么是死锁?如何避免死锁

  • 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。
  1. 按同样的顺序访问(锁定)资源
  2. 尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。 3. 使用Atom原子操作(无锁模式)

· Volatile关键字的作用?

volatile特性一:内存可见性,即线程A对volatile变量的修改,其他线程获取的volatile变量都是最新的。volatile特性二:可以禁止指令重排序,避免重排序指令后访问数据错乱.

Volatile可以看做一种轻量级的锁,但又和锁有些不同。

a) 它对于多线程,不是一种互斥(mutex)关系。

b) 用volatile修饰的变量,不能保证该变量状态的改变对于其他线程来说是一种“原子化操作”。

· HashMap在多线程环境下使用需要注意什么?为什么?

  • 并发操作HashMap,是有可能带来死循环以及数据丢失的问题的。当我们调用get()这个链表中不存在的元素的时候,就会出现死循环。
  • HashMap在并发执行put操作时会引起死循环,导致CPU利用率接近100%。因为多线程会导致HashMap的Node链表形成环形数据结构,一旦形成环形数据结构,Node的next节点永远不为空,就会在获取Node时产生死循环。
  • 一句话总结就是,并发环境下的rehash过程可能会带来循环链表,导致死循环致使线程挂掉。
  • HashTable,它并未使用分段锁,而是锁住整个数组,高并发环境下效率非常的低,会导致大量线程等待。同样的,Synchronized关键字、Lock性能都不如分段锁实现的ConcurrentHashMap。

· Java程序中启动一个线程是用run还是start?

start方法:通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。而run方法只是当初普通的方法调用.

· 什么是守护线程?有什么用?

守护线程(即daemon thread)是服务线程,处理后台事务,如垃圾回收等,JVM内部的实现是如果运行的程序只剩下守护线程的话,程序将终止运行,直接结束。所以守护线程是作为辅助线程存在的。应用程序里的线程,一般都是用户自定义线程,用户也可以在应用程序代码自定义守护线程,只需要调用Thread类的t.setDaemon(true);设置一下即可。

· 线程和进程的差别是什么?

  • 进程是系统进行资源分配的基本单位,有独立的内存地址空间; 线程是CPU调度的基本单位,没有单独地址空间,有独立的栈,局部变量,寄存器, 程序计数器等。
  • 创建进程的开销大,包括创建虚拟地址空间等需要大量系统资源; 创建线程开销小,基本上只有一个内核对象和一个堆栈。
  • 一个进程无法直接访问另一个进程的资源;同一进程内的多个线程共享进程的资源。
  • 进程切换开销大,线程切换开销小;进程间通信开销大,线程间通信开销小。
  • 线程属于进程,不能独立执行。每个进程至少要有一个线程,成为主线程

· Java里面的Threadlocal是怎样实现的?

  • 作用:在并发环境下避免竞争、简化编程,高效.在并发环境下提供了一个逻辑上全局的访问点访问线程本地对象
  • 原理: 每个线程内部都有一个hastable作为存储存储器保存线程本地对象集,ThreadLocal实例对象作为key可以被所有线程共享,这个实例对象就是我们所说得全局的访问点,通过它可以访问线程本地对象。所以我们可以这样说:通过ThreadLocal提供了逻辑上全局的线程本地对象。

· ConcurrentHashMap的实现原理是?

在ConcurrentHashMap中,它使用了多个锁代替HashTable中的单个锁,也就是锁分离技术(Lock Stripping)。 每个hash区间使用的ReentrantLock锁。

ConcurrentHashMap源码剖析

· sleep和wait区别

  1. 这两个方法来自不同的类分别是Thread和Object
  2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用.

 
synchronized(x){ x.notify() //或者wait() } 
  1. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

· notify和notifyAll区别

  • wait此方法导致当前线程(称之为 T)将其自身放置在对象的等待集中,然后放弃此对象上的所有同步要求。
  • 被wait的线程,想要继续运行的话,它必须满足2个条件:
  1. 由其他线程notify或notifyAll了,并且当前线程被通知到了
  2. 经过和其他线程进行锁竞争,成功获取到锁了
  • 2个条件,缺一不可。其实在实现层面,notify和notifyAll都达到相同的效果,都只会有一个线程继续运行。但notifyAll免去了,线程运行完了通知其他线程的必要,因为已经通知过了。什么时候用notify,什么时候使用notifyAll,这就得看实际的情况了。

· 什么是条件锁、读写锁、自旋锁、可重入锁?

  1. 条件锁
  2. 在lock中提供了与之关联的条件,一个锁可能关联一个或多个条件,这些条件通过condition接口声明。目的是运行线程获取锁并且查看等待某一个条件是否满足,如果不满足则挂起直到某个线程唤醒它们。condition接口提供了挂起线程和唤起线程的机制;
  3. 读写锁
  4. Java中读写锁有个接口java.util.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWriteLock,它们不是继承关系,但都是基于 AbstractQueuedSynchronizer来实现。ReentrantReadWriteLock的锁策略有两种,分为公平策略和非公平策略

注意: 在同一线程中,持有读锁后,不能直接调用写锁的lock方法 ,否则会造成死锁。。

  1. 可重入(Reentrant)锁
  2. 如果锁具备可重入性,则称作为可重入锁。像synchronized和 ReentrantLock都是可重入锁。假如某一时刻,线程A执行到了method1,此时线程 A获取了这个对象的锁,而由于method2也是synchronized方法,因为可重入,线程A不需要申请加锁即可执行。(可以理解锁的维度是线程,所以已拥有锁不需要再次申请加锁)。不可重入锁(自旋锁):不可以再次进入方法A,也就是说获得锁进入方法A是此线程在释放锁钱唯一的一次进入方法A。
  3. 可中断锁
  4. 可中断锁:顾名思义,就是可以相应中断的锁。在Java中,synchronized就不是可中断锁,而Lock是可中断锁。

· 线程池ThreadPoolExecutor的几个参数说明?

  • corePoolSize 核心线程池大小
  • maximumPoolSize 线程池最大容量大小
  • keepAliveTime 线程池空闲时,线程存活的时间,
  • TimeUnit 时间单位
  • ThreadFactory 创建线程的工厂
  • BlockingQueue任务队列,用于保存等待执行的任务的阻塞队列。比如基于数组的有界ArrayBlockingQueue、,基于链表的无界LinkedBlockingQueue,最多只有一个元素的同步队列SynchronousQueue,优先级队列PriorityBlockingQueue
  • RejectedExecutionHandler 线程拒绝策略
  • 线程池在执行excute方法时,主要有以下四种情况:
  1. 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(需要获得全局锁)
  2. 如果运行的线程等于或多于corePoolSize ,则将任务加入BlockingQueue
  3. 如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(需要获得全局锁)
  4. 如果创建新线程将使当前运行的线程超出maxiumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。
  5. 线程池采取上述的流程进行设计是为了减少获取全局锁的次数。在线程池完成预热(当前运行的线程数大于或等于corePoolSize)之后,几乎所有的excute方法调用都执行步骤2。

”我自己是一名从事了十余年的后端的老程序员,辞职后目前在做讲师,近期我花了一个月整理了一份最适合2018年学习的JAVA干货(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)从事后端的小伙伴们都可以来了解一下的,这里是程序员秘密聚集地,各位还在架构师的道路上挣扎的小伙伴们速来。“

加QQ群:585550789(名额有限哦!)

支付宝高级Java现场面试37题,文末含答案福利! 支付宝现场三面面试题目,文末有福利:阿里经典面试88题目答案 支付宝一面 介绍一下自己。 项目参与的核心设计有哪些 ArrayList和LinkedList底层 HashMap及线程安全的ConcurrentHashMap,以及各自优劣势 Java如何实现线程安全 Synchronized和Lock哪个更好? Hash... 阅读详情

相关推荐

【2024】20个高级 Java 面试问题及答案

在 Java 中,函数式接口是仅包含一个抽象方法的接口,它可以有多个默认或静态方法。随着 Java 8 中 lambda 表达式的引入,函数式接口变得越来越流行。探索函数式接口的概念,讨论它们在实现 lambda 表达式中的作用,并提供它们如何促进函数式编程概念实现的实际例子。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 3400

高级java开发必问面试题

文章目录面向对象什么是面向对象?封装继承多态== 和equals比较hashCode与equals重载和重写的区别Finalspring是什么AOP的理解谈谈你对IOC的理解零拷贝RocketMQ 架构设计RocketMq 事务消息原理RockeMq顺序消息消费原理简述RockerMQ持久化机制RocketMQ如何保证不丢消息消息发送消息消费Mysql索引的基本原理mysql聚族和非聚族索引的区别业务系统里面的sql耗时,慢查询最左前缀原则是什么Innodb是如何实现事务的 面向对象 什么是面向对象? 对比

evanYang的博客 1万+

Q&A | ZStack替代VMware实问实答

ZStack替代VMware实问实答

zstack_org的博客 1800

Java高级开发面试题整理

每个工作线程都有自己的工作内存(Working Memory),工作内存中保存了工作线程需要用到的变量的主内存的副本,线程对变量的所有操作都必须在工作内存中完成,不能直接读写主内存中的变量(volatile关键字修饰的变量也有副本),工作线程的工作内存是互相不访问的,访问其他线程中的变量需要通过主内存来完成。所谓的阻塞队列是指当队列是空的,获取元素的线程会被挂起直到其他线程往队列添加新的元素,反之当队列是满的添加元素的线程会被挂起直到队列被移除一个或多个元素或被清空;所以悲观锁适用多写的场景。

User_xiangpeng的专栏 3723

FileZilla Server 1.2.0 TLS证书过期问题

FileZilla Server TLS证书过期后重新生成

Wigle的备忘录 7523

树莓派入门教程 - 0 - 准备篇 - 0.0 SD卡制作树莓派系统镜像启动盘 开机

电脑需要提前安装的工具: sd卡格式化工具SDFormatter,官网下载链接:https://www.sdcard.org/downloads/formatter/ 镜像烧录工具Win32 Disk Imager,官网下载链接:https://win32diskimager.download/ 使用到的硬件: 一张容量大于等于16GB的TF卡 + 读卡器; 树莓派板卡。3B、3B+、4B等各型号均可,带有 HDMI接口即可。 HDMI接口的显示屏。 鼠标、键盘、电脑。 1....

Mark_md的博客 6971

20个高级Java开发面试题及答案!

在了解什么是 Java 内存模型之前,先了解一下为什么要提出 Java 内存模型。之前提到过并发编程有三大问题CPU 缓存,在多核 CPU 的情况下,带来了可见性问题操作系统对当前执行线程的切换,带来了原子性问题译器指令重排优化,带来了有序性问题为了解决并发编程的三大问题,提出了 JSR-133,新的 Java 内存模型,JDK 5 开始使用。简单总结下Java 内存模型是 JVM 的一种规范定义了共享内存在多线程程序中读写操作行为的规范。

2401_89221445的博客 1万+

大模型新闻摘要生成质量评估工具

大模型新闻摘要生成质量评估工具 关键词:大模型、新闻摘要、质量评估、自然语言处理、算法 摘要:本文将探讨大模型新闻摘要生成质量评估工具的设计与应用。首先介绍大模型新闻摘要生成的背景和问题,然后深入分析质量评估的难点和重要性,接着介绍大模型的

AI天才研究院 827

20个高级Java面试题汇总

得到Calendar类实例的最好办法是在Calendar中使用getInstance() static方法。在Calendar对象上设置日(day),月(month)或年(year)不难。请看下面例子中的求和方法。此方法可以调用1个int参数,或2个int参数,或多个int参数。用编程的方式,我们可以要求(记住这只是一个请求——不是一个命令)JVM通过调用System.gc()方法来运行垃圾回收。通过函数第一行代码中参考变量calendar,在堆上创建了GregorianCalendar类的一个对象。

2301_78145658的博客 4614

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

MHD0815的博客 494

手搓UDS Bootloader|全网独家复现0x10诊断会话控制、详解会话跳转规则与S3超时机制、助力ECU在线刷写、固件迭代、车规安全升级落地

在车载UDS诊断(ISO 14229)与Bootloader固件升级架构中,0x10诊断会话控制服务是所有高级诊断、固件刷写功能的前置核心与权限管控入口,属于UDS基础必实现服务。车载ECU通过分级会话模式,隔离常规故障诊断、高级标定、固件重编程等高、低权限操作,从协议层面保障车载电控系统的安全性与稳定性。多数嵌入式开发者开发UDS Bootloader时,仅简单实现会话切换报文应答,未吃透会话强制跳转规则、S3安全超时机制、会话权限绑定、APP在线刷写跳转逻辑。

getusushu的博客 465

java高级面试题总结

目录1、java基础2、数据库3、java多线程4、jvm、java内存模型5、java框架(spring boot,sprint cloud)6、中间件7、算法8、网络 1、java基础 ###hashmap原理?扩容 ##arraylist原理?扩容 ##jdk1.8新特性? 2、数据库 ##mysql索引优化 https://www.cnblogs.com/qlqwjy/p/8592043....

weixin_40027906的博客 6100

Linux系统之部署经典魔塔小游戏

Linux系统之部署经典魔塔小游戏

jks212454的博客 1807

Java高级面试问题大全及答案大全

继承是指子类可以继承父类的属性和方法,实现代码的复用。本文详细介绍了Java高级面试题及答案,涵盖了Java基础知识、集合框架、多线程、I/O、Web开发和框架等方面。答:Java中常用的集合类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。答:Spring框架的优点包括:轻量级、松耦合、强大的AOP支持、声明式事务管理、方便的与其他框架整合等。答:Java具有以下特点:跨平台、面向对象、安全性高、简单易学、性能优越、多线程支持和丰富的类库。

小畅的博客 6110

zynq的vitis工程烧录到Winbond(华邦)型号W25Q256JVEQ的QSPI FLAHS

vitis2023.1直接支持W25Q256JVEQ。

FPGA艺术家的博客 674

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java面试场景题及答案总结(2025版持续更新)

本文整理了2025年Java面试中最新的高频场景题及参考答案,涵盖并发编程、集合框架、JVM、Spring框架、数据库、设计模式等多个方面。实际面试中,面试官可能会根据你的回答进行深入追问,建议不仅要掌握这些解决方案,还要理解其背后的原理和设计思想。欢迎在评论区留下你遇到的Java场景题,本文将持续更新完善。

2501_91715693的博客 6259

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2019史上最全java面试题题库大全800题含答案(面试宝典)

2019史上最全java面试题题库大全800题含答案(面试宝典) 1、 meta标签的作用是什么 2、 ReenTrantLock可重入锁(和synchronized的区别)总结 3、 Spring中的自动装配有哪些限制? 4、 什么是可变参数? 5、 什么是领域模型(domain model)?贫血模型(anaemic domain model)和充血模...

技术研究中心 5615

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java高级面试问题及答案

以下是几个Java领域的高级面试问题及其回答,旨在帮助候选人展示他们的专业知识和技能。

Nekosann的博客 1396

Java面试题及答案(2021年Java面试题大全带答案)

Java面试题及答案(2021年Java面试题大全带答案) Java面试题及答案【最新版】Java高级面试题大全(2021版),发现网上很多Java面试题及答案整理都没有答案,所以花了很长时间搜集,本套Java面试题大全,Java面试题大汇总,有大量经典的Java面试题以及答案,包含Java语言常见面试题、Java工程师高级面试题及一些大厂Java开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习! Java中级面试题及答案大全(2021年Java面试题答案大汇总) 01、为什.

架构师专栏 3116

java面试题高级_Java高级面试题整理(附答案)

javajava8java开发Java高级面试题整理(附答案) 这是我收集的10道高级Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉得很难回答。1...

weixin_31925745的博客 9497

三面阿里,四面美团,2个月成功拿下Java高级开发岗!面试题及答案分享!

面试流程建议:阿里三面通常首轮考基础,二轮考深度(如JVM和并发),三轮HR面;美团四面可能增加系统设计轮。提前刷LeetCode和复习《Java核心技术》。通用技巧基础扎实:熟记OOP、集合、多线程。代码能力:多练习手写算法(如排序、树遍历)。项目复盘:准备2-3个技术项目案例,突出难点和解决方案。行为问题:真诚回答,体现团队合作。资源推荐:书籍《Effective Java》,在线平台牛客网、LeetCode。

程序员高级码农的博客 1094
上一篇: 高级Java开发面试常用题的答案1
下一篇: Java大神进阶之路!每一位程序员值得借鉴!
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值