Java参数传递与类型差异详解
基本类型传递的是数值本身的拷贝引用类型传递的是引用地址值的拷贝可修改对象属性不可修改原引用指向记忆口诀Java 参数只有值传递问为什么修改引用类型属性会影响原对象答引用类型传递的是地址值的拷贝拷贝地址与原地址指向同一个堆对象通过地址修改对象属性原对象可见仅修改地址指向不会影响原变量记忆口诀同地址改属性同生效问修改方法内的引用为何不影响原变量答方法内引用是原地址的拷贝副本修改副本指向仅改变副本存储值原变量的地址值未发生任何修改二者是独立变量指向互不干扰记忆口诀改副本不影响原引用问什么是 Java 的序列化如何实现 Java 的序列化答序列化是对象转字节流用于存储与传输反序列化可将字节流还原为 Java 对象实现 Serializable 标记接口即可支持序列化由 Java 原生机制自动完成序列化处理记忆口诀对象转流序列化实现 Serializable问Java 序列化中 serialVersionUID 的核心作用是什么答作为序列化类的版本唯一校验标识序列化与反序列化版本必须一致版本不一致会抛出反序列化异常显式声明可避免自动生成的版本差异记忆口诀版本校验 serialVersionUID问类不实现 Serializable 接口会有什么问题答序列化时抛出 NotSerializableException该类对象无法完成序列化与反序列化无法实现对象持久化与网络传输记忆口诀无接口无法序列化问Java 中的反射是什么意思答反射是 Java 运行时的动态操作机制运行时可获取任意类的所有结构信息可动态调用对象方法、修改属性值无需编译期预先知晓类的完整信息记忆口诀运行时动态操控类问Java 反射获取 Class 对象有哪几种方式答Class.forName ()传入类全限定名类名.class直接获取类 Class 对象实例对象.getClass ()继承自 Object 类记忆口诀三法获取 Class 对象问反射中 getXxx 与 getDeclaredXxx 的核心区别答getXxx 仅获取 public 修饰的成员getDeclaredXxx 获取本类所有成员getXxx 包含父类的 public 成员getDeclaredXxx 仅获取当前类成员记忆口诀public 用 get全量 Declared问反射的应用场景有哪些反射有什么优缺点答Spring、MyBatis 等框架底层核心依赖JDBC 驱动加载、配置文件解析与 Bean 装载优点运行时动态扩展程序灵活度高缺点有性能损耗存在权限安全风险记忆口诀框架核心用反射灵活有风险问反射在 Java 框架中的核心作用是什么答无需硬编码动态加载类并实例化对象解析配置自动完成对象属性注入实现动态代理、注解解析等高级功能记忆口诀框架靠反射提灵活度问日常开发为什么不推荐滥用反射答反射调用性能远低于普通直接调用可绕过权限检查破坏代码封装性编译期无法校验运行期易出异常记忆口诀滥用反射有隐患问怎么实现 Java 动态代理答主流实现分为 JDK Proxy 和 CGLIB 两种JDK Proxy 基于接口依赖 Java 反射机制CGLIB 基于继承直接操作字节码生成核心是运行时生成代理扩展目标方法记忆口诀JDK 接口 CGLIB 继承问JDK Proxy 与 CGLIB 动态代理的核心区别是什么答JDK 仅能代理实现了接口的类CGLIB 可代理无接口的普通类JDK 基于反射CGLIB 操作字节码JDK 无额外依赖CGLIB 需第三方包记忆口诀接口 JDK无接口 CGLIB问JDK 动态代理的核心实现步骤是什么答定义目标业务接口与实现类实现 InvocationHandler编写增强逻辑用 Proxy.newProxyInstance 生成代理对象代理对象调用方法触发增强逻辑记忆口诀接口 Handler 生成代理问String 为什么要设计为不可变类答支持字符串池共享节省内存提升性能天然线程安全无需额外同步处理哈希值可缓存优化哈希容器性能保障数据安全避免状态被恶意篡改记忆口诀不可变安全高效省内存问String 的不可变性是如何实现的答String 类被 final 修饰无法被继承底层 value 数组为 private final 修饰无对外修改 value 的公共方法内容修改均返回新 String 对象记忆口诀final 封装保不可变问String 是绝对不可变的吗答常规语法层面 String 是不可变的可通过反射修改底层 value 数组反射修改破坏封装不推荐使用记忆口诀反射可破 String 不可变问String、StringBuilder、StringBuffer 的区别是什么答String 不可变修改新建对象后两者可变String、StringBuffer 线程安全Builder 非安全性能StringBuilder StringBuffer String适用场景不同按需选择对应实现类记忆口诀可变安全性能分三类问不同业务场景如何选择这三个字符串类答少量固定字符串操作直接使用 String单线程频繁拼接优先选 StringBuilder多线程并发操作必须用 StringBuffer记忆口诀单 Builder 多 Buffer 少 String问StringBuffer 和 StringBuilder 的核心区别是什么答StringBuffer 方法加同步锁线程安全StringBuilder 无同步处理非线程安全单线程场景下 Builder 性能更优记忆口诀Buffer 安全Builder 更快问String str i 与 String str new String (i) 一样吗答二者不一样内存分配方式完全不同字面量赋值对象分配在字符串常量池new String 创建对象分配在堆内存中二者引用地址不同 比较结果为 false记忆口诀字面量常量池new 在堆内存问为什么相同字面量赋值的 String 用 比较为 true答字面量赋值优先复用常量池已有对象相同字面量共享常量池同一内存地址引用地址一致 比较结果为 true记忆口诀常量池复用同地址问日常开发推荐哪种 String 赋值方式答优先使用字面量直接赋值的方式可复用常量池对象节省内存开销避免 new String 创建多余临时对象记忆口诀优先字面量赋值问接口和抽象类有什么区别答定义关键字接口用 interface抽象类用 abstract实现关键字接口 implements抽象类 extends继承规则单继承抽象类可多实现接口成员修饰符接口仅 public抽象类无限制记忆口诀接口多实现抽象单继承问接口和抽象类的成员约束有什么不同答接口属性默认 public static final不可修改接口方法默认 public abstract仅定义规范抽象类成员修饰符无强制限制抽象类可包含带实现的普通方法记忆口诀接口限 public抽象无限制问开发中如何选择接口与抽象类答定义行为契约规范优先使用接口提取公共代码复用优先用抽象类需多行为扩展使用接口多实现模板方法场景优先使用抽象类记忆口诀契约接口复用抽象类