拷贝的实现方式
- 实现cloneable接口,重写clone方法。
- 直接调用super.clone的为浅拷贝
深拷贝和浅拷贝的区别
- 浅拷贝,如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
- 深拷贝,在拷贝引用类型成员变量时,为引用类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。
StringBuffer和StringBuilder
StringBuffer方法都用synchronized修饰,为线程安全,StringBuilder不同
transient有什么用
transient修饰的属性不应该被序列化(可以通过重写序列化方法来打破)
Arrays.sort原理
- 当数组长度大于286时使用归并排序
- 当数组小于47时使用插入排序
- 其他使用双轴快速排序
如果java进程不见了,如何排查
- linux系统/var/log/message下查看是否被系统杀死
egrep -i 'killed process' /var/log/messages
- 启动参数一般有配OOM时打印系统快照,所以还可以通过查看OOM时的系统快照来定位原因。
重写与重载
重写遵循两小一大一同
- 返回值小于或等于父类
- 抛出异常小于或等于父类
- 访问权限大于父亲
- 参数列表和方法名必须与父亲相同
重载 - 方法名相同
- 参数不同
基本的数据类型及占用的字节
- byte 1字节
- int 4字节
- short 2字节
- long 8字节
- double 8字节
- float 4字节
- boolean 1字节
- char 2字节
Class.forName()和ClassLoader. loadClass的区别
- ClassLoader. loadClass,仅仅将类加载到JVM,不执行后续的连接和初始化,即不执行static块代码,static参数不被初始化。
- Class.forName(),反之。2
什么是反射机制
- 对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意一个方法和属性;
- 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射机制使用的场景
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
反射的使用步骤
- 获取class对象(Class.forName、object.getClass、Object.class)
- 获取需要调用的class对象方法(class.getMethod)
- 反射方式创建对象实例(class.newInstance)
- 反射方式执行对象方法(method.invoke)