java学习

73 阅读19分钟

java入门

打开cmd命令

image.png
演示:

image.png

image.png
怎么样能随时随地的直接打开一个 .exe文件呢?

  • 可以将其加入环境变量。

image.png

安装JDK

image.png

Helloword程序编写

如何理解编译:

  • 编译 = 翻译

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

image.png image.png 运行:java helloworld

image.png

image.png

BUG

java学习

java能干什么

java的三大分类:

  • JavaSE
  • JavaME(已经被淘汰了)
  • JavaEE 桌面应用:主要是c和c++

image.png

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

image.png

java为什么火?

image.png java也可以用在大数据开发上hadoop

java跨平台的原理:

高级语言的编译运行方式 编程、编译、运行

image.png

image.png

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

image.png

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

  • 对于python:(按行翻译)

image.png

  • 对于java:(混合型)

image.png

JRE和JDK

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

image.png
比如上面的System ,out.

image.png
所以什么是JDK?

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

image.png

JDK,JRE,JVM之间的关系 image.png

java学习

一些基础概念的解析

注释

java中还有文档注释,有了文档注释就不用一行一行看代码了,别人可以通过阅读文档注释来了解这个代码是干嘛用的。注释仅仅是对代码的解释说明。

关键字

关键字就是:被java赋予了特定含义的英文单词
关键字代码全部小写,而且会有高亮的显示。

字面量就是告诉程序员:数据在程序中的书写格式

字面量分类: image.png 一些特殊字面量的书写
比如 制表符:\t
空类型:null image.png

变量

image.png

变量的注意事项

image.png

计算机的存储规则

image.png

数据类型

image.png

标识符命名规则

硬件规定

image.png

软性要求---阿里巴巴命名法

小驼峰命名法

image.png 大驼峰命名法

image.png

键盘录入----Scaneer

让操作的数据变得更加灵活

image.png

循环

无限循环---让循环停不下来。

  • 知道循环的范围和次数,就用for
  • 不知道循环的范围和次数就用while
  • 无限循环下面不要再写代码了,因为上面的代码永远实现不完,所以不要写在下面。

跳转循环语句---使用continue关键字,结束当前循环,继续其他循环

break,终止循环。

image.png

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

  • Scanner image.png
  • 随机数 Random image.png

image.png

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

image.png

数组

数组的介绍

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

image.png

  • 容器的类型,和存储的数据类型保持一致

数组的定义

  • 精髓:加上方括号就是数组,不加就是定义变量 image.png
  • 数组的静态初始化(有完整格式和简写格式) image.png

image.png

  • 数组的地址值和元素访问。

  • I@776ec8dfD@776ec8df image.png

  • 数组的遍历:数组遍历就是取出数据的过程,不要局限的理解为遍历就是打印。 -数组的长度属性:数组名.length(调用方式)

image.png

  • 动态初始化

image.png

image.png

image.png

数组的常见问题

  • 索引越界异常(当访问了数组中不存在的索引,就会引发这个问题)

sout加"enter"就是输出。

  • 求最值
  • 求和
  • 交换数据
  • 打乱数据

数组的内存图

java的内存分配

  • 以前 image.png

image.png

image.png

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

  • 现在 image.png

  • 补充习题。 image.png

方法:(method)是程序中最小的执行单元。

  • 用途:重复的代码、具有独立功能的代码可以抽取到方法中。
  • 好处: 可以提高代码的复用性和可维护性。

方法的格式

方法定义: 将代码打包到一起 方法调用: 方法定义后并不是直接运行的,需要手动调用后才能执行。
最简答的方法

public static void 方法名(){
    方法体(就是打包起来的代码);
}

方法必须先定义后调用,否则程序将报错
带参数的方法(有形参和实参两种)

image.png

public static void 方法名(参数1,参数2,...){
    方法体(就是打包起来的代码);

方法调用时,参数的数量与类型必须与方法定义中小括号里的变量一一对应,否则程序将报错 方法的返回值,就是方法运行的最终结果。

public static 返回值类型 方法名(参数){
    方法体;
    return 返回值;
}
  • 范例:

image.png

  • 带返回值方法的调用

image.png

image.png

方法的注意事项

image.png

return关键字

image.png

return下面不能写任何的代码。

方法的重载

  • 在同一个类中,定义了多个同名的方法,这些同名的方法同种内容
  • 每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系。

image.png 其中,顺序不同可以构成重载,但是不建议。

  • 判断方法的重载 image.png

  • 可以看到,未被调用的方法是灰色的。

  • 把相同功能的方法的名字起成一样的名字,调用的时候要注意实参和形参要一一对应,一共有三种方法,一个是默认,一个是强制转换,一个是提前定义。

方法的内存

基本数据类型和引用数据类型

  • 引用数据类型:变量中存储的是地址值,是引用了其他空间的数据。
  • 基本数据类型: 数据值是存储在自己空间里面的

方法的值传递

image.png

image.png

类与对象

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

设计对象并使用

image.png

image.png

image.png

image.png

封装

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

image.png

private关键字

set某某:给成员变量“某某”进行赋值 get某某:对外提供成员变量“某某”的属性(值)
image.png

就近原则

当使用了两个相同名字的变量时,输出的时候选择近的那个,除非你选择了this.关键字。

this最基本的作用:区分成员变量和局部变量

image.png

构造方法(也叫构造器、构造函数)

作用:在创建对象的时候给成员变量赋值的

image.png

例子:

image.png 执行时机:

  • 创建对象的时候由虚拟机调用,不能手动调用构造方法
  • 每创建一次对象,就会调用一次构造方法。

image.png 构造方法的定义:

  • 如果没有定义构造方法,系统将给出一个默认无参数构造方法
  • 如果定义了构造方法,系统将不再提供默认的构造方法
  • 但最好还是自己写,这样就知道自己想要调用什么样的方法。

image.png

image.png

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

JavaBean

image.png

对象的内存图

基本数据类型和引用数据类型

image.png

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

image.png

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

image.png

  • 了解:

image.png

字符串

API(Application Programming Interface):应用程序编程接口。

  • API是JDK中提供各种功能的Java类 image.png
  • API工作文档: 帮助工作人员更好的使用API和查询API的一个工具 image.png
  • String概述:
    java.lang.String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都为此类的对象。

image.png 注意:字符串创建后是不能改变的。

方式
1.使用直接赋值的方式来获取一个字符串对象

image.png

2.使用new的方式获取一个字符串对象
  • 空参构造:可以获取一个空白的字符串对象 image.png
3.传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象

image.png

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

image.png image.png

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

image.png

  • 串池-StringTable-字符串常量池

处于堆内存中 image.png

  • 每new一次就会开辟一段新的空间---》浪费空间 image.png
  • 所以最好采用直接命名的方式----》节约内存

image.png

  • 总结:

image.png

字符串的比较:

image.png

image.png

集合ArrayList

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

image.png

image.png

image.png

  • 对于容器类的,最基础的四个字“增删改查” image.png

static关键字

static内存图
  • 静态变量加载的时候,内存中还没有对象。 image.png
  • 接下来 null会被覆盖为“阿伟老师” image.png
  • 等号左边是个变量,在栈内存中,等号右边是个堆内存,开辟了一个空间。把地址赋值给s1;

image.png

  • age同理 image.png

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

image.png

  • 注意方法2的结果就是null /0 阿伟老师/

  • 共享一般就是static修饰。

image.png

static静态方法和工具类
  • 三种类: image.png
  • 注意类名知其意

image.png

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

image.png

public class student(){

}
public class ArrUtill(){

}
  • student 是有意义的,ArrUtill是没有意义的,就是工具类。

  • 方便调用,方法定义为静态

image.png

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

static

image.png

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

image.png

  • 总结: image.png

image.png

继承

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

image.png

image.png

  • 要看到子类是父类中的一种,不能混杂你 image.png

image.png

继承的特点:

image.png

  • 单继承,多继承,多层继承 image.png

image.png

  • 由虚拟机给的 image.png

image.png

构造方法是否可以被继承

image.png

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

image.png

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

image.png

  • Object类是所有方法的爹

image.png

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

image.png

image.png

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

image.png

  • 方法的重写(注解,给电脑看的。注释:给人看的)

本质是什么:覆盖了虚方法中的方法

image.png image.png

image.png

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

image.png

this super的解释

image.png

多态

image.png

  • 多态调用成员的特点: image.png

image.png

image.png

image.png

学会看java的异常

  • java14的新特性:可以直接强转,而不是每次先问一下a instance of Dog 然后再进行转换。 image.png
  • 自动类型转换就是由小变大
  • 而强制转换就是由大变小 image.png

包和final

image.png

image.png

image.png ”alt+回车“就是自动导包

final关键字

image.png

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

image.png

  • 常量记录的数据是不能变换的

  • 字符串是不能改变的

image.png

image.png

image.png

Snipaste_2024-03-05_21-07-07.png

代码块
  • 局部代码块 image.png
  • 构造代码块 image.png

image.png

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

image.png

image.png

image.png

接口

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

image.png

image.png

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

image.png

内部类

  • 类的五大成员:代码块,内部类,属性,方法,构造方法 image.png

image.png

image.png

image.png

image.png

image.png

成员内部类

image.png

image.png

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

image.png

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

image.png

匿名内部类

常用API:javabean帮我们提前写好的各种各样的方法

  • 本章不进行该类中的方法的具体代码实现,仅做简单了解,等用到的时候再去深入的学习了解。

System类

image.png

  • System的一些方法 image.png

image.png image.png

image.png

Runtime

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

Object类

image.png

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

image.png

  • 一共有11个成员方法:

image.png

image.png

Biginteger与BigDecima的基本使用

image.png

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

image.png

正则表达式

集合

java中有着各种各样的集合

单列集合和双列集合

image.png

image.png

image.png

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

image.png image.png

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

image.png

迭代器遍历

image.png

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

image.png

image.png

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

image.png

List中常见的方法

image.png

image.png image.png

  • 方法3

image.png

image.png

image.png

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

image.png

image.png

  • 如果存入的数据少,那么就扩容1.5倍。
  • 如果太多,实际上多长那就是多长。 image.png
vector已经被市场淘汰
linklist源码
迭代器的源码

数据结构

image.png

image.png

image.png

队列

image.png

栈和队列的对比

image.png

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

image.png

链表

image.png

image.png

image.png

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

image.png

二叉树
  • NODE

image.png

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

image.png

普通二叉树

image.png

查询二叉树

image.png

image.png

image.png 1.前序遍历

image.png 2.中序遍历---最重要,用的最多

image.png 然后遍历中间结点20:16 18 19 20 22 23 24
3.后序遍历

image.png 4.层序遍历 image.png

  • 总结:

image.png

  • 二叉树的弊端: 添加

  • 左右子树的长度不一,查询效率太低 image.png

平衡二叉树

image.png

  • 树的演变 image.png
  • 旋转规则

image.png

  • 这是左旋 image.png

  • 右旋同理

  • 一共有四种情况: 左左,左右,右右,右左 1.左左 image.png

添加的情况有这两种: image.png

2.左右 image.png

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

4.右左 image.png

  • 总结 image.png

image.png


image.png

红黑树

image.png

image.png

image.png

image.png

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

image.png

  • 红色更方便。

  • 添加结点的规则 image.png

  • 其中,右旋的时候是不需要考虑叶子节点的

  • 注意再进行其他判断的操作

  • 旋转比较费操作,修改红黑颜色简单 image.png

双列集合

  • 键和值一一对应,每个键只能对应自己的值 image.png

image.png

map

image.png

map集合的遍历方式

image.png

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

image.png

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

image.png

  • HashMap的特点:

image.png

  • HashMap的底层原理:

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

image.png

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

LinkedHashMap

image.png

image.png

image.png

TreeMap

image.png

image.png

源码解析

可变参数

  • 可变参数底层就是一个数组,不过不需要我们自己创建,java会自己创建好。 image.png

集合工具类Colllections

image.png

image.png

Stream流

  • 就是Java中的流水线。

image.png

image.png

image.png

image.png

image.png image.png image.png

image.png

Stream流的中间方法

Stream流的终结方法

方法引用的概用

异常

  • 异常就是程序出现的问题

image.png

image.png

image.png

image.png

编译时异常和运行时的异常

编译时期异常

必须手动处理,不然就没法继续进行

image.png

运行时期异常

image.png

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

image.png

image.png

异常的作用

image.png

  • 在红色区域找异常。还有行数 image.png

image.png

异常的处理方式

image.png

jvm默认处理方案

image.png

try。。。catch

image.png

image.png

image.png

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

image.png

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

image.png

image.png

异常的常用方法

image.png

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

image.png

  • 用err会输出红色的字体。

抛出异常

image.png image.png

自定义异常

image.png

  • 让报错台的报错信息更加明确。

file

路径file类

相对路径/绝对路径

image.png

  • 带盘符和不带盘符的 mark:0:0:0:0:q75.image#?w=1505&h=448&s=171692&e=png&b=f7f6f6)

file里面的方法

![image.png](p9-juejin.byteimg.com/tos-cn-i-k3…

image.png

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

  • 方法1 image.png
  • 方法2 image.png
  • 不同的操作系统使用不同的分隔符,因为windows和linux是不一样的
  • 方法3 image.png
  • 总结:

image.png

IO流:存取和读取数据的解决方案

  • 内存的特点,不能永久化存储,程序停止,数据丢失。
  • 所以要通过io流存到硬盘中的文件中。

image.png

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

image.png

image.png

InputStream和OutStream

image.png

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

image.png

image.png

image.png

  • 没释放资源就会被占用,没法下单。

字节输出流写出数据的三种方式

image.png

  • 一次写一个字节数组的数据 image.png vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

image.png

FileOutStream 写数据的两个小问题

image.png

  • 换行和续写

image.png

image.png

FileInputStream字节输入流

image.png

多线程

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

image.png

image.png

并发与并行

image.png 交替单个cpu

image.png 同时,多个cpu

多线程的实现方式

image.png

  • 第一种实现方式 image.png

image.png

  • 第二种实现方式

image.png

  • 第三种实现方式

image.png

  • 总结: image.png

多线程常见的成员方法

image.png

  • 线程从1-10,默认是5,线程越大,抢到优先级越可能

  • 最后三个方法,又叫做备胎线程。

  • 调用这个方法:他的结果是main image.png

  • sleep image.png

线程的优先级

image.png 抢占式调度:java采用,具有随机性

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

非抢占式调度:顺序的,挨个用。

image.png

守护线程

image.png

image.png

  • 陆陆续续的结束,并不是立马结束

礼让线程

  • 让线程的执行尽可能的均匀一点
  • Thread.yield出让当前cpu的执行权
  • 但是效果不是很好,用的比较少

插入线程

image.png

image.png

线程的生命周期

image.png

线程的安全问题

  • 对于异常,能抛就抛,不能抛就try

image.png

同步代码块

  • 卖重复的票:线程执行的时候具有随机性,随时可能被其他的线程抢走
  • 卖超出范围的票,随机性。
  • 解决办法:

image.png 只有进程一出来了,其他进程才能进去。 就像蹲坑一样。

同步代码块的格式

image.png

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

image.png

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

image.png

同步方法

image.png

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

image.png

  • 抽取成一个方法。 image.png

lock锁

image.png

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

image.png

  • 解决办法:把要执行的内容都放进去try里面 image.png

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

image.png

  • 外面一个锁,里面一个锁

image.png

多线程的状态

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

image.png

反射

反射

image.png

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

image.png

image.png

  • 先获取class对象的三个,然后解剖class里面的字段。 image.png

获取class对象的三种方式

image.png

image.png

  • java中万物皆对象。可以把class当作对象
  • 可以把Constructor当作对象
  • Field是字段,成员变量的对象
  • Method是成员方法的对象。

利用反射获取构造方法

image.png

image.png

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

image.png

image.png

image.png

利用反射获取成员变量

image.png

利用发射获取成员方法

image.png

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

image.png

image.png

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

image.png

动态代理的代码实现

  • 如何为java对象创建一个代理对象 image.png

  • proxy就是代理

  • InvocationHandler接口