(一) java基础知识点
- java中==和equals和hashCode的区别: ==比较地址,equals可重写,hashCode是内存地址的散列。为了保证,对象相等时,地址一致。
- 探探对java多态的理解:重载和重写
- String、StringBuffer、StringBuilder区别:StringBuffer 通过synchronized 实现线程安全,StringBuilder单线程中效率高。
- 用StringBuilder, String.format 代替字符串拼接,有利于减少对象创建。
- 什么是内部类?内部类的作用
- 抽象类是否可以没有方法和属性:可以。
- 泛型中extends和super的区别:extends 是上界通配符,兼容子类,不能往里存,只能往外取;super是下界通配符,兼容基类,不影响往里存,但往外取只能放在Object对象里。泛型中 extends 和 super 的区别
- ?和T的区别: T 是一个具体的java类型,?是不确定的java类型。泛型中 extends 和 super 等的区别
- 父类的静态方法能否被子类重写:不能
- 进程和线程的区别:进程是操作系统资源分配的基本单位(运行时分配单独内存空间),而线程是任务调度和执行的基本单位。
- final,finally,finalize的区别:finalize 是对象被回收前会被调用的方法,一般不复写。
- Serializable 和Parcelable 的区别:Serializable消耗大,实现简单,适合存储到设备或者网络传输时使用。Parcelable效率高,实现复杂,适合内存序列化时使用。
- 闭包和局部内部类的区别:闭包包含的自由变量来自于定义闭包的环境。闭包能够将一个方法做一个变量去存储,会导致资源不被回收,实际几乎不用。
- string 转换成 integer的方式及原理:依次读取每个字符,根据进制转换为整数。
(二) java深入源码级
- 哪些情况下的对象会被垃圾回收机制处理掉?
- Java对象的生命周期:创建--应用--不可见(超出作用域)--不可达(不被任何强引用引用)--可收集(Collected)--终结--对象空间重分配。
- Java类的生命周期,指一个class文件从加载到卸载的全过程:加载——验证——准备——解析——初始化——使用——卸载。
- 静态代理和动态代理的区别,什么场景使用?——静态代理:是在java文件编译前,手动写好代理类对象。这样只能代理一类对象,即一类接口的类型。 动态代理是在运行时,通过反射机制实现动态代理 (有JDK动态代理和CGLIB动态代理),并且能够代理各种类型的对象,复用性强,相当于是对静态代理的抽象。面向切面编程。静态代理与动态代理。
- Java的异常体系:Throwable是所有异常的父类,分Error和Exception;Error表示很严重的问题发生了,可以捕获但是不要捕获,因为捕获了也解决不了,这个不是由程序产出的,底层出现问题就让他它挂了吧。
- 解析与分派——Class 文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或者第一次使用的时候就转化为直接引用,这种转化称为静态解析。另一部分将在每次运行期间转化为直接引用,称为动态连接(动态分派)。
- 如何将一个Java对象序列化到文件里:Serializable。
- Java反射:可以在运行时获取和使用类的信息,用invoke 方法。
- Java注解: 对程序代码本身的描述-代码元数据,一种约定的规范,包括格式、意义、作用域等。主要作用:生成文档,代码分析,编译检查。
- 依赖注入:控制反转、依赖注入。把方法实施的主体当参数传入。
- String为什么要设计成不可变的:字符串常量池的需要;允许String 对象缓存hashcode(效率优化);安全性(防止使用过程中改变)。
- JVM: 参考 JVM知识总结