Java面试题笔记

415 序列化&反序列化 将Object转为字节流,或反之 普通:实现serializable接口 ˈsɪərɪəlaɪzəbl 使用Jackon,Obj => json格式 416 Java中的不可变类 final 修饰,例如String类 🎉优点: 线程安全 缓存友好 缺点 性能问题,因为不能修改,所有每次状态变化,都需要生成新的对象。 411 多态特性 继承 方法重载,函数名相同,但是函数签名需要有差异(参数类型&数量) 重写,子类重写父类方法,通过父类调用方法时,调用的是子类重写后的函数。 412 Java参数传值是副本还是引用呢? 基本类型是传值副本,int… 引用数据类型是传引用副本。 including:obj,array 425 Java中 包装类型和基本类型 🏷️基本类型 => int long float double … 位于栈上(局部变量的话) ,性能好,但不支持为null (局部变量在栈上,成员变量在堆上,静态字段在方法区) 🏷️包装类型 => 每一个基本类型都对应一个包装类型。包装类型是类,在堆中,支持null JVM内存模型 ❗❗❗内存堆和数据结构堆不是同一个东西(不是堆的结构) 1+--------------------------------------------+ 2| 方法区(Method Area) | ← 线程共享 3| - 类元数据(Class 信息) | 4| - 静态变量(static 变量) | 5| - 常量池(字符串常量等) | 6+--------------------------------------------+ 7 ↑ ↑ 8 | | 9+----------------+ +-----------------+ 10| 栈(Stack) | | 堆(Heap) | ← 线程共享 11| - 局部变量 | | - Java 对象实例 | 12| - 方法调用栈 | | - 数组 | 13+----------------+ +-----------------+ 413 interface & abstract class interface(自上而下) 知晓某一种行为,基于这些行为约束定义的接口, 一些类需要有这些行为的话,需要实现这些接口 abstract class(自下而上): 有许多类,它们有共同点,很多代码可以复用,因此将公共逻辑封装为抽象对象。 100 hashCode & equals & == hashCode用于散列表(hashMap)用于计算hash值,从而计算存储位置; ...

February 19, 2025 · 7 min · 1389 words · LongWei

Java学习笔记

Java 反射 它提供了动态性和灵活性,使得程序可以在运行时动态地加载类、调用方法、访问字段等,而不需要在编译时确定这些操作。 1. 动态加载类 在运行时根据类名动态加载类,而不是在编译时硬编码类名。 – 插件化架构:根据配置文件或用户输入动态加载类。 2. 创建对象 通过反射可以在运行时动态创建对象,即使类的构造函数是私有的。 工厂模式:根据配置动态创建对象。 依赖注入框架:Spring 通过反射创建 Bean 实例。 3. 调用方法 通过反射可以在运行时动态调用对象的方法,即使方法是私有的。 测试框架:JUnit 通过反射调用测试方法。 4. 访问字段 通过反射可以在运行时动态访问对象的字段,即使字段是私有的 序列化和反序列化:通过反射访问对象的字段。 对象关系映射(ORM):Hibernate 通过反射访问实体类的字段。 7. 注解处理 通过反射可以获取类、方法、字段上的注解,并根据注解执行相应的逻辑。 24/4/14 1️⃣ 反射的作用 获取类中的所有信息(e.g.持久化、IDE的代码提示) 1Field[] fields = cls.getDeclaredFields(); 2for (int i = 0; i < fields.length; i++) { 3 fields[i].setAccessible(true); 4 // String name = fields[i].getName(); // 属性名 第一次先生成列名 5 Object value = fields[i].get(obj); 6 bw.append(value.toString()); 7 if (i < fields.length - 1) { 8 bw.append(", "); 9 } 10} 11bw.newLine(); 结合配置文件动态创建对象 1Properties prop = new Properties(); 2 3String filename = "prop.properties"; 4FileInputStream is = new FileInputStream(filename); 5 6prop.load(is); 7 8String classname = prop.getProperty("classname"); 9String method = prop.getProperty("method"); 10String name = prop.getProperty("name"); 11 12Class cls = Class.forName(classname); 13Constructor con = cls.getDeclaredConstructor(); 14Object o = con.newInstance(); 15 16Method setName = cls.getMethod("setName", String.class); 17setName.invoke(o, name); 18 19Method met = cls.getDeclaredMethod(method); 20met.invoke(o); 2️⃣ 获取Class的三种方式 ...

April 19, 2024 · 25 min · 5142 words · LongWei