
Java相关面试
文章平均质量分 62
Java基础、集合、JVM、多线程、并发面试题
戚戚其其
这个作者很懒,什么都没留下…
展开
-
Java高频面试题:Java基础
4. 讲一下equals()与hashcode(),什么时候重写,为什么重写,怎么重写?11. String、StringBuilder、StringBuffer有什么区别?12. 什么是序列化?什么情况下需要序列化?序列化在Java中是怎么实现的?7. 谈一谈你对 final 关键字的理解?什么需要用这个关键字来定义呢?13. Java 中的反射是什么意思?14. 什么是动态代理?3. = =和equals有什么区别?5. 讲一下重载和重写的区别?10. 聊一聊你对多态的理解?6. 抽象和接口的区别?原创 2024-07-22 16:26:34 · 701 阅读 · 0 评论 -
Java高频面试题:Java集合
2. ArrayList与LinkedList专题。1. HashMap专题。原创 2024-07-24 15:42:18 · 194 阅读 · 0 评论 -
Java集合:List和Set
其中 List 接口会维护元素的插入顺序,并且允许根据索引进行数据查询和操作。而 Set 接口只强调元素的不可重复性,不保证元素的特定顺序,也不支持索引查询。Set 接口常见的实现类有 HashSet,TreeSet 等,前者底层为哈希表,提供快速的插入,删除和查找性能,但不保证元素的顺序。后者底层为红黑树,元素间可以使用自定义比较器进行排序。List 接口常见的实现类有 ArrayList,LinkedList 等,前者底层为数组,适合随机访问多的场景。后者底层为双向链表,适合插入删除操作多的场景。原创 2024-07-24 14:49:36 · 149 阅读 · 0 评论 -
Java集合:ConcurrentHashMap
JDK 1.8 为了摆脱哈希表中 Segment 个数对并发度的限制,底层采用和 HashMap 类似的实现:数组 + 链表 + 红黑树,加锁用 CAS 和 synchronized 实现。如果槽位不为空,则需要进一步判断其它线程是否在对其扩容,是则协助扩容,不是则使用 synchronized 锁住当前槽位,再进行插入节点操作。任务为 Key,任务的执行状态为 Value,多个线程可以同时查找和更新任务的状态,实现对多任务的控制。原创 2024-07-23 18:55:55 · 256 阅读 · 0 评论 -
Java基础:ArrayList和LinkedList
ArrayList 的默认容量为 10,当需要扩容时,会先申请一个容量为旧容量 1.5 倍的新数组,然后把旧数组复制到新数组中。LinkedList 底层使用双向链表实现的,由于每个节点都含有前驱和后继节点的引用,所以它插入删除时只需修改这些引用,效率要比 ArrayList 高。ArrayList 首先会以 O(1) 时间定位到第 k 个元素,然后将被这个元素分割的两部分复制拼接到一个新数组上,总体为 O。) 时间定位到第 k 个元素,然后 O(1) 时间处理这个元素前后节点的引用,总体也为 O。原创 2024-07-23 18:49:38 · 890 阅读 · 0 评论 -
Java集合: HashMap
这个在源码的注释中有解释,大致意思为:如果元素的哈希值足够随机,理想情况下链表的长度对应的概率符合泊松分布,达到 8 的概率小于千万分之一。JDK 1.7 的 HashMap 底层为数组 + 链表,扩容的 transfer( ) 会遍历原链表中的每个节点,采用头插法将其转移到新哈希表槽位的链表中,这个过程在多线程下会导致新链表中出现环路,并造成某些元素丢失。采用头插法的话,最新插入的数据就会在链表的最前边,根据程序的局部性原理,最近被访问的数据很可能不久之后会再次访问,那么此时可以在 O(1) 时间返回。原创 2024-07-23 15:43:39 · 933 阅读 · 0 评论 -
Java基础:反射
反射就是在 Java 程序运行的过程中,动态获得某个类的方法变量,并调用的技术。反射的缺点主要有两个。如图是类的正常加载过程:反射的原理在于class对象。cr.原创 2024-07-22 16:12:13 · 1118 阅读 · 0 评论 -
Java基础:序列化与反序列化
1:序列化就是指将 Java 对象转换成二进制字节流的过程。当我们需要对某些对象进行时,需要先对它们序列化成二进制字节序列,然后存到数据库或者内存中。或者两个 Java 进程远程通信时,也需要将 Java 对象转换为字节序列才能在网络中传送。首先被序列化的对象一定需要实现 Serializable 或 Externalizable 接口。原创 2024-07-20 13:29:31 · 679 阅读 · 0 评论 -
Java基础:String、StringBuilder、StringBuffer有什么区别?
类还提供了很多修改字符串的方法比如。StringBufferl类(继承自。原创 2024-07-20 13:10:20 · 484 阅读 · 0 评论 -
Java基础:深拷贝、浅拷贝的区别
Java基础常见面试题总结(中) | JavaGuide结论:原创 2024-07-20 12:36:52 · 199 阅读 · 0 评论 -
Java基础:多态
那么在之后的支付代码中,无论用户选择的哪种支付方式,都可以统一用 Payment 来进行具体的 pay 操作。另外,在修改具体的支付逻辑时,也只需单独去微信或者支付宝的类里面去修改,而不用动主逻辑里面的代码,体现出多态的灵活和可扩展性。除了以上说的运行时多态,我还听说过一个有争议的编译时多态,它具体指 Java 中的方法重载,在编译期就根据已知的参数列表,决定了需要调用的方法。拿继承来说,子类必须重写父类的方法,通过向上转型,使用父类类型来调用子类对象的方法,结果是在运行时执行子类中重写的方法。原创 2024-07-20 10:41:16 · 345 阅读 · 0 评论 -
Java基础:String类
String 在源码中使用 char[] 来维护字符序列的,而 char[] 的长度是 int 类型,所以理论上 String 的长度最大为 2^31−1 ,占用空间大约为 4 GB,不过根据实际 JVM 的堆内存限制,编译时,String长度最多可以是2的16次方减2,运行时长度最多可以是2的31次方减1,意思是可以在编译时定义一些短的字符串,运行时可以进行拼接,长一点也可以。除此之外,基于 String 的不可变,Java 使用常量池来尽可能的共享相同的字符串,来节约 String 的存储空间。原创 2024-07-20 01:09:49 · 447 阅读 · 0 评论 -
Java基础:异常
如果有异常,才会去查异常表,再跳转到对应的 catch 块位置去执行,这个过程可能会影响性能。其次,有时多个方法可能会抛出相同类型的异常,如果每个方法都用 try catch 会非常冗余,这时可以在这些方法中只 throw,在调用这些方法的地方整体 try catch,统一进行处理。但是需要考虑一种特殊情况,就是如果 try 块中抛出了异常但没有被 catch 捕获,且此时 finally 中也抛出了异常,那么 finally 中的异常会覆盖掉 try 中的异常,成为这个方法最终抛出的异常。原创 2024-07-19 21:45:38 · 407 阅读 · 0 评论 -
Java基础:final关键字
如果是引用类型,引用指向的地址值不变,但地址的内容可能会变。比如Java的一些核心类库的类的API接口不想被纂改就使用final修饰方法。Java希望String类是不可变的,就使用final修饰String类并且修饰成员变量char[]数组,并且没有提供setter方法,这样就可以确保String类是不可变的。另外,如果有多个线程操作同一个变量,并且这个变量的值不会变化,可以考虑使用final修饰解决线程安全问题。final是Java中的一个关键字,可以用来修饰类、方法、变量。原创 2024-07-19 21:35:44 · 241 阅读 · 0 评论 -
Java基础:抽象和接口的区别?
代码复用和设计规范:抽象类提供了一种机制,允许定义一些基础功能的实现,同时留出抽象方法由子类具体实现。这不仅可以实现代码复用,还能规范子类的行为。例如,定义一个Animal抽象类,其中可以实现一些通用方法如eat和sleep,并留出抽象方法如makeSound供不同的动物类具体实现。限制和规范:抽象类可以定义构造函数,通过构造函数可以完成一些初始化操作,同时可以设定一些类内部的逻辑或状态初始化,这是接口做不到的。单继承的限制:由于Java不支持多重继承,抽象类的使用受到了限制。原创 2024-07-19 18:20:47 · 307 阅读 · 0 评论 -
Java基础:重载和重写的区别?
【代码】Java基础:重载和重写的区别?原创 2024-07-19 18:04:55 · 532 阅读 · 0 评论