马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
涵盖基础概念、计划模式、多线程、JVM原理等关键范畴。
1. HashMap的工作原理及哈希辩论解决
剖析:
- 数据结构:数组+链表/红黑树(Java 8+,链表长度>8转红黑树)。
- 哈希计算:(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)。
- 辩论解决:拉链法(同一桶位链表存储),Java 8优化为链表和红黑树结合。
- 扩容机制:默认容量16,负载因子0.75,扩容时容量翻倍,重新计算索引(index = (n-1) & hash)。
2. synchronized与ReentrantLock的区别
剖析:
- synchronized:JVM内置锁,主动释放,支持锁重入,不可中断,非公平锁。
- ReentrantLock:API级别锁,需手动lock()/unlock(),支持公平锁、可中断、超时等候、条件变量。
- 性能:高竞争场景下,ReentrantLock更优;低竞争时synchronized有JVM优化。
3. JVM内存结构及GC过程
剖析:
- 内存区域:
- 堆:对象实例(分年轻代、老年代)。
- 方法区(元空间):类信息、常量池(Java 8+利用本地内存)。
- 栈:线程私有,存储方法调用栈帧。
- 程序计数器:当火线程执行指令地点。
- GC过程:
- 年轻代:Minor GC(复制算法,Survivor区)。
- 老年代:Major GC/Full GC(标志-打扫/标志-整理)。
4. Java中的强引用、软引用、弱引用、虚引用
剖析:
- 强引用:Object obj = new Object(),不会被GC回收。
- 软引用(SoftReference):内存不足时回收,适合缓存。
- 弱引用(WeakReference):GC时立即回收,如WeakHashMap。
- 虚引用(PhantomReference):无法通过虚引用获取对象,用于跟踪对象被回收的状态。
5. volatile关键字的作用
剖析:
- 可见性:写操作立即革新到主内存,读操作从主内存读取。
- 禁止指令重排序:通过内存屏障(Memory Barrier)实现。
- 不包管原子性:如volatile int i=0; i++仍需synchronized或AtomicInteger。
6. 线程池的核心参数及工作流程
剖析:
- 参数:核心线程数、最大线程数、任务队列、拒绝计谋。
- 流程:
- 任务数 < 核心线程数 → 新建线程执行。
- 任务数 > 核心线程数 → 加入队列。
- 队列满且线程数 < 最大线程数 → 新建线程。
- 队列满且线程数 >= 最大线程数 → 触发拒绝计谋(如丢弃、抛非常等)。
7. 单例模式的线程安全实现
剖析:
- 双重查抄锁(DCL):
- [/code] java
- [code]public class Singleton {
- private volatile static Singleton instance;
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null) {
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
- }
复制代码 - 静态内部类:利用类加载机制包管线程安全。
- 枚举单例:最简便且防反射攻击的方式。
8. Java中的非常体系
剖析:
- Throwable:全部错误和非常的父类。
- Error:系统错误(如OutOfMemoryError),程序无法处理。
- Exception:可处理非常。
- RuntimeException:未查抄非常(如NullPointerException)。
- Checked Exception:编译时查抄(如IOException),必须捕获或声明。
9. 动态署理的实现方式及应用场景
剖析:
- JDK动态署理:基于接口,利用InvocationHandler:
- [/code] java
- [code]Proxy.newProxyInstance(ClassLoader, interfaces, handler);
复制代码 - CGLIB署理:基于类继续,生成子类覆盖方法。
- 应用场景:AOP(日记、事务)、RPC调用、权限控制。
10. ConcurrentHashMap的线程安全实现
剖析:
- 分段锁(Java 7):将数据分段,每段独立加锁。
- CAS + synchronized(Java 8+):
- 插入时利用CAS包管线程安全。
- 链表头节点用synchronized锁住,避免并发修改。
11. Java中的深拷贝与浅拷贝
剖析:
- 浅拷贝:Object.clone()默认实现,复制对象引用(原对象和拷贝对象共享引用类型字段)。
- 深拷贝:需手动实现,通过序列化或递归复制引用对象。
- [/code] java
- [code]public class DeepCopy implements Serializable {
- public DeepCopy copy() throws IOException, ClassNotFoundException {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(bos);
- oos.writeObject(this);
- ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- ObjectInputStream ois = new ObjectInputStream(bis);
- return (DeepCopy) ois.readObject();
- }
- }
复制代码 12. Java 8的Stream API利用场景
剖析:
- 实用场景:集合数据处理(过滤、映射、排序、聚合)。
- 示例:
- [/code] java
- [code]List<String> names = users.stream()
- .filter(u -> u.getAge() > 18)
- .map(User::getName)
- .sorted()
- .collect(Collectors.toList());
复制代码 - 特点:链式调用、延迟执行、并行处理(parallelStream())。
13. 类加载机制及双亲委派模型
剖析:
- 类加载器:
- Bootstrap ClassLoader:加载JRE/lib核心类。
- Extension ClassLoader:加载JRE/lib/ext扩展类。
- Application ClassLoader:加载用户类路径(ClassPath)的类。
- 双亲委派:类加载哀求先委派父类加载器,避免重复加载,包管核心类安全。
14. 如何避免死锁?
剖析:
- 死锁条件:互斥、哀求与保持、不可抢占、循环等候。
- 解决方案:
- 按固定顺序获取锁(如先锁A再锁B)。
- 利用tryLock()设置超时时间。
- 通过JVM检测工具(如jstack)分析线程转储。
15. Spring框架中Bean的作用域
剖析:
- Singleton(默认):单例,容器中唯一实例。
- Prototype:每次哀求创建新实例。
- Request:HTTP哀求生命周期内有效。
- Session:HTTP会话生命周期内有效。
- Global Session:Portlet应用中的全局会话作用域。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |