Java SE 补遗
1.JDK和JRE的区别
- jdk:开发者工具包(使用的话需要在本机配置环境变量)
- jre:java的运行环境
2.编译型语言(对比解释型语言)
- java属于编译型+解释型语言
- 此外java属于静态准动态语言
- java是强类型语言
3.注释
- 行内注释:
//
- 多行注释:
/* */
- 文档注释:
/** */
4.数据类型
- 8大基本数据类型
- 引用数据类型(非基本类型一般都是引用类型)
- 类
- 接口
- 数组
5.类型转换
- 自动类型转化
- 低转高(子类转父类)
- 强制类型转化
6.变量与常量
-
作用于
- 类变量(又称作静态变量)
static
- 实例变量(又称成员变量)
static
- 局部变量(局部变量是方法中或者局部块中声明定义的变量或方法,没有默认初始值,赋值后才能使用)
- 类变量(又称作静态变量)
-
常量(一经定义不可修改)
final int M = 1001;
成员变量(实例变量) 局部变量 静态变量(类变量) 定义位置 类中、方法外 方法中/方法形式参数 类中、方法外 初始化 默认初始值(一般是0) 无默认初始值,需要赋值后才可使用 默认初始值(一般是0) 调用方式 对象调用 / 对象调用/类名调用 声明周期 与对象共存亡 与方法共存亡 与类共存亡 -
命名规范
- 见名知意
- 驼峰命名
- 类 首字母大写,驼峰命名
- 常量 大写+下划线
- 不要使用拼音命名
7.运算符(这里只列举个别)
- 拓展运算符
+=
-=
*=
+=
/=
- 条件运算符
? :
8.包机制
- 域名倒写
com.example.java
- 防止命名冲突
package
import
9.JavaDoc
- JDK帮助文档
- Javadoc标签(会使用IDEA生成Javadoc)
@author
作者标识@version
版本号@param
说明方法的参数@return
对函数返回值的描述@throws
构造函数或方法会抛出的异常
10.方法重载
名字相同参数列表不同
11.命令行传参(涉及以后的JVM调优)
java Main param1 param2 ... param_n
12.数组
Arrays
工具类
13.排序算法
14.面向对象
-
什么是面向对象(类与对象)
- 类是对象的抽象
- 对象是类的具体
-
new对象
- 栈存放引用
- 堆存放具体的对象
-
三大特性
- 封装
- 属性私有
- 提供
getter
、setter
、toString
- 继承
extends
Object
- Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类(可以使用Object类中的所有方法)。
- 关于Object类更详细解释
this
super
(父类指针)- 子类拥有父类全部特性
- 方法重写
- 多态
- 父类的引用指向子类的对象
Person p = new Student()
instanceof
若匹配,则可以进行类型之间的相互转化/** instanceof运算符的解释 * instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。 * instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。 */ public class Main { public static void main(String[] args) { // Utils (派生)-> CheckUtils Utils utils = new Utils(); CheckUtils checkUtils = new CheckUtils(); System.out.println(utils instanceof Utils); // true System.out.println(checkUtils instanceof Utils); // true System.out.println(utils instanceof CheckUtils); // false } }
- 父类的引用指向子类的对象
- 封装
-
修饰符
public
,protected
,private
static
final
abstract
- 抽象类
- 1.抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 2.抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 3.抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 4.构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 5.抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
- 抽象方法
- 1.如果一个类包含抽象方法,那么该类必须是抽象类。
- 2.任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
- 抽象类
-
接口
interface
- 只有一个方法的接口叫函数式接口,可以使用lambda表达式简化
- 接口比抽象类更抽象
- 一个类可以实现多个接口
-
内部类
- 局部内部类
- 静态内部类
- 匿名内部类(重点)
-
异常
Throwable
Exception
- 运行时错误
- 1/0
ClassNotFound
UnknownType
NullPoint
- 下标越界
- …
- 检查型异常(一般不用管,编译时会检查出来)
- 运行时错误
Error
- AWT错误
- JVM错误
StackOverFlow
OutOfMemory
- 5个关键字
try
catch
finally
throw
throws
- 自定义异常
- 继承
Exception
类即可
- 继承
-
常用类(必学)
Object
hashCode()
toString()
clone()
getClass()
notify()
wait()
equal()
Math
- 常见数学函数
Random
- 生成随机数
UUID
File
- 创建
- 查看
- 修改
- 删除
Date
Date()
SimpleDateFormat()
Calendar()
String
- 不可变性 -> 源码中定义:
final
- 适合操作量较少的时候
- 不可变性 -> 源码中定义:
StringBuffer
- 可变长
- safe/unsafe? 效率低 安全
- 适合多线程,数据量较大的时候
StringBuilder
- 可变长
- safe/unsafe? 效率高 不安全
- 适合单线程,数据量较大
// 问线面结果分别都是什么 String str = "a" + 1 + 2; String str = 'a' + 1 + 2; String str = 1 + 2 + "a"; String str = 1 + 2 + 'a';
- 包装类
- 自动装箱和开箱
-
集合框架
推荐使用的遍历方法:iterator(迭代器)
- Collection
- List(有序可重复)
- ArrayList(常用)
- LinkedList(常用)
- Vector
- Stack
- Set(无序不可重复)
- HashSet(常用)
- TreeSet
- iterator
- List(有序可重复)
- Map
- HashMap(非常重要,常用,天天用)
- TreeMap
- Collection工具类
- 泛型<>约束,避免类型转换的问题
说明1:请务必理解这里的有序和无序
- 无序性:并非按照数组索引存储,而是按照HashCode值进行存储
- 有序性:根据数组的索引值进行存储
说明2:HashMap的数据结构(面试高频问题)
- JDK1.7:数组+链表
- JDK1.8:数组+链表+红黑树
- Collection
15.IO流
- 字节流
- InputStream
- OutputStream
- 字符流
- Writer
- Reader
- 节点流(…)
- 处理流
- buffer
- bufferInputStream
- bufferOutputStream
- data
- DataInputStream
- DataOutputStream
- object
- 转换流
- InputStreamReader
- OutputStreamReader
- Filter(4个)
- Print
- PrintWriter
- PrintStream
- buffer
16.多线程
- 进程和线程
run
和start
方法- 线程创建的方式
Thread
Runnable
Callable
- 静态代理
new Thread(Runnable).start();
- Lambda表达式
- 函数式编程
- 避免内部类过多
-
new Thread(()->{ System.out.println(); }).start();
- 线程的状态
- 新建状态
- 就绪
- 运行
- 阻塞
- 死亡
- 常用方法
sleep
join
yield
isLive
start
setPriority
interrupt
- 线程同步
- 多个对象同时操作统一资源,并发
- 队列+锁
- Synchronized
- 同步方法(有弊端:锁太多)
- 同步代码块(常用)
- 第一个进程进来拿到所,后面的就要排队了,直到这个人释放锁,后面拿到锁的才能进去
- 死锁:两个人都抱着对方的🔐
- 互斥
- 请求与保持
- 不剥夺条件
- 循环等待条件
- Lock
- ReentrantLock
- lock
- trylock
- unlock
- ReentrantLock
- 线程通信
- 缓冲区:消息队列
- 标志位:红绿灯
wait()
notifyAll()
- 线程池
- 池化技术
- 池的大小
- 最大连接数
- 保持时间
- …
17.网络编程
- IP
- 端口
- Socket编程
- TCP
- 三次握手
- 四次挥手
- 面向连接
- UDP
- 无连接
- Packet
- URL
- 初识Tomcat
- 聊天通信
- 文件上传
18.注解和反射
- 注解
- 元注解
- 内置注解
- 自定义注解
- 反射读取注解
- 反射
- Class
newInstance()
- 类加载机制
- Method
invoke()
- Field
- Construct
newInstance()
- 获取的时候需要,传递参数的class类型
- 破坏私有关键字
setAccessible(true)
- 性能分析
- 正常 > 检测关闭的反射 > 默认的反射
- 反射获得注解,泛型…
- Class
- 单例模式的探究
- Stream