JAVASE 学习回顾
java历史
java的诞生
诞生于1995年
2006年进军大数据领域 (Hadoop底层为java实现)
java的三大市场攻略
JavaSE -> java的基础
JavaME -> 安卓市场
JavaEE -> 企业及开发 (互联网应用领域)
java运行与开发环境
JDK (开发者工具包)
配置环境变量
找到我的电脑 -> 右键菜单 -> 属性 -> 高级系统设置 -> 系统环境变量
-> 找到Path菜单 -> 编辑 -> 新建环境变量 -> 复制粘贴安装好的jdk
路径-|| bin 添加到环境变量列
JRE(运行时环境)
HelloWorld
code
public class Hello{
public static void main(Strng[] args){
System.out.println("Hello world !");
}
}
编译过程
- javac Hello.java -> 生成 class 字节码
- java Hello -> 运行文件
语言类型区别
编译型语言
运行编译型语言是相对于解释型语言存在的,编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。
解释型语言
相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如Python/JavaScript / Perl /Shell等都是解释型语言。
java 是解释型+编译型的语言
java语言基础
注释
行内注释
// code already annotation
String hello = "Hello world!"; // 单行注释
多行注释
/*
public class Hello{
public static void main(Strng[] args){
System.out.println("Hello world !");
}
}
*/
/* 多行注释 */
文档注释
/**
*@return null
*/
public class Hello{
public static void main(Strng[] args){
System.out.println("Hello world !");
}
}
javadoc -> 生成帮助文档命令
标识符
关键字
关键字 | 作用含义 |
---|---|
private | 一种访问控制方式 : 私用模式 |
protected | 一种访问控制方式 : 保护模式 |
public | 一种访问控制方式 : 公有模式 |
abstract | 表明类或者成员方法具有抽象属性 |
class | 定义类 |
extends | 继承(表明一个类型是另一个类型的子类型) |
final | 说明最终属性(表明一个类不能派生出子类,成员方法不能被覆盖,成员域的属性值不可以被二次改变) |
implements | 一个类实现了一个给定的接口 |
interface | 定义接口 |
native | 声明一个方法是由计算机相关的语言(C/C++)实现的 java只是直接调用而已 native详解 |
new | 创建新实例对象 |
static | 表示(类、变量、方法)具有静态属性 |
strictfp | 声明FP_strict(单精度或双精度浮点数)遵循 IEEE 754算数规范 |
synchronized | 表示一段代码块、类、成员方法需要同步执行 详解 |
transient | 表示不用序列化的成员域 详解 |
volatile | 表明2个,或者多个变量必须同步发生变化 详解 |
break | 提前跳出一个代码块 |
continue | 回到一个代码块的开始处 |
return | 从成员方法中返回数据 |
do | do-while 循环结构中 |
while | 循环结构中 |
if | 条件语句的引导词 |
else | 条件语句的引导词,表示第一个条件不成立时,所执行的事情 |
for | 循环结构的引导词 |
instanceof | 来验证一个对象是否是一个指定类的实例对象 详解 |
switch | 分支语句结构的引导语 |
case | switch语句中,的一个分支语句 |
default | switch语句中的默认分支 |
try | 异常处理 : 抛出异常程序块 |
catch | 异常处理 :捕获抛出的异常 |
throw | 异常处理 :在当前所定义的方法中所有需要抛出的异常 |
import | 表明要访问的类或包 |
package | 包 |
boolean | 八大数据类型之一 : 布尔类型 |
byte | 八大数据类型之一 : 字节类型 |
char | 八大数据类型之一 : 字符类型 |
double | 八大数据类型之一 : 双精度浮点数类型 |
float | 八大数据类型之一 : 单精度浮点类型 |
int | 八大数据类型之一 : 整数类型 |
long | 八大数据类型之一 : 长整数类型 |
short | 八大数据类型之一 : 短整数类型 |
null | 空 |
true | 正确 (1) |
false | 错误 (0) |
super | 表示当前对象的父类型的引用,或者父类的构造方法 |
this | 指当前实例对象的引用 |
void | 声明当前方法没有返回值 |
goto | 保留关键字 (无具体含义) |
const | 保留关键字 (无具体含义) |
数据类型
基本数据类型
整数
// 长度由小到大排列
byte; // 字节数 : 1
short; // 字节数 : 2
int; // 默认 // 字节数 : 4
long; // 字节数 : 8
进制转换
- 2进制 : 0b
- 16进制: 0x
- 8进制 : 0
浮点数
// 长度由小到大排列
float; // 字节数 : 4
double;/*默认*/ // 字节数 : 8
金融计算问题
BigDecimal
金融计算问题常用数据类型
字符
char; // 字节数 : 2
编码
- ASCII 编码 -> 对中文的存储量 : 1字节 (不推荐)
- Unicode 编码 -> 对中文的存储量 : 2字节 (不推荐)
- utf-8 编码 -> 对中文的存储量 : 3字节 (推荐)
Windows默认编码为GBK编码,可能会导致数据库、Tomcat等配置乱码
转义字符
- 'u0000'
- '' 退格
- ' ' 换行
- ' '
- ' ' 制表
- ‘
- “
- \
布尔值
boolean; // 字节数 : 1位
条件判断
if(a) <==> if(a == true)
引用数据类型
类
接口
数组
类型转换
自动类型转换
低 - 转 - 高
高低含义
在数据类型中 : 以字节数为基准进行比较
在类中 :以子类父类作为标准比较
强制类型转换
高 - 转 - 低
低 = (低)高
// 人类
public class Person{
public Person();
}
// 学生类
public class Student extends Person{
public Student(){
super();
}
}
public class Test{
public static main(String[] args){
// 实例化人对象
Person person = new Person();
// 实例化学生对象
Student student = new Student();
// 强制类型转化
student = (Student)person;
}
}
变量和常量
变量
type varname = value;
作用域
- 类变量
- 实例变量
- 局部变量
常量
final MAX_A = 10;
必须大写常量
命名规范
- 见名知意
- 驼峰命名 (变量、方法)
- 类 :首字母大写 驼峰
- 常量 : 大写+下划线
- 不可用拼音命名
运算符
-
算数运算符
+ - * / ++ --
-
赋值运算符
=
-
关系运算符
> < >= <= == != instanceof
-
逻辑运算符
&& || !
-
位运算符
&; // 与 |; // 或 ^; // 异或 <<; // 右移 >>; // 左移
-
条件运算符
? : // 三目运算符
-
扩展运算符
+= -= *= /=
包机制
域名倒写
package
import
防止命名冲突
JavaDoc
JDK 帮助文档
-
@author 作者
-
@Version 版本
-
@Since 说明Java类最早支持到那个版本
-
@Param 参数
-
@Return 返回值
-
@Throws 异常名称
流程控制
Scanner
用户交互输入
顺序结构
程序的默认结构,自下而上的执行
选择结构
IF单选泽结构
IF ELSE 双选择结构
IF ELSE IF ELSE 多选择结构
switch
JDK 7 支持了 switch 的 String 类型的选择条件
case 的穿透现象
指不加break会继续执行的效果
default
循环结构
while
尽量避免死循环
do-while
for
九九乘法表
foreach
增强for循环
break
跳出循环
continue
终止当前循环,执行下一次循环
带标签的 continue
goto
return
结束方法的运行
方法
什么是方法
一堆语句块的组合
方法的定义
修饰符 返回值类型 方法名 (参数名) {
return 返回值;
}
方法的调用
类名.方法
对象.方法
方法重载
名字相同 参数列表不同
命令行传递参数
// 给main方法传递参数 // args 会接受其数值 // 方便之进行jvm调优时使用 public class Test { public static void main(String[] args) { for (int i = 0; i<args.length; i++){ System.out.println(args[i]); } } }
可变长参数
Java从JDK1.5以后,允许定义形参长度可变得参数从而允许为方法指定
数量不确定的参数,一个方法只能有一个可变参数,且可变参数应为最后一个参数,调用时,如果同时能匹配固定参数和可变长参数的方法,会优先匹配固定参数方法,如果能同时和2个包含可变参数的方法想匹配,则编译会报错,因为编译器不知道该调用哪个方法
case
public class Test { public static void main(String[] args) { // 方法调用 par("你好","世界","我来啦!"); } // 参数长度可变的方法 public static void par(String... strings) { for (String s : strings) { System.out.print(s); } } }
递归
自己调用自己,给自己一个出口
面试问题
数组
数组的定义
int[] lee = new int[5]; int[] jia = {1,2,3,3,4,5}; // 数组内必须是同一个类型
数组使用
-
通过下标拿到值
常见异常
ArrayIndexOutofBounds ----> 数组下标越界异常
-
遍历数组
foreach 遍历
-
二维数组
int[][];
-
Arrays工具类
-
排序算法
西部开源首页 ———— bilibili
冒泡排序
选择排序
插入排序
快速排序
归并排序
希尔排序
堆排序
基数排序
面向对象
什么是对象
类与对象
类是对象的抽象(模板Class),对象是类的具体
构造方法
构造的重载
- 默认无参构造
- 如果手动定义了有参构造需要手动添加一个无惨构造方法
new 对象
栈存放引用
-
堆存放具体对象
封装
属性为私有的private属性,且设置get,set方法进行数据的访问
继承
extends 继承关键字
Object 是所有类的爹
子类会拥有父类的全部属性
方法重写
this
super
java是单继承,只能继承一个父类
多态
父类的引用指向子类的对象
public class Test {
// 人类
public static class Person{
public Person(){ }
}
// 学生类
public static class Student extends Person{
public Student(){ super(); }
}
public static void main(String[] args) {
Person person = new Student();
}
}
instanceof 关键字,如果匹配,直接进行类型的转换,实现动态性
修饰符
public
protected
private
static
final
abstract
接口
inteface
约束只能定义方法名
子类实现接口后,必须重写其中的方法
只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化
接口比抽象类更抽象
接口可以实现多个
// 接口的实现
// play接口
public interface Play {
void start();
}
// test2类实现接口
public class Test2 implements Play {
@Override
public void start() {
}
}
// test3实现接口
public class Test3 implements Play {
@Override
public void start() {
}
}
内部类
局部内部类
静态内部类
匿名内部类(重点)
异常
Throwable
异常的和接口
Exception
Exception 捕获不到的异常,可以提升至 Throwable 捕获
Exception 不可以捕获 Error 的异常
运行时异常
1/0 异常
ClassNotFound
NullPoint
UnKownType
下标越界异常
……
检查型异常
Error
AWT错误
JVM错误
StackOverFLOW (堆栈溢出异常)
OutOfMemory (内存溢出)
五个关键字
try {}
异常代码块
catch () {}
先小后大原则
先捕获小的异常,逐渐的向外捕获大的异常
finally {}
无论如何最终执行的方案
throw
手动抛出异常
throws
方法抛出异常
自定义异常
继承 Exception 类即可实现自定义异常
常用类(JavaSE高级部分)
Object类
hashcode()
toString()
clone()
getClass()
notify()
wait()
equals()
String类
不可变性
不可能被改变的 final
public final class String{ // code // ………… }
常见方法
length()
getBytes()
indexOf()
subString()
split()
trim()
实例case
String str = "a" + 1 + 2; // "a12" String str = 'a' + 1 + 2; // 100 -> 97 + 1 + 2 String str = 1 + 2 + "a"; // "3a"
操作数据量较少时使用
StringBuffer类
可变长的 append()方法
多线程数据量较大
处理数据效率低,但安全
StringBuilder类
可变长的 append()方法 安全
单线程数据量较大
处理数据效率高,但不安全
Math类
常见的数学运算
Random类
生成随机数
UUID类
File类
创建文件
查看文件
修改文件
删除文件
包装类
自动装箱
自动拆箱
Date类
Date
创建时间
SimpleDateFormat
yyyy-MM-dd HH:mm:ss
Calendar
推荐使用
集合框架
Collection
List (有序的可以重复)
ArrayList(常用)
add()
remove()
contains()
size()
Iterator
LinkedList (链表) (常用)
getFirst()
getLast()
removeFirst()
addFirst()
Vector
Stack
Set (无序的不可以重复)
HashSet (常用)
TreeSet
Map
HashMap (超级常用) (用途及广) (高频面试考点)
JDK1.7
数组 + 链表
JDK1.8
数组 + 链表 + 红黑树
TreeMap
Collections
工具类
泛型
约束,避免类型转换之间的问题
IO流
字节流
输出
OutPutStream
输入
InPutStream
字符流
读入
Reader
写出
Writer
处理流
buffer
bufferInPutStream
bufferOutPutStream
bufferReader
bufferWriter
data
DataInputStream
DataOutPutStream
转换流
InputStreamReader
OutPutStreamWriter
Filter
filterInPutStream
filterOutPutStream
filterReader
filterWriter
PrintWriter
PrintStream
节点流
CharArrayReader
CharArrayWriter
CharArrayInPutStream
**CharArrayOutPutStream **
序列化
多线程
进程与线程
run() start()
线程的创建方式
Thread
- extends Runnable
- start() 本地方法,java无权调用,交给C调用
Runnable
- 函数式
- lambda表达式调用
Callable
- 可以有返回值
- JUC编程
静态代理
new Thread(Runnable).start(); // 将runnable类放入Thread中进行静态代理调用
Lambda表达式
函数式编程范畴
避免内部类定义过多,导致不易阅读
case
new Thread(() -> { System.out.start(); }).start();
尽量使用lambda表达式在么内部类进行调用的时候
线程的状态
新建状态
就绪
运行
阻塞
死亡
常用的方法
sleep
join
yield (礼让)
isLive
start
setPriority 设置优先级
interrupt 中断
线程同步
多个对象操作同一个资源,并发
队列+锁方式
Syschronized
- 同步方法
- 存在弊端
- 锁定了,太多的代码
- 同步代码块 (常用)
- 原理
- 第一个线程进来拿到锁了,后面的线程就要排队了,直到当前的线程释放掉锁,后面的线程拿到锁才能进去
- 线程死锁
- 两个人同时拿着对方的锁,造成了线程的死锁
- 死锁的四个原则
- 互斥
- 一个资源,只能被一个进程使用,不可以被同时使用
- 请求与保持
- 对一个可能会崩溃的事件不会抓住不放,在适当的时机放开避免自己死锁
- 不剥夺条件
- 当一个进程获得到某个资源时,不可以将其资源强行拿走
- 循环等待条件
- 出现死锁时只需要破坏四原则中的某一个条件,即可解除死锁状态
Lock
- lock
- trylock
- unlock
Lock > 同步代码块 -> 同步方法
线程通讯
缓冲区 :(消息对列)