java入门
打开cmd命令

演示:


怎么样能随时随地的直接打开一个 .exe文件呢?
- 可以将其加入环境变量。

安装JDK

Helloword程序编写
如何理解编译:
- 编译 = 翻译
tips:用javac.exe来编写程序,用java来运行程序。
编译:javac helloworld.java
有错误会报错,没错误会出现一个空白行,并且在文件夹中会建立一个机器码文件
运行:java helloworld


BUG
java学习
java能干什么
java的三大分类:
- JavaSE
JavaME(已经被淘汰了)- JavaEE 桌面应用:主要是c和c++


java的主要应用领域就是服务器和网页

java为什么火?
java也可以用在大数据开发上hadoop
java跨平台的原理:
高级语言的编译运行方式 编程、编译、运行


- 对于c和c++:(整体翻译)

对于不同的操作系统都要重新编译,除此之外,硬件方面差别还特别大,就算是同一系统的不同设备也是可能无法运行的。
- 对于python:(按行翻译)

- 对于java:(混合型)

JRE和JDK

核心类库:java事先定义好的,我们直接拿过来用就行。

比如上面的System ,out.

所以什么是JDK?
所以什么是JRE?
JRE就是运行java程序的环境,他里面没有调试工具。

JDK,JRE,JVM之间的关系

java学习
一些基础概念的解析
注释
java中还有文档注释,有了文档注释就不用一行一行看代码了,别人可以通过阅读文档注释来了解这个代码是干嘛用的。注释仅仅是对代码的解释说明。
关键字
关键字就是:被java赋予了特定含义的英文单词
关键字代码全部小写,而且会有高亮的显示。
字面量就是告诉程序员:数据在程序中的书写格式
字面量分类:
一些特殊字面量的书写
比如 制表符:\t
空类型:null

变量

变量的注意事项

计算机的存储规则

数据类型

标识符命名规则
硬件规定

软性要求---阿里巴巴命名法
小驼峰命名法
大驼峰命名法

键盘录入----Scaneer
让操作的数据变得更加灵活

循环
无限循环---让循环停不下来。
- 知道循环的范围和次数,就用for
- 不知道循环的范围和次数就用while
- 无限循环下面不要再写代码了,因为上面的代码永远实现不完,所以不要写在下面。
跳转循环语句---使用continue关键字,结束当前循环,继续其他循环
break,终止循环。

获得随机数-通过导包的方式
- 找
Scanner
- 随机数
Random

- 获取任意范围内的随机数7~15
- 方法:

数组
数组的介绍
-数组是一种容器,可以用来存储同种数据类型的多个值

- 容器的类型,和存储的数据类型保持一致
数组的定义
- 精髓:加上方括号就是数组,不加就是定义变量

- 数组的静态初始化(有完整格式和简写格式)


-
数组的地址值和元素访问。
-
I@776ec8df和D@776ec8df
-
数组的遍历:数组遍历就是取出数据的过程,不要局限的理解为遍历就是打印。 -数组的长度属性:
数组名.length(调用方式)

- 动态初始化



数组的常见问题
- 索引越界异常(当访问了数组中不存在的索引,就会引发这个问题)
sout加"enter"就是输出。
- 求最值
- 求和
- 交换数据
- 打乱数据
数组的内存图
java的内存分配
- 以前



-
小结:1.只要是new出来的一定是在堆里面开辟了一个小空间 2.如果是new了多次,那么在堆里面有许多小空间,每个小空间中都有各自的数据。 3.如果两个数组指向同一个小空间时,其中一个数组多小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果。
-
现在

-
补充习题。

方法:(method)是程序中最小的执行单元。
- 用途:重复的代码、具有独立功能的代码可以抽取到方法中。
- 好处: 可以提高代码的复用性和可维护性。
方法的格式
方法定义: 将代码打包到一起
方法调用: 方法定义后并不是直接运行的,需要手动调用后才能执行。
最简答的方法
public static void 方法名(){
方法体(就是打包起来的代码);
}
方法必须先定义后调用,否则程序将报错
带参数的方法(有形参和实参两种)

public static void 方法名(参数1,参数2,...){
方法体(就是打包起来的代码);
方法调用时,参数的数量与类型必须与方法定义中小括号里的变量一一对应,否则程序将报错 方法的返回值,就是方法运行的最终结果。
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
- 范例:

- 带返回值方法的调用


方法的注意事项

return关键字

return下面不能写任何的代码。
方法的重载
- 在同一个类中,定义了多个同名的方法,这些同名的方法同种内容
- 每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系。
其中,顺序不同可以构成重载,但是不建议。
-
判断方法的重载

-
可以看到,未被调用的方法是灰色的。
-
把相同功能的方法的名字起成一样的名字,调用的时候要注意实参和形参要一一对应,一共有三种方法,一个是默认,一个是强制转换,一个是提前定义。
方法的内存
基本数据类型和引用数据类型
- 引用数据类型:变量中存储的是地址值,是引用了其他空间的数据。
- 基本数据类型: 数据值是存储在自己空间里面的
方法的值传递


类与对象
- 类: 是共同特征的描述(设计图)
- 对象:是真实存在的具体实例
设计对象并使用




封装
- 定义:对象代表什么,就得封装什么样的数据,并提供数据对应的行为。
- 好处:

private关键字
set某某:给成员变量“某某”进行赋值
get某某:对外提供成员变量“某某”的属性(值)

就近原则
当使用了两个相同名字的变量时,输出的时候选择近的那个,除非你选择了this.关键字。
this最基本的作用:区分成员变量和局部变量

构造方法(也叫构造器、构造函数)
作用:在创建对象的时候给成员变量赋值的

例子:
执行时机:
- 创建对象的时候由虚拟机调用,不能手动调用构造方法
- 每创建一次对象,就会调用一次构造方法。
构造方法的定义:
- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
- 但最好还是自己写,这样就知道自己想要调用什么样的方法。


- 概述:创建对象的时候,虚拟机会自动调用构造方法,作用是给成员变量进行初始化的。
JavaBean

对象的内存图
基本数据类型和引用数据类型

this的内存原理:所在方法调用者的地址值

成员变量和局部变量的区别

- 了解:

字符串
API(Application Programming Interface):应用程序编程接口。
- API是JDK中提供各种功能的Java类

- API工作文档: 帮助工作人员更好的使用API和查询API的一个工具

- String概述:
java.lang.String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都为此类的对象。
注意:字符串创建后是不能改变的。
方式
1.使用直接赋值的方式来获取一个字符串对象

2.使用new的方式获取一个字符串对象
- 空参构造:可以获取一个空白的字符串对象

3.传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象

4.传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
- 使用char类型可以修改字符串的内容:

5.传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
- 使用场景:计算机网络中使用的就是字节传输。先把字符转换成Assic码,经网络传输后转换成字符串。

java内存模型

- 串池-StringTable-字符串常量池
处于堆内存中

- 每new一次就会开辟一段新的空间---》浪费空间

- 所以最好采用直接命名的方式----》节约内存

- 总结:

字符串的比较:


集合ArrayList
- 集合只能存引用数据类型,要想存基本数据类型,需要包装类
- 与数组的对比



- 对于容器类的,最基础的四个字“增删改查”

static关键字
static内存图
- 静态变量加载的时候,内存中还没有对象。

- 接下来 null会被覆盖为“阿伟老师”

- 等号左边是个变量,在栈内存中,等号右边是个堆内存,开辟了一个空间。把地址赋值给s1;

-
age同理

-
然后show方法就会找到堆内存中的 name 、age以及静态变量teacherName。

-
注意方法2的结果就是null /0 阿伟老师/
-
共享一般就是static修饰。

static静态方法和工具类
- 三种类:

- 注意类名知其意

- 私有化构造方法后外界就不能创建对象了

public class student(){
}
public class ArrUtill(){
}
-
student 是有意义的,ArrUtill是没有意义的,就是工具类。
-
方便调用,方法定义为静态

- 非静态方法里面有一个隐藏的this
- this表示当前方法调用者的地址值
- this是和某一个对象相关的,所以要指定一下,对象像自行车,this就是钥匙
- 而static是公共车,谁都能坐,不能随便用this开。
static

- 静态的东西是可以互相调用的
- 只要没创建对象,非静态的东西就不会出现在内存当中

- 总结:


继承
- 对象代表说明就得封装对应的数据,并提供数据对应的行为


- 要看到子类是父类中的一种,不能混杂你


继承的特点:

- 单继承,多继承,多层继承


- 由虚拟机给的


构造方法是否可以被继承

成员变量是否可以被继承
- 如果一个类中没有构造方法,虚拟机会自动的给你添加一个默认的空参构造

- 成员变量是“私有”和“非私有”都能继承,但是私有的可以继承但是不能用。
成员方法是否可以被继承
- 子类可以继承父类的方法,但是不是所有的方法都能继承,只有虚方法表中方法会继承。

- Object类是所有方法的爹

继承当中成员变量的访问特点
- 就近原则:谁离我近,我就用谁


继承当中成员方法的访问特点

- 方法的重写(注解,给电脑看的。注释:给人看的)
本质是什么:覆盖了虚方法中的方法


继承当中构造方法的访问特点

this super的解释

多态

- 多态调用成员的特点:




学会看java的异常
- java14的新特性:可以直接强转,而不是每次先问一下
a instance of Dog然后再进行转换。
- 自动类型转换就是由小变大
- 而强制转换就是由大变小

包和final


”alt+回车“就是自动导包
final关键字

- 不能重写,不能继承,不能再赋值。、

-
常量记录的数据是不能变换的
-
字符串是不能改变的




代码块
- 局部代码块

- 构造代码块


- 静态代码块
使用场景:在类加载中,可以用作一些数据初始化来使用
抽象类与抽象方法



接口
- 可以重新定义一种规则。
- 所有子类的共性,就是父类。一部分子类的共性就是接口。
- 抽象类表现的是一类事物,而接口表现的是一种行为
- 接口不能实例化,也就是不能创建对象


如果接口之中有重名的类,那么重写一次就好了。

内部类
- 类的五大成员:代码块,内部类,属性,方法,构造方法






成员内部类


- 如果内部类被private修饰,是不能直接创建inner对象的。

- Outer中提供一个方法,方法中返回一个对象。
- 同一个包能用,不同的包不能用。

匿名内部类
常用API:javabean帮我们提前写好的各种各样的方法
- 本章不进行该类中的方法的具体代码实现,仅做简单了解,等用到的时候再去深入的学习了解。
System类

- System的一些方法



Runtime
- 表示当前虚拟机的运行环境,想要调用该方法就要先获取他的对象,通过
getruntime()方法获取到的。 - 事实上。
system中的exit()方法就是调用的runtime中的exit()方法。
Object类

- super():默认访问父类的无参构造

- 一共有11个成员方法:


Biginteger与BigDecima的基本使用

只要不是小数,Biginteger都可以表示

正则表达式
集合
java中有着各种各样的集合
单列集合和双列集合



- 有序:存和取的顺序是一样的
- 可重复:集合中可以存取的元素是可以重复的
- 有索引:可以通过索引获取集合里面的每一个元素

其中fot循环只能遍历有索引的list,而没有索引的set集合是不能使用for循环的。

迭代器遍历

- 三个方法分别为迭代器列表,哈希指针指向的元素不为空的时候,指向下一个元素,并获取他的内容。
增强for遍历


- 快捷方式
coll.for(加上回车)

List中常见的方法


- 方法3



list下面的实现类
第一个实现类ArrayList
- 本质上是一个数组,数组的名字叫做elemenntData
- 创建集合的时候长度还是0,等到添加第一个数组的时候,他的长度变成了10


- 如果存入的数据少,那么就扩容1.5倍。
- 如果太多,实际上多长那就是多长。

vector已经被市场淘汰
linklist源码
迭代器的源码
数据结构

栈


队列

栈和队列的对比

数组
- 地址值:找到数组的位置
- 索引:找到剧透的某一个数

链表



- 双向链表查询元素N的时候,就会判断与头结点更近还是尾结点更近。
前几个对比

二叉树
- NODE

- 没有父节点或者左(右)子结点,则记为
NULL

普通二叉树

查询二叉树


1.前序遍历
2.中序遍历---最重要,用的最多
然后遍历中间结点20:16 18 19 20 22 23 24
3.后序遍历
4.层序遍历

- 总结:

-
二叉树的弊端: 添加
-
左右子树的长度不一,查询效率太低

平衡二叉树

- 树的演变

- 旋转规则

-
这是左旋

-
右旋同理
-
一共有四种情况: 左左,左右,右右,右左 1.左左

添加的情况有这两种:

2.左右

- 先把左右变成左左,即先局部左旋,然后再右旋
3.右右

4.右左

- 总结



红黑树




- 简单路径,只能往前,不能回头。

-
红色更方便。
-
添加结点的规则

-
其中,右旋的时候是不需要考虑叶子节点的
-
注意再进行其他判断的操作
-
旋转比较费操作,修改红黑颜色简单

双列集合
- 键和值一一对应,每个键只能对应自己的值


map

map集合的遍历方式

- 第一种方式,把键放到一个单列集合里面,然后用get方法来获取对应键的值。
- 第二种方式,通过键值对进行遍历
- 第三种方式,使用Lambda表达式进行遍历

HashMap基本的使用
- 直接使用map里面的方法就可以了

- HashMap的特点:

- HashMap的底层原理:
//1.首先,还是会创造一个长度为16的空数组
//2.Entry对象里面,记录的就是要添加的键和值,此时,计算出键(key)哈希值,而不是值value。

- 如果由ebtry冲突了,就只比较键的属性值,如果一样,就会覆盖原来的。如果不一样,新的元素直接挂在下面,形成一条列表。

Hashmap的小练习
LinkedHashMap



TreeMap


源码解析
可变参数
- 可变参数底层就是一个数组,不过不需要我们自己创建,java会自己创建好。

集合工具类Colllections


Stream流
- 就是Java中的流水线。






Stream流的中间方法
Stream流的终结方法
方法引用的概用
异常
- 异常就是程序出现的问题




编译时异常和运行时的异常
编译时期异常
必须手动处理,不然就没法继续进行

运行时期异常

总结
- 除了runtime,都是编译时期异常。


异常的作用

- 在红色区域找异常。还有行数


异常的处理方式

jvm默认处理方案

try。。。catch



- 有catch才能捕获,没有就不能捕获
- 有多个问题,就写多个catch
- 如果要捕获的异常,存在父子关系的话,父类一定要写在子类的下面
Exception e

- 如果没有被捕获,就用jvm默认捕获
- 如果try里面出现了异常,就会直接跳转,不会接下来执行try里面的代码了


异常的常用方法

- 最常用的就是printStacktraxce()这个方法,因为输出的信息是最多的。

- 用err会输出红色的字体。
抛出异常

自定义异常

- 让报错台的报错信息更加明确。
file
路径file类
相对路径/绝对路径

- 带盘符和不带盘符的 mark:0:0:0:0:q75.image#?w=1505&h=448&s=171692&e=png&b=f7f6f6)
file里面的方法

把string表示的路径转化为file,以便调用file的方法。
- 方法1

- 方法2

- 不同的操作系统使用不同的分隔符,因为windows和linux是不一样的
- 方法3

- 总结:

IO流:存取和读取数据的解决方案
- 内存的特点,不能永久化存储,程序停止,数据丢失。
- 所以要通过io流存到硬盘中的文件中。

- 但是这些操作只能对file本身进行操作。所以需要io流。


InputStream和OutStream

- 这四个都是抽象类,不能直接创建对象,需要获得子类。



- 没释放资源就会被占用,没法下单。
字节输出流写出数据的三种方式

- 一次写一个字节数组的数据
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

FileOutStream 写数据的两个小问题

- 换行和续写


FileInputStream字节输入流

多线程
- 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。比如,360是一个进程,然后下图所示的各个功能是线程操作。


并发与并行
交替,单个cpu
同时,多个cpu
多线程的实现方式

- 第一种实现方式


- 第二种实现方式

- 第三种实现方式

- 总结:

多线程常见的成员方法

-
线程从1-10,默认是5,线程越大,抢到优先级越可能
-
最后三个方法,又叫做备胎线程。
-
调用这个方法:他的结果是main

-
sleep

线程的优先级
抢占式调度:java采用,具有随机性
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
非抢占式调度:顺序的,挨个用。

守护线程


- 陆陆续续的结束,并不是立马结束
礼让线程
- 让线程的执行尽可能的均匀一点
Thread.yield出让当前cpu的执行权- 但是效果不是很好,用的比较少
插入线程
、

线程的生命周期

线程的安全问题
- 对于异常,能抛就抛,不能抛就try

同步代码块
- 卖重复的票:线程执行的时候具有随机性,随时可能被其他的线程抢走
- 卖超出范围的票,随机性。
- 解决办法:
只有进程一出来了,其他进程才能进去。
就像蹲坑一样。
同步代码块的格式

如何实现
- 锁对象,要保证锁对象一定是唯一。锁对象的创建可以是任意的。
- 有以下几个特点 :

- 有两个小细节:不能把重复代码块写在循环的外面。
- 必须是唯一的

同步方法

- 重点:把哪些东西写在同步方法里面
- 当前类的字节码文件作为锁对象。 -- stringbuffer是线程安全的,可以用在多线程下的。
- stringbuild 适用于单线程

- 抽取成一个方法。

lock锁

- static关键字表示所有的thread都用同一把lock锁

- 解决办法:把要执行的内容都放进去try里面

死锁----这是一个错误

- 外面一个锁,里面一个锁

多线程的状态
没有定义运行状态的原因,因为当一个线程被执行的时候,就会被jvm虚拟机交付给cpu。

反射
反射

- idel中自动提示的功能就是反射来实现的。


- 先获取class对象的三个,然后解剖class里面的字段。

获取class对象的三种方式


- java中万物皆对象。可以把class当作对象
- 可以把Constructor当作对象
- Field是字段,成员变量的对象
- Method是成员方法的对象。
利用反射获取构造方法


- 获取class字节码文件对象、
getConstructor只能获取公共的, 不能获取protected和private的



利用反射获取成员变量

利用发射获取成员方法

- 继承的意思就是获取父类的,不包括继承的就是不获取父类的


动态代理:无侵入式的给代码增加额外功能

动态代理的代码实现
-
如何为java对象创建一个代理对象

-
proxy就是代理
-
InvocationHandler接口