JavaSE总结
一、了解Java语言
1、我能不能学会这个语言?
2、写博客
3、学习MarkDown语法
4、简单的Dos命令
5、计算机语言的发展史
6、Java的诞生(1995年)–>JavaSE -->JavaME (Android) -->JavaEE
7、JDK(开发着工具包)、JRE(运行环境)
二、Hello World
2-1 Hello World 程序
public class Hello(){
public static void main(String[] args) {
Systen.out.print("Hello World");
}
}
2-2 Java语言特点
- Java是一个强类型静态语言
- Java是编译型语言,Python是解释型语言
- 使用Javac生成class
三、基础语法
3-1 注释
- 行内注释 //
- 多行注释 /**/
- 文档注释 /** */ javadoc 生成帮助文档
3-2 标识符
关键字
3-3 数据类型
-
**基本数据类型: **
- 整数(byte 1 、short 2 、int(默认) 4 、long 8 )、
- 浮点数( float 4 、double (默认) 8 )
- 字符(char 2 )
- 布尔值(boolean 1 )
-
引用数据类型:类、接口、数组
3-4 类型转换
-
自动类型转换:低转高
-
强制类型转换:高转低(低)高
3-5 变量和常量
- type varName [=value];
- 作用域:类变量 ; 实力变量; 局部变量;
- 常量:final(关键词) MAX_A = 10;
- 命名规范:
- 1、见名知意
- 2、驼峰命名(变量,方法)
- 3、类,首字母大写,驼峰命名
- 4、常量 大写+下划线
3-6 运算符
- 算数运算符 + - * / ++ –
- 赋值运算符 =
- 关系运算符 > < >= <= == != instanceof
- 逻辑运算符 && || !
- 位运算符 & | ^ ~ >> <<
- 条件运算符 ? :
- 扩展运算符 += -= *= /=
3-7 包机制
- 域名倒写
- 防止命名冲突
- package
- import
JavaDoc
- JDK 帮助文档
- javadoc
- author
- Version
- Sinc
3-8 流程控制
-
顺序结构 (程序默认结构,自伤而下的执行)
-
Scanner (用户交互 System.in)
-
分支结构
- if单选择结构
- if-else 双选择结构
- if-else -else 多选择结构
- switch jdk支持了String类型 case穿透现象 default
-
循环结构
- while 尽量避免死循环
- do…while
- for for(int i = 0; i < 100;i++)
- for-each
-
break & continue
- break : 跳出循环
- continue : 终止当次循环
- 带标签continue
- return : 结束方法的运行
3-9 方法
- 方法的定义
- 修饰符、返回值 方法名 (参数名) {return 返回值};
- 方法调用
- 类名.方法
- 对象,方法
- 方法重载
- 名字相同,参数列表不同
- 命令行传参
- 给main方法传递参数
- 可变长参数
- …
- 必须放在最后一个参数
- 递归 -----> 自己调用自己,给自己一个出口 (面试常温)
3-10 数组
- 数组的定义
- int[5]
- {1,2,3,4,5}
- 必须是同一个类型
- 数组的使用
- 通过下标拿到值
- ArrayIndexOutOfBounds
- 增强for循环遍历
- 二维数组
- int[[][]
- Arrays 工具类
- 排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 归并排序
- 希尔排序
- 堆排序
- 基数排序
3-11 面向对象
-
什么是面向对象
-
类与对象
- 类与对象的抽象:模板Class
- 对象是类的具体
-
构造方法
- 构造的重载 【默认的午餐构造】
- 如果手动定义了有参构造就必须手动再加一个无参构造
- 单例模式,需要构造器私有
-
new 对象
- 栈存放引用
- 堆存在具体的对象
-
封装
- get 、set、 属性私有
-
继承
- extends
- Object
- 子类拥有父类的全部特性
- 方法重写
- this
- super
- Java是单继承,只能继承一个父类
-
多态
- 父类的引用指向子类的对象 Person person = new Student();
- instanceof 关键,如果匹配,可以进行类型之间的转换
-
修饰符
- public
- protected
- private
- static
- abstract
- final
-
接口
- interface 代表约束只能定义方法名
- 子类实现接口,必须重写其中的方法
- 只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化
- 接口比抽象类更更抽象
- 一个类可以实现多个接口
-
内部类
- 局部内部类
- 静态内部类
- 匿名内部类(重点)
3-12 异常
-
Throwable
- Execption
- 运行时异常
- 1/0
- ClassNotFound
- NullPoint
- UnKownType
- 下标越界异常
- …
- 检查型异常
- 运行时异常
- Error
- AWT 错误
- JVM 错误
- StackOverFlow 栈溢出
- OutOfMemory 内存溢出
- Execption
-
五个关键字
- try{}
- catch() {} 先小后大
- finally{}
- throw 手动抛出异常
- throws 方法抛出异常
-
自定义异常
- 继承Exception类即可
四、高级语法
4-1 常用类
- Object类
- hashcode()
- toString()
- clone()
- getClass()
- notify()
- wait()
- equals()
- Math类
- 常见的数学运算
- Random类
- 生成随机数 UUID
- File类
- 创建文件
- 查看文件
- 修改文件
- 删除文件
- Date类
- Date
- SimpleDateFormat
- yy-MM-dd HH:mm:ss
- Calendar
- 建议使用它
- 包装类
- 自动装箱和拆箱
- String类
- 不可变性 final
- StringBuffer
- 可变长 final 操作了较少
- append() 多线程数据量比较大 效率低 安全
- StringBuilder
- 可变长 单线程数据量比较大 效率高,不安全
synchronized的实现原理:
①收到新的锁请求时首先自旋,如果通过自旋也没有获取锁资源,被放入ContentionList(该做法对于已经进入队列的线程是不公平的,体现了synchronized的不公平性)。
②为了防止ContentionList尾部的元素被大量线程进行CAS访问影响性能,Owner线程会在是释放锁时将ContentionList的部分线程移动到EntryList并指定某个线程(一般是最先进入的)为OnDeck线程。Owner并没有将锁直接传递给OnDeck线程而是把锁竞争的权利交给他,该行为叫做竞争切换,牺牲了公平性但提高了性能。
③获取到锁的OnDeck线程会变为Owner线程,未获取到的仍停留在EntryList中。
④Owner线程在被wait阻塞后会进入WaitSet,直到某个时刻被唤醒再次进入EntryList。
⑤ContentionList、EntryList、WaitSet中的线程均为阻塞状态。
⑥当Owner线程执行完毕后会释放锁资源并变为!Owner状态。
- String str = “a” + 1 + 2
- String str = ‘a’ + 1 + 2
4-2 集合框架
- Collection
- List 有序可以重复
- ArrayList
- add 添加
- remove 删除
- contains
- size 大小
- LinkedList
- getFirst()
- getLast()
- removeFirst()
- addFirst()
- …
- ArrayList
- Set 无序不可重复
- HashSet
- TreeSet
- List 有序可以重复
- Map
- HashMap
- JDK1.7 数组+链表
- JDK1.8 数组+链表+红黑树
- TreeMap
- HashMap
- Collections工具类
- 泛型<> 约束,避免类型转换之间的问题
4-3 IO流
- 字节流
- 输出:OutputStream
- 输入:InpStream
- 字符流
- Reader 读
- Writer 写
- 节点流
- CharArrayReader,Writer,inputstream,outputstream
- StringReader,Writer
- pipe(管道流)
- 处理流
- buffer
- bufferInputStream
- bufferOutputStream
- bufferReader
- bufferWriter
- data
- DataInputStream
- DataOutputStream
- 转换流
- InputstreamReader
- OuterstreamWriter
- Filter
- FilterInputStream
- FilterOutputStream
- FilterReader
- FilterWriter
- print
- PrintWriter
- PringStream
- buffer
4-4 多线程
-
进程 和 线程
-
run() ,Start()
①start方法用于启动线程,真正实现了多线程,调用了start方法后,会在后台创建一个新的线程来执行,不需要等待run方法执行完毕就可以继续执行其他代码。调用start方法时,该线程处于就绪状态,并没有开始运行。
②run方法也叫做线程体,包含了要执行的线程的逻辑代码,在调用run方法并没有创建新的线程,而是直接运行run方法中的代码。
-
线程创建的方式
- Thread
- start() 本地方法:java无权调用,交给底层
- Runnable
- 函数式接口 lambda表达式
- Callable
- 可以有返回值
- Thread
-
静态地理
- new Thread(Runnable).start();
-
Lambda表达式
- 属于函数式编程
- 避免内部类定义过多
-
线程的状态
- 新键状态
- 就绪
- 运行
- 阻塞
- 死亡
-
常用的方法
- sleep
- join
- yield
- isLive
- start
- setPriority
- interrput
①wait是Object类的方法,调用wait方法的线程会进入WAITING状态,只有等待其他线程的通知或被中断后才会解除阻塞,调用wait方法会释放锁资源。
②sleep是Thread类的方法,调用sleep方法会导致当前线程进入休眠状态,与wait不同的是该方法不会释放锁资源,进入的是TIMED-WAITING状态。
③yiled方法会使当前线程让出CPU时间片给优先级相同或更高的线程,回到RUNNABLE状态,与其他线程一起重新竞争CPU时间片。
④join方法用于等待其他线程运行终止,如果当前线程调用了另一个线程的join方法,则当前线程进入阻塞状态,当另一个线程结束时当前线程才能从阻塞状态转为就绪态,等待获取CPU时间片。底层使用的是wait,也会释放锁。
-
线程同步
lock > 同步代码块 > 同步方法
- 多个对象操作同一个资源,并发
- 队列+锁
- Synchronized
- 同步方法---->弊端锁太多
- 同步代码块(常用)
- 第一个线程拿到锁,后面就要排队了,知道这个人释放锁,后面拿到锁才可以进入
- 死锁:两个人都抱着对方的锁
- 互斥
- 请求与保持
- 不剥夺条件
- 循环等待条件
- Lock —> 优先级最高
- ReentrantLock
- lock
- unlock
- trylock
- ReentrantLock
-
线程通信
- 缓冲区:消息队列
- 标志位:红绿灯
- Object:
- wait() 等待
- notifyAll() 唤醒
-
线程池(POOL)
- 池化技术
- 池的大小
- 最大连接数
- 保持时间
- …
4-5 注解和反射
- 注解
- 元注解
- 内置注解
- 自定义注解
- 反射读取注解
- 反射
- Class
- newInstance
- 类加载机制
- Method
- invoke(user,“simon”)
- 存在重载,也需要写参数的类型
- Filed
- set(user,“simon”)
- Construct
- newInstance();
- 获取的时候需要没传递参数的class类型
- 破坏私有关键字
- setAccessible(true)
- 性能分析
- 正常 > 检测关闭的反射 > 默认的反射
- Class
- 单例模式
- Stream
- ForkJoin 效率比
本问根据结合狂神说Java结合JavaSE总结的MarkDown笔记,仅供参考学习