1、String为什么不可变?
我看过源代码,String类中有一个byte[] 数组,这个数组采用了final修饰,因为数组一旦创建长度不可变,并且被final修饰的引用一旦指向某个对象之后,不可在指向其他对象,所以String是不可变的,
2、StringBuffer为什么是可变的呢?
我看过源代码,StringBuffer/StringBuilder内部实际是一个byte数组,这个byte[] 数组没有被final修饰,StringBuffer/StringBuilder的初始化容量我记得应该是16,当存满之后会进行扩容,底层调用了数组拷贝方法适合于使用字符串的频繁拼接操作。
3、long z = 2147483648;//超出int类型范围,应在后面加L
4、 没有方法体的都是抽象方法吗?错误!
`public native int hashcode();`
这个方法底层调用了C++写的动态链接库程序。
5、
Integer a = 128;
Integer b =128;
System.out.println(a == b); // false
//原理:x变量中保存的对象内存地址和y变量地址是一样的
//java中为了提高程序的执行效率,将[-128~127]之间的所有包装对象提前创建好,放到了一个方法区的“整数型常量池”当中,目的是只要用这个区间的数据不需要再new了,直接从常量池当中取出来。
Integer x = 127;
Integer y = 127;
Systen.out.println(x == y); //true
大公司面试问的问题:
JVM底层的实现原理,内存结构,
JMM(java memory model),java虚拟机的内存模型
多线程
SQL优化,SQL怎么写效率更高,
设计模式
开发原则
小公司面试问的问题:
项目做哪了
你做的哪个模块
这个模块用了多长时间
遇到了什么困难
怎么解决的?
动态代理
实现方式:JDK动态代理,使用jdk中的Proxy,Method,InvocationHandler创建代理对新挨个
JDK动态代理要求目标类必须实现接口
cglib动态代理:是第三方的工具库,创建代理对象,原理是继承,通过继承目标类,创建子类
子类就是代理对象,要求目标类不能是final,方法也不能是final
动态代理的作用:
1)在目标类源代码不改变的情况下,增加功能
2)减少代码的重复
3)专注业务逻辑代码
4)解耦合,让你的业务功能和日志,事务非业务功能分离
怎样理解面向切面编程?
1)需要在分析项目功能时,找出切面;
2)合理的安排切面的执行时间(在目标方法前,还是在目标方法后)
3)合理的安全切面执行的位置,在哪个类?哪个方法?增强功能