来自牛客
1. javase
1.1. 抽象方法
- 抽象方法只有声明,没有具体实现。
- 抽象方法的abstract和public可以省略,并且不能是private,static和final的。
- 抽象方法主要用于继承后重写。
- 抽象方法只能存在于抽象类和接口中。
1.2. 抽象类
- 抽象类不能实例化。
- 抽象类可以包含抽象方法和具体方法。
- 子类必须实现抽象父类的所有抽象方法,否则子类也为抽象类。
1.3. 接口
- 接口中只有常量(public static final)和抽象方法,新版本新增默认方法和静态方法。
- 一个类可以实现多个接口。
- 无构造方法。
1.4. final
- 表示变量不可变,方法不能重写,类不可继承(如string类)。
- 修饰的引用变量不能指向其它对象,但是对象内部可以改变。
- 使用场景:关键方法不被子类修改;工具类通用方法;私有方法默认final。
1.5. static
- static声明的东西属于类,而不是实例对象,通过类名调用。
- static方法只能访问静态成员变量和静态方法。
1.6. 内存空间
- java内存空间5部分:栈,堆,本地方法栈,方法区,程序计数器。
- 堆heap:所有new的东西都在堆里;gc管理的区域;所有线程共享堆内存。
- 栈stack:每个方法调用对应一个栈帧;无需gc;每个线程独立分配栈。
- 方法区:存储类元数据(父类名,全限定名等),运行时常量池,静态变量,即时编译代码。
1.7. 权限管理
- 访问权限是本类中的成员对其他类的可见性。
- public:任何地方可见
- protected:类内,同包,子类可见
- 包访问(默认):类内,同包可见
- private:类内可见
1.8. String
- string不可变,stringbuffer和stringbuilder可变。
- string和stringbuffer线程安全,stringbuilder非线程安全。
- string性能低,stringbuffer性能中,stringbuilder性能高。
- 少操作用string,单线程用stringbuilder,多线程stringbuffer。
1.9. object类
- object是所有对象的父类。
- object中有tostring(),equals(),hashcode(),getclass(),clone()等默认方法。
1.10. equals()
- ==基本类型比较值,引用类型比较内存地址;equals()默认比较内存地址,和==相同。
- equals()经常重写后比较实际值,而不是地址。
1.11. hashcode()
- 重写equals()就要重写hashcode(),若equals()相等则hashcode()必须相等(反之不一定成立)。
- hashcode()计算对象哈希值,用于哈希表快速定位。
1.12. 包装类
- 每种基本数据类型都有对应的包装类,从而支持面向对象操作。
- 包装类的作用:支持对象操作,可以调用方法;可以为null;提供了工具方法,如类型转换,字符串处理等。
- 自动装箱是基本数据类型自动转换为包装类对象;自动拆箱是包装类自动转换为基本数据类型。
- 包装类会缓存一些常用对象,如-128到127。
- 包装类不可变,改变值后是返回新对象。
- java集合(如arraylist,hashmap)只能存储类对象,不能存储基本数据类型。
- 不能有默认值,避免默认值的影响。
1.13. 集合
- list有序可重复,set无序不可重复,queue队列,map映射关系。
- 集合只能存储引用类型,不能存储基本数据类型。
- 集合优点(对比数组):可以存储不同类型元素;长度不固定;提供了许多操作方法。
- 线程安全的集合:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue和ConcurrentSkipListSet;非线程安全的集合:HashMap、ArrayList、LinkedList和HashSet。
1.14. HashMap
- hashmap的底层是数组+链表/红黑树,数组的每个元素就是链表/红黑树。
- 链表长度>=8并且数组长度>=64时,链表转换成红黑树。
- 默认容量16,负载因子0.75,元素数量超过容量x负载因子时数组扩容成2倍。
1.15. 重载和重写
- 重载:在同一类中,方法名相同,但参数列表不同(类型,数量,顺序),与返回值无关。编译时多态。
- 重写:子类和父类中,方法名,参数列表和返回值都必须相同,访问权限不能缩小,异常等级不能扩大。运行时多态。
1.16. 泛型
- 在类,接口和方法中定义类型占位符,编译时检查,避免了运行时的强制类型转换。
- 类型擦除:java的泛型只存在于编译阶段,运行时没有泛型类型的对象,所有的对象都是普通类的。
1.17. 反射
- 反射是在运行时检查和修改代码的能力,可以获取运行时类的信息,存在类的属性和方法。
1.18. 拷贝
- 引用拷贝:复制对象地址,新旧变量指向同一对象。
- 浅拷贝:常用clone()重写,复制新对象和基本数据类型,引用类型仍指向原对象。
- 深拷贝:新旧对象完全独立。
1.19. 序列化
- 序列化:将对象转换成字节流或文本等方便存储和传输的格式;反序列化:将序列化的数据转换成对象。
- 常见序列化格式:json、xml、protobuf
2. javaweb
2.1. servlet
- servlet的工作是接收前端请求,查询数据库,生成动态网页内容,没有servlet只能返回静态网页。
2.2. tomcat
- 对servlet的封装。