博主个人博客网站:文客
这个系列会长期更新!
如果你想每天和我打卡面试题、交流技术,可以关注一下我的个人博客网站:文客,我会每天在这里更新技术文章和面试题,也会及时收到大家的评论与留言,欢迎各位大佬来交流!
深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
浅拷贝:在堆中创建一个新的对象(拷贝对象),如果原对象中有引用类型的成员时,那么原对象和拷贝对象共享这些内部对象。
深拷贝:在堆中创建一个与原对象一模一样的对象,包括内部对象也一样。
引用拷贝:简单来收就是,不同的引用指向同一个对象
字符串拼接用“+” 还是 StringBuilder?
首先当字符串用“+”拼接时,其实底层是使用的StringBuilder做拼接工作,拼接完后再调用toString()方法转换为String对象
当在循环中用“+”进行字符串拼接式,每次拼接都会创建一个StringBuilder对象,重复的创建对象会影响程序的性能。然而如果我们直接用StringBuilder对象进行字符串拼接则不会出现这些问题。
所以建议使用StringBuilder进行字符串拼接
字符串常量池的作用了解吗?
字符串常量避免了字符串的重复创建,减少了程序的内存消耗,同时也提升了程序的性能。
包装类型的常量池技术了解么?
Java基本类型的包装类型,很多都实现了常量池,也就是缓存技术。
比如Byte、Short、Integer、Long这四种包装类型缓存了[-128127]范围的整数。Character缓存了[0127]范围的整数。Boolean直接返回true或者false
Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
Java泛型是JDK5引入的新特性,它提供了在编译时进行类型监测的机制,通过这个机制,程序员可以在编译时发现非法的类型。泛型的本质是参数化类型,也就是操作的数据类型通常被指定为参数的形式。
Java泛型的使用可以是:泛型类、泛型接口、泛型方法
类型擦除:Java的泛型其实是伪泛型,因为Java程序在运行时,所有的泛型信息都会被擦掉,也叫做类型擦除
常用的通配符:T——Type、E——Element、K——Key、V——Value、?——不确定的类型
何为反射?
反射是框架的灵魂。
反射为开发者提供了在运行时可以动态分析类和执行类中方法的能力。
通过反射,我们可以得到类中的任意一个方法和属性,并且可以调用它们。
反射机制优缺点
优点:是框架的灵魂,为各种框架提供开箱即用的功能提供了便利
缺点:有一定的安全问题,比如反射会无视编译时泛型的安全检查。同时反射的性能也稍差。
反射的应用场景
很多框架底层都是通过反射实现的,比如SpringBoot、Spring等,反射为框架提供开箱即用的功能提供了便利
我们现在经常使用注解开发,使用注解极大地提升了我们的编码效率,其实很多注解都是通过反射,在运行时动态分析,然后做进一步的处理。
动态代理是基于什么原理?
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。
实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。
JDK Proxy 和 Cglib 的对比
JDK Proxy 的优势:
- JDK Proxy的依赖关系比较小,更便于开发和维护,同时JDK Proxy是JDK提供的支持,会比第三方库的cglib更稳定一些
- 与JDK版本同步,无需考虑版本带来的问题
- 代码实现简单。
基于类似 cglib 框架的优势:
- cglib不需要代理对象和原对象必须为实现关系
- 只操作我们关心的类,而不必为其他相关类增加工作量
- 性能更高
说一下注解
注解是JDK5引入的新特性,它可以看作是特殊的注释,可以用来修饰类、属性和方法
注解只有被解析之后才会生效,常见的解析方法有两种:
- 编译时扫描。比如@Override注解,编译器在扫描到时,会监测当前方法是否重写了父类的方法
- 运行时通过反射处理。比如很多框架中带的一些注解@Value、@Component都是通过反射来解析的
博客原文地址
每日面试题打卡(基础篇)——Day3