诞生于1995年
2006年进军大数据领域 (Hadoop底层为java实现)
JavaSE -> java的基础
JavaME -> 安卓市场
JavaEE -> 企业及开发 (互联网应用领域)
找到我的电脑 -> 右键菜单 -> 属性 -> 高级系统设置 -> 系统环境变量
-> 找到Path菜单 -> 编辑 -> 新建环境变量 -> 复制粘贴安装好的jdk
路径-|| bin 添加到环境变量列
public class Hello{ public static void main(Strng[] args){ System.out.println("Hello world !"); } }
运行编译型语言是相对于解释型语言存在的,编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。
相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如Python/JavaScript / Perl /Shell等都是解释型语言。
// 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'
- '\b' 退格
- '\n' 换行
- '\r'
- '\t' 制表
- \‘
- \“
- \\
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
防止命名冲突
JDK 帮助文档
@author 作者
@Version 版本
@Since 说明Java类最早支持到那个版本
@Param 参数
@Return 返回值
@Throws 异常名称
用户交互输入
程序的默认结构,自下而上的执行
JDK 7 支持了 switch 的 String 类型的选择条件
指不加break会继续执行的效果
尽量避免死循环
九九乘法表
增强for循环
跳出循环
终止当前循环,执行下一次循环
带标签的 continue
goto
结束方法的运行
一堆语句块的组合
修饰符 返回值类型 方法名 (参数名) {
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个包含可变参数的方法想匹配,则编译会报错,因为编译器不知道该调用哪个方法
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),对象是类的具体
栈存放引用
堆存放具体对象
属性为私有的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 类即可实现自定义异常
hashcode()
toString()
clone()
getClass()
notify()
wait()
equals()
不可变性
不可能被改变的 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"操作数据量较少时使用
可变长的 append()方法
多线程数据量较大
处理数据效率低,但安全
可变长的 append()方法 安全
单线程数据量较大
处理数据效率高,但不安全
常见的数学运算
生成随机数
UUID类
创建文件
查看文件
修改文件
删除文件
自动装箱
自动拆箱
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
工具类
泛型
约束,避免类型转换之间的问题
字节流
输出
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 > 同步代码块 -> 同步方法
线程通讯
缓冲区 :(消息对列)