2026/3/18 3:05:12
网站建设
项目流程
宠物网站建站目标,阿里网站空间,免费发布推广信息的软件,wordpress恢复默认设置面试 Java 基础八股文十问十答第二期 作者#xff1a;程序员小白条#xff0c;个人博客 ⭐点赞⭐收藏⭐不迷路#xff01;⭐ 11.什么是反射#xff1f;反射有哪些作用#xff1f;反射在Sping中的体现
(1): 什么是反射?
反射可以在运行时获取到一个类的所有信息#xf…面试 Java 基础八股文十问十答第二期作者程序员小白条个人博客⭐点赞⭐收藏⭐不迷路⭐11.什么是反射反射有哪些作用反射在Sping中的体现(1): 什么是反射?反射可以在运行时获取到一个类的所有信息包括(成员变量成员方法构造器等)反射可以直接操作类的私有属性反射就是把Java类中的各种成分映射成一个个的Java对象(2): 反射有哪些作用?获取类对应的字节码的对象 对象.getClass() Person.class Class.forName(“类的全路径”) 第三种是最安全性能最好反射可以获取一个类的所有信息比如包名类名构造器方法成员变量 可以操作私有属性和私有方法(3): 反射在Spring中的体现SprignIOC控制反转利用工厂模式反射xml解析(配置文件)利用Class.forName(“类的全路径”).newInstanceBean注入组件就是利用反射代理模式从容器中拿取一般会写getBean(“指定类名称”)或者是getBean(“类名称”返回的Bean类型)单元测试。JUnit等单元测试框架可以使用反射机制在运行时动态地获取类和方法的信息实现自动化测试。12.为什么要使用克隆? 怎么实现对象克隆? 克隆有几种方式和它们的区别(1): 为什么要使用克隆?业务逻辑中存在想要对一个对象进行复制但又不想更改原有的对象比如DTO操作中将POJO中的属性拷贝到DTO中(2): 怎么实现对象克隆?实现Cloneable接口重写clone方法实现Serializable接口通过对象的序列化和反序列化实现克隆属于深拷贝的克隆对象转换字节流然后写入对象流然后从对象流中读取readObject获取对象Spring、Apache都提供了BeanUtils来拷贝对象属于浅拷贝推荐使用Spring自带的BeanUtils效率更高(3): 克隆有几种方式和区别浅拷贝 克隆基本数据类型当克隆引用类型时克隆对象的引用类型改变会导致原来的对象也发生改变因此当克隆存在引用类型的属性时推荐采用深拷贝。比如Dept部门中有Emp员工的情况深拷贝 克隆基本数据类型和引用类型并且互相隔离互不影响。浅拷贝可以直接采用clone(),或者用BeanUtils深拷贝可以重写clone()方法但当属性类型比较多层级深的时候不推荐。可以采用第二种方法序列化和反序列化当然类要实现Serializable接口。13.常见的运行时异常有哪些?NumberFormatException 数字转换异常ArrayIndexOutofBoundsException 数组下标越界异常NullPointerException 空指针异常ArithmeticException 算术逻辑异常ClassCastException 类型转换异常14.String,StringBuffer,StringBuilder之间的区别和联系首先String类是final修饰不可继承底层维护了private final char value[] 属性因此是常量不能修改其引用地址,但是单个字符内容是可以发生改变其实就是常量池和堆String修改内容会导致大量副本残留因此效率会降低。StringBuffer是线程安全的因为有synchronized修饰底层用的和StringBuilder一样的AbstractStringBuilder的append。StringBuilder是线程不安全的适合单线程情况下使用但速度最快。效率对比: StringBuilderStringBufferString15.重写和重载的区别和使用场景重写: 是建立在继承关系上的子类在继承父类的基础上可以增加新的功能使用场景:在不修改原方法的基础上对方法进行扩展和增加例如CGLIB实现动态代理(SpringBoot2.x),SpringBoot1.0和Spring5,AOP还是使用的是JDK动态代理但JDK动态代理有局限性必须要有接口。但CGLIB不存在这个问题代理对象无论是赋值给接口还是实现类这两者都是代理对象的父类。重载:重载是多态的体现一个类中处理不同类型的参数可以用重载比如构造器重载方法重载16.实例化对象有哪几种方式直接newclone()克隆反射机制 Class.forName(“类的全路径”).newInstance()对象的序列化和反序列化利用对象流17.类什么时候会被加载创建对象实例(new)创建子类对象实例时父类也会被加载使用类的静态成员属性的访问或赋值或方法的调用)静态常量在访问时不会触发类的加载机制常量在常量池本质上没有直接引用到定义常量的类静态常量存储在元数据区(JDK1.8)的静态常量池和运行时常量池并列。当子类引用父类的静态字段不会触发子类的类加载当通过数组来定义引用类不会触发该类的类加载机制,数组在编译时不能确定元素类型只有在运行时才能确定元素类型。18.什么是双亲委派模型双亲委派模型就是加载类的时候先请求其父类加载器去加载如果父类加载器无法加载类再尝试自己去加载类。如果都没加载到就抛出异常。好处:使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系从而使得基础类得到统一通过这种层级关可以避免类的重复加载当父亲已经加载了该类时就没有必要子ClassLoader再加载一次避免了多份同样字节码的加载。安全避免核心类被修改java核心api中定义类型不会被随意替换假设通过网络传递一个名为java.lang.Integer的类通过双亲委托模式传递到启动类加载器而启动类加载器在核心Java API发现这个名字的类发现该类已被加载并不会重新加载网络传递的过来的java.lang.Integer而直接返回已加载过的Integer.class这样便可以防止核心API库被随意篡改。19.HashMap和HashTable有什么区别?HashMap是JDK1.2引入的线程不安全HashTable是JDK1.0引入的线程安全HashMap中允许键和值为Null而HashTable不允许HashTable直接使用对象的hashcodeHashMap重新计算hash值高低16位异或HashMap没有HashTable的contains方法改为containsKey和containsValueHashTable默认容量为11HashMap为16HashTable扩容机制为11乘21,HashMap为16乘2HashTable继承DictionaryHashMap继承AbstractMap不建议使用HashTable,在多线程环境下JDK1.5引入ConcurrentHashMap,在HashMap的基础上增加线程安全性保障20.HashMap的实现原理初始化大小默认16,2倍扩容机制负载因子0.75HashMap在JDK1.7中存储结构采用数组链表。HashMap采取Entry数组来存储key-value每一个键值对组成了一个Entry实体Entry类实际上是一个单向的链表结构它具有next指针指向下一个Entry实体以此来解决Hash冲突的问题。HashMap在JDK1.8中采用数组链表红黑树当链表长度大于等于8并且数组长度大于等于64的时候进行树化如果数组长度不大于64仅进行正常的数组扩容前后端项目 Gitee Github 累计 3000 Star10W浏览量⭐点赞⭐收藏⭐不迷路⭐智能 AI 旅游推荐平台https://github.com/luoye6/vue3_tourism_frontend智能 AI 校园二手交易平台https://github.com/luoye6/vue3_trade_frontendGPT 智能图书馆https://github.com/luoye6/Vue_BookManageSystem