面试记录
一.JAVA面试问题
1.AOP的原理是什么?
核心基于:java设计模式–代理模式
基于 JDK的代理
静态代理:为每个业务定义一个接口,此接口用于定义业务的方法,为此业务编写实现类,好处是灵活方便,随意添加功能。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
动态代理:基于实现InvocationHandler接口的invoke方法的动态处理器和反射实现。优点运行时才去操作,缺点逃不过interface的桎梏。
基于CGLIB代理
用于没有接口的类使用,CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。
Spring Aop
基于JDK的动态代理实现有接口类的aop,对于没有接口的类使用CGLIB代理。
2.left join right join inner join outer join on where
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
inner join(内连接),在两张表进行连接查询时,只保留两张表中完全匹配的结果集。
left join,在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
right join,在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
3.java匹配2M字符串中的内容
IndexOf:返回第一次出现的指定子字符串在此字符串中的索引。
正则表达: 这里用到的是Pattern 和 Matcher ,pattern是一个编译好的正则表达式,而Mather是一个正则表达式适配器,Mather的功能很强大,所以我们一般用pattern 来获取一个Matcher对象,然后用Matcher来操作正则表达式。
split 方法:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。将分离的字符串放到一个数组中,数组的长度-1为子串在父串中的匹配个数。
KMP,加上缓存+多线程
4.浅拷贝 深拷贝
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。 实现Cloneable接口。
深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。 用对象的clone()方法。