
集合ArrayList为什么new ArrayList时建议指定初始化容量值如果设置的初始值合适就可以避免数组扩容因为数组扩容耗费内存资源。为什么扩容机制是扩容为原数组的1.5倍内存使用和性能之间的权衡。List是线程安全的吗不是当多个线程同时执行add()导致元素覆盖同时扩容数据丢失解决方式使用synchronized 代码块包裹操作使用CopyOnWriteArrayListCopyOnWriteArrayList 的实现原理首先CopyOnWriteArrayList内部也是用数组来实现在向CopyOnWriteArrayList添加元素时会复制一个新数组写操作在新数组上进行度操作在原数组上进行读写分离的设计并且写操作会加锁防止出现并发写入时元素覆盖问题写操作结束后会把原数组指向新数组优点不加锁提升性能适合读多写少缺点比较占内存且实时性不是很好HashMap底层的数据结构JDK1.7数组链表JDK1.8数据链表红黑树工作原理分为三步怎么存存一个 Key-Value 时先算 Key的 hashCode然后用(table.length-1) hash算出应该放在数组的哪个下标位置。冲突了怎么办两个不同的 key 算出来的下标一样就叫哈希冲突。HashMap 的解决方式是用链表把它们串起来。JDK 8 做了优化如果同一个下标的链表长度超过 8 个节点就转成红黑树查找速度从 O(n) 变成 O(log n)。扩容机制当数组使用率达到 75% 时自动触发扩容数组大小翻倍然后把所有数据重新算位置放到新数组中叫做ReshHash。耗性能所以初始化最好给个预估量hashmap不是线程安全若 HashMap 作为多线程的共享数据比如单实例的成员变量、静态变量等那么多线程并发修改 HashMap 时会出现线程不安全的问题。解决用synchronized代码块包裹。使用ConcurrentHashMapJava 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别两个版本的核心区别在于锁粒度JDK 1.7 采用分段锁设计底层把整个数组分成 16 个 segment。每个 segment 里面是一个完整的 HashMap 加一个 lock。不同线程访问不同 segment 完全不争只有访问同一个 segment 时才有锁定。因此其并发最高可达 16。JDK 1.8 移除了 Segment 锁将锁粒度细化到数组。每个槽位的数据结构跟 HashMap 同步变成了“数组 链表 红黑树”。插入时先用 CAS 无锁尝试插入到数组位置如果真发生冲突了才使用 synchronized。而且它只锁链表的头节点其他线程可以照样操作别的 bucket并发大大增加。反射反射允许程序在运行时动态地检查、修改或调用类、方法、属性、构造函数等代码结构的信息。增加程序的灵活性和通用性使用场景框架开发如 Spring 的依赖注入、AOP 的动态代理。动态加载类如插件化架构。序列化、反序列化如 JSON 库将对象转为字符串。测试工具。弊端性能开销大反射操作比直接调用慢。安全风险可能破坏封装性暴露私有逻辑。维护困难反射代码可读性差调试复杂。