
JAVA
文章平均质量分 78
java相关面试题
Stay Passion
未来可期!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
如何确保一个集合不能被修改
如果需要不可修改且线程安全的集合,推荐使用。原创 2025-04-01 08:30:00 · 1325 阅读 · 0 评论 -
Java集合的快速失败机制 “fail-fast”
在并发环境下,如果多个线程修改同一个集合,而没有使用适当的同步机制,会导致集合数据的不一致。Java集合的快速失败机制(fail-fast)是指在迭代器遍历集合时,如果集合在此过程中发生了结构性变化(例如,元素被添加或删除),迭代器会抛出。它在修改集合时,实际上是创建集合的副本并在副本上进行操作,因此不会影响正在迭代的集合。机制虽然能有效地阻止并发修改错误,但也可能在多线程环境中引发过多的异常,影响系统的性能。)或通过在修改集合时使用适当的同步机制来避免该异常。当创建集合的迭代器时,迭代器会记录下集合的。原创 2025-04-06 08:30:00 · 321 阅读 · 0 评论 -
简述为什么 HashMap 使用的时候指定容量?
扩容时会创建一个更大的数组(通常是原容量的 2 倍),然后重新计算哈希并迁移数据,消耗大量 CPU 和内存。中,容量(capacity)指的是哈希桶(bucket)的大小,即存储键值对的数组长度。频繁的 rehash 操作会导致大量对象创建和销毁,增加 GC(垃圾回收)的负担。在高并发场景下,rehash 还会引发线程阻塞,影响系统吞吐量。遍历原数组,将每个元素重新计算哈希值,并存入新数组。如果容量过小,键值对会集中在少量的哈希桶中,导致。,如果存入大量数据,会触发多次扩容,导致。JDK 1.8 采用。原创 2025-04-06 08:30:00 · 329 阅读 · 0 评论 -
综合简述 Java 哪些集合类是线程安全的?
请列举 Java 中哪些集合是线程安全的?它们是如何实现线程安全的?在实际开发中,推荐使用 ConcurrentHashMap。修饰,保证了线程安全,但并发性能较低。,JDK 1.8 取消了分段锁,改用。时如果队列满了会自动阻塞,消费者。JDK 1.5 及以上引入了。时如果队列为空也会自动阻塞。,减少锁竞争,提高并发性能。(同步的栈结构,继承自。这些方法返回的集合在。原创 2025-04-06 08:30:00 · 872 阅读 · 0 评论 -
Array 和 ArrayList 有何区别?什么时候更适合用 Array?
数组访问速度更快(O(1)),适用于高性能要求的计算场景,如排序算法、图像处理等。:当元素数量已知且不会动态变化时,使用数组更加高效。在什么场景下更适合使用。(动态数组)都可以用于存储数据,但它们在。,基本类型需要使用其包装类(如。,扩容时新容量 = 旧容量的。手动扩容,或者直接使用。直接支持多维数组(如。等方面存在重要区别。原创 2025-04-05 08:30:00 · 525 阅读 · 0 评论 -
ArrayList 与 LinkedList 的区别?
面试时,结合实际应用场景回答,可以更好地展示你的理解能力!接口的实现,但它们在底层结构、性能、使用场景等方面存在显著区别。,因为插入/删除操作不涉及大规模数据迁移。速度较慢(O(n)),因为可能涉及。需要遍历链表找到位置,速度为。,然后将旧数组元素拷贝到新数组。只存储数据本身,占用内存较少。速度快(均摊 O(1))。需要从头或尾遍历找到元素。但由于扩容机制,可能会有。可能需要移动大量数据。速度快(O(1))。造成一定的内存浪费。原创 2025-04-05 08:30:00 · 452 阅读 · 0 评论 -
ArrayList 和 HashMap 的默认大小
这一默认值在 JDK 1.8 之前是创建时分配的,而在 JDK 1.8 及以后,如果面试官深入追问,你可以结合实际应用场景说明如何优化这两种数据结构的性能!0.75 是时间和空间效率的一个折中值,既减少了碰撞,又避免了频繁扩容。,默认容量为 16,负载因子 0.75,扩容时翻倍,保证查找效率。主要是一个经验值,平衡了空间和性能,避免小数据量时的频繁扩容。旧数据会被拷贝到新的数组中,这个过程开销较大,所以建议在创建。的默认初始大小是多少吗?的场景,建议指定初始容量减少扩容成本。时,预估所需容量,使用。原创 2025-04-04 08:30:00 · 868 阅读 · 0 评论 -
简述HashSet 工作原理
Java 8 之后,当哈希冲突严重时,链表转换为红黑树,提高性能。在实际开发中,如果不需要排序且想要快速去重,推荐使用。实现的,它是一个不允许存储重复元素的集合。的 key,value 则是一个固定的。:如果链表长度超过 8,链表会转换为。,则认为是重复元素,不会存入集合。确保内容相同的对象不会重复存储。计算哈希值,并决定存储位置。才认为是重复元素,不会存储。存储元素,每个元素作为。,因为它基于哈希表实现。,如果需要排序,则选择。原创 2025-04-04 08:30:00 · 484 阅读 · 0 评论 -
简述Java用哪两种方式来实现集合的排序?
Java 8 引入的方法,直接对列表进行排序,性能更优。不需要修改原始类,可以在不同场景定义不同的比较规则。:可以在外部定义比较规则,无需修改类本身。Java 实现集合排序有哪两种方式?,可以按多个字段进行比较。在实际应用中,如果类有。需要修改类本身,实现。原创 2025-04-03 08:30:00 · 305 阅读 · 0 评论 -
Collection和Collections有什么区别?
进行方法同步,使其变为线程安全集合。,不需要创建实例,因此设计为。是 Java 提供的。: 获取最大/最小值。,两者作用完全不同。原创 2025-03-27 09:01:11 · 527 阅读 · 0 评论 -
HashSet和TreeSet有什么区别?
接口的实现类,它们都不允许存储重复元素,但在。存储数据,查询时间复杂度为。依赖 compareTo()依赖 hashCode(),则认为元素相同,不存储。等方面存在显著区别。原创 2025-03-27 08:56:52 · 511 阅读 · 0 评论 -
HashMap和Hashtable有什么区别?
都是 Java 中用于存储键值对的 Map 集合,但它们在线程安全、性能、关键字修饰所有方法,在多线程环境下会影响性能,因为锁是整个。(JDK 1.8 之后),可以实现高效的线程安全。值支持等方面存在显著区别。级别的,每次操作都要获取锁,导致并发能力较弱。,它采用分段锁机制(JDK 1.7 及之前)或。只有一个全局锁,能够大幅提升并发性能。的并发优化,可以阅读。原创 2025-03-27 08:52:21 · 482 阅读 · 0 评论 -
ConcurrentHashMap 的优化与工作原理
只有在访问同一个 Segment 时才会加锁,从而降低锁的粒度,提高性能。,多个线程可以同时访问不同的 Segment,提高并发能力。:在插入元素时,先尝试用 CAS 方式写入数据,避免加锁。标记迁移状态,多个线程共同完成数据迁移,避免死锁。的优化,可以重点讲解 JDK 1.8 版本的。采用了不同的优化方案,我们将分别进行讲解。在 JDK 1.7 和 JDK 1.8,:如果链表长度 > 8,转换为红黑树。:如果桶已存在数据,则遍历链表插入。结构复杂,锁粒度仍然较大,进行标记,避免重复扩容。原创 2025-03-26 08:45:00 · 1215 阅读 · 0 评论 -
HashMap的工作原理是什么
的工作原理,包括底层结构、存储方式、hash 计算、冲突解决方法,以及。:当多个元素的哈希值冲突时,存储在同一个桶中,以链表方式链接。16 是 2 的幂次方,可以提高哈希计算效率,0.75 是。相同,会发生哈希冲突,HashMap 采用。(新节点插在链表头部,先插入的元素在后面)。经过研究,链表长度超过 8 时,红黑树的。的具体过程,能够帮助你更好地回答面试问题。(新节点插在链表尾部,避免环形链表问题)。时,转换为红黑树,提高查找效率。,导致数据丢失或死循环,推荐使用。如果是红黑树,按红黑树规则插入。原创 2025-03-26 08:45:00 · 1305 阅读 · 0 评论 -
为什么Java集合类没有实现Cloneable和Serializable接口
这种设计保持了集合的灵活性,同时避免了潜在的深拷贝和序列化问题。,并不是所有集合都需要序列化,强制所有集合支持序列化不符合设计原则。所有集合都会默认支持序列化,但如果元素不可序列化,就会导致。,不同集合的克隆方式不同,不适合在接口中定义。这样,开发者可以根据具体需求决定是否需要克隆。主要是实现细节,放在具体的子类中更合理。,接口应当只定义核心行为,而非实现细节,可能不需要序列化,而数据库查询结果的。的实现留给具体的子类,而不是强加在。这样,只有需要序列化的集合才实现。,并不是所有集合都需要序列化。原创 2025-03-26 08:45:00 · 1089 阅读 · 0 评论 -
什么是隐式类型转化?
(Automatic Type Promotion or Widening Conversion),是 Java 在处理不同数据类型的运算或赋值时,隐式类型转换(Implicit Type Conversion),又称。参与计算的操作数类型不匹配时,Java 会进行自动类型提升。的数据类型,以避免数据丢失或类型不兼容的问题。低精度的数据类型赋值给高精度的数据类型。,不会导致数据丢失(精度不会降低)。这样的转换不能隐式进行,而需要。是整型,直接转换可能会导致。,可以表示更大的数,例如。范围,因此 Java。原创 2025-03-26 08:45:00 · 1429 阅读 · 0 评论 -
为什么Java里没有全局变量?
在 Java 中,并没有像 C 语言那样的全局变量(Global Variable),这主要是因为Java 语言设计理念和面向对象编程原则所决定的。1. Java 采用面向对象设计Java 是纯面向对象的编程语言,所有的变量和方法都必须属于某个类,而不能直接定义在类之外。成员变量(实例变量、类变量)必须属于类或对象,而不能像 C/C++ 那样定义在全局作用域。方法也必须属于类,不允许单独存在。// C 语言中的全局变量// 全局变量可以直接访问。原创 2025-03-25 17:19:34 · 795 阅读 · 0 评论 -
sendRedirect()和forward()方法有什么区别?
在 Java Web 开发中,和forward()是两种用于页面跳转的方法,它们的本质区别在于跳转方式和是否能共享请求数据。1.(客户端重定向)概述方法会让服务器返回HTTP 302 状态码和新的 URL,通知浏览器重新请求该 URL。这相当于让客户端发起两次 HTTP 请求,因此地址栏会发生变化。定义方法用于客户端重定向,让浏览器重新发送请求到一个新的 URL。语法特点✅地址栏变化:浏览器的地址栏会更新为新的 URL。✅是两次请求:第一次请求访问,服务器返回302,然后浏览器再发送新的请求。✅。原创 2025-03-25 17:14:18 · 690 阅读 · 0 评论 -
什么是 Servlet?常见Servlet容器
负责接收 HTTP 请求、处理业务逻辑并返回响应。在现代 Java Web 开发中,Servlet 通常与。这些容器管理 Servlet 的生命周期,并提供 HTTP 请求的支持。Servlet 是 Java EE 中用于。Servlet 运行在。是 Java EE 规范的一部分,它是一种用于。中,通常用于开发 Web 应用程序。,避免创建多个实例造成的资源浪费。Servlet 的生命周期由。Servlet 主要通过。结合使用,提升开发效率。原创 2025-03-24 09:00:00 · 1849 阅读 · 0 评论 -
throw 与 throws 的区别
都用于异常处理,但它们的作用和用法是不同的。理解两者的区别对于编写健壮的 Java 程序非常重要,面试中也经常考察。,可以是 Java 内置的异常,也可以是自定义异常。在面试中,当被问到 throw。示例 2:方法声明多个异常。原创 2025-03-24 09:00:00 · 672 阅读 · 0 评论 -
Exception 与 Error 的区别
在 Java 中,异常处理机制是非常重要的,它可以帮助程序处理各种可能发生的错误情况。方法 recursiveMethod()递归调用自身,导致栈溢出 StackOverflowError,程序崩溃。及其子类通常不需要(也不应该)被程序捕获,因为它们往往表示系统级问题,而不是程序逻辑错误。,通常是由于代码错误或外部问题(如文件未找到、数据库连接失败)引起的。在 Java 中,所有的异常和错误都继承自。类的子类,但两者有明显的区别。处理,否则代码无法通过编译。,比如内存溢出、栈溢出等。原创 2025-03-23 09:00:00 · 701 阅读 · 0 评论 -
什么是值传递、什么是引用传递?
在 Java 中,方法参数的传递方式通常被讨论为。因此,当我们将对象作为参数传递给方法时,,方法内部对形参的修改不会影响原来的变量。的引用拷贝,它们指向同一个对象,因此。变量接收了这个返回值,从而真正改变了。,但可以通过这个引用来修改对象的内容。尽管 Java 方法参数在传递对象时。示例:让方法真正修改对象引用。,并不存在真正的引用传递。重新指向了一个新对象。Java 中的对象变量。原创 2025-03-22 09:00:00 · 795 阅读 · 0 评论