0-Java基础中的基础

21 阅读13分钟

不知不觉,大学学到的知识又忘记了,所以决定这次重新捡起来还是记录记录吧。

常用的DOS命令

盘符名称:——盘符切换。
dir——列出当前目录下的文件以及文件夹
cd 目录——进入指定的单级目录
cd 目录1\目录2\...——进入多级目录
cd ..——回退到上一级目录
cd \或cd /——回退到盘符目录
md 文件目录名——创建指定的文件目录
rd 文件目录名——删除指定的文件目录(若文件内有文件有数据则失败)
cls ——清屏

1. Java的核心机制:JVM

1.1 Java的优缺点

1.2 JVM功能说明

JVM(Java Virtual Machine ,Java 虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境。JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。

image.png

1.2.1 实现Java程序的跨平台性

Java 代码,都运行在 JVM 之上。正是因为有了 JVM,才使得 Java程序具备了跨平台性。

image.png

1.2.2 自动内存管理(内存分配、内存回收)

  • Java 程序在运行过程中,涉及到运算的数据的分配、存储等都由 JVM 来完成
  • Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
  • GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。(Java程序还是会出现内存溢出和内存泄漏的问题)

2. Java的关键字

定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(或单词)HelloWorld 案例中,出现的关键字有 class、public 、 static 、 void 等,这些单词已经被 Java 定义好了。

  1. 关键字一共 50 个,其中 const 和 goto 是保留字(reserved word)。
  2. true,false,null 不在其中,它们看起来像关键字,其实是字面量,表示特殊的布尔值和空值。

image.png

image.png

3. 标识符

Java 中变量、方法、类等要素命名时使用的字符序列,称为标识符。

技巧:凡是自己可以起名字的地方都叫标识符。

标识符的命名规则(必须遵守的硬性规定):

  • 由 26 个英文字母大小写,0-9 ,_或 $ 组成
  • 数字不可以开头。
  • 不可以使用关键字和保留字,但能包含关键字和保留字。
  • Java 中严格区分大小写,长度无限制。
  • 标识符不能包含空格。

标识符的命名规范(建议遵守的软性要求,否则工作时容易被鄙视):

  1. 包名:多单词组成时所有字母都小写:xxxyyyzzz。
  2. 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
  3. 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
  4. 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。

4. 变量

变量的概念:

  • 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
  • 变量的构成包含三个要素:数据类型、变量名、存储的值
  • Java 中变量声明的格式:数据类型 变量名 = 变量值

变量的作用:用于在内存中保存数据。 使用变量注意:

  • Java 中每个变量必须先声明,后使用。
  • 使用变量名来访问这块区域的数据。
  • 变量的作用域:其定义所在的一对{ }内。
  • 变量只有在其作用域内才有效。出了作用域,变量不可以再被调用。
  • 同一个作用域内,不能定义重名的变量。

4.1 Java中变量的数据类型

Java 中变量的数据类型分为两大类:

  • 基本数据类型:包括整数类型、浮点数类型、字符类型、布尔类型
  • 引用数据类型:包括数组、类、接口、枚举、注解、记录

image.png

4.2 变量的使用

步骤1:变量的声明

格式:数据类型    变量名;

步骤2:变量的赋值

给变量赋值,就是把“值”存到该变量代表的内存空间中。同时,给变量赋的值类型必须与变量声明的类型一致或兼容。

变量赋值的语法格式: 变量名 = 值;

变量可以反复赋值。

也可以将变量的声明和赋值一并执行 String schoolDut = "大连理工大学";

内存结构图:

image.png

4.3 基本数据类型

4.3.1 整数型

image.png

  • 定义long 类型的变量,赋值时需要以"l"或"L"作为后缀。
  • Java 程序中变量通常声明为 int 型,除非不足以表示较大的数,才使用long。
  • Java 的整型常量默认为 int 型。

补充内容: 字节(Byte):是计算机用于计量存储容量的基本单位,一个字节等于 8 bit。

位(bit):是数据存储的最小单位。二进制数系统中,每个 0 或 1 就是一个位,叫做bit(比特),其中 8 bit 就称为一个字节(Byte)。

转换关系:

  • 8 bit = 1 Byte
  • 1024 Byte = 1 KB
  • 1024 KB = 1 MB
  • 1024 MB = 1 GB
  • 1024 GB = 1 TB

4.3.2 浮点型

image.png

浮点型常量有两种表示形式:

  • 十进制数形式。如:5.12 512.0f .512 (必须有小数点)
  • 科学计数法形式。如:5.12e2 512E2 100E-2

float:单精度,尾数可以精确到 7 位有效数字。很多情况下,精度很难满足需求。

double:双精度,精度是 float 的两倍。通常采用此类型。

定义 float 类型的变量,赋值时需要以"f"或"F"作为后缀。

Java 的浮点型常量默认为 double 型。

  • 并不是所有的小数都能可以精确的用二进制浮点数表示。二进制浮点数不能精确的表示 0.1、0.01、0.001 这样 10 的负次幂。

  • 浮点类型 float、double 的数据不适合在不容许舍入误差的金融计算领域。如果需要 精确数字计算或保留指定位数的精度,需要使用 BigDecimal 类。

4.3.3 char型

char 型数据用来表示通常意义上“字符”(占 2 字节)

Java 中的所有字符都使用Unicode 编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。

字符型变量的三种表现形式:

  • 形式 1:使用单引号(' ')括起来的单个字符。 例如:char c1 = 'a'; char c2 = '中'; char c3 = '9';
  • 形式 2:直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX 代表一个十六进制整数。例如:\u0023 表示 '#'。
  • 形式 3:Java 中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:char c3 = '\n'; // '\n'表示换行符

image.png

4.3.4 布尔类型

boolean 类型用来判断逻辑条件,一般用于流程控制语句中:

  • if 条件控制语句;
  • while 循环控制语句;
  • for 循环控制语句;
  • do-while 循环控制语句;

boolean 类型数据只有两个值:true、false,无其它。

  • 不可以使用 0 或非 0 的整数替代 false 和 true,这点和 C 语言不同。
  • 拓展:Java 虚拟机中没有任何供boolean 值专用的字节码指令,Java 语言表达所操作的boolean 值,在编译之后都使用 java 虚拟机中的 int 数据类型来代替:true 用 1 表示,false 用 0 表示。——《java 虚拟机规范 8 版》

5. 基本数据类型变量间运算规则

5.1 自动类型转换

规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。

image.png

  • 当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时。
  • 当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。
  • 当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算

5.2 强制类型转换

将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)

数据类型 1 变量名 = (数据类型 1)被强转数据值;

  • 当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度或溢出。
  • 当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度或溢出。
  • 声明 long 类型变量时,可以出现省略后缀的情况。float 则不同。

5.3 基本数据类型与String的运算

String 不是基本数据类型,属于引用数据类型,使用一对""来表示一个字符串,内部可以包含 0 个、1 个或多个字符。

  • 任意八种基本数据类型的数据与 String 类型只能进行连接“+”运算,且结果一定也是 String 类型
  • String 类型不能通过强制类型()转换,转为其他的类型

6. 运算符

6.1 算术运算符

image.png

自减、自增

6.2 关系运算符

image.png

6.3 位运算符

image.png

image.png

6.4 逻辑运算符

image.png

6.5 赋值运算符

image.png

6.6 三元运算符

variable x = (expression) ? value if true : value if false

6.7 instanceof 运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

instanceof运算符使用格式如下:

( Object reference variable ) instanceof  (class/interface type)

6.7 运算符优先级

image.png

7. 流程控制语句

8. IDEA的安装和使用

9. 数组

9.1 数组的概念

数组(Array):是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 数组中的概念:

  • 数组名
  • 下标(或索引)
  • 元素
  • 数组的长度

数组的特点:

  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型。
  • 数组中的元素在内存中是依次紧密排列的,有序的。
  • 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改。
  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
  • 数组名中引用的是这块连续空间的首地址。

数组的分类:基本数据类型元素的数组、引用数据类型元素的数组 一维数组、二维数组。。。

9.2 一维数组的声明

格式: 元素的数据类型[] 一维数组的名称;

数组的声明,需要明确:

  1. 数组的维度:在 Java 中数组的符号是[],[]表示一维,[][]表示二维。
  2. 数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的 Java 的数据类型。例如:int、String、Student 等。
  3. 数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据。

注意:Java 语言中声明数组时不能指定其长度(数组中元素的个数)。

9.3 一维数组的初始化

静态初始化 如果数组变量的初始化和数组元素的赋值操作同时进行,那就称为静态初始化。

静态初始化,本质是用静态数据(编译时已知)为数组初始化。此时数组的长度由静态数据的个数决定。 数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。


动态初始化

动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值。

格式:

数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];

数组存储的数据类型[] 数组名字; 数组名字 = new 数组存储的数据类型[长度];

[长度]: 数组的长度,表示数组容器中可以最多存储多少个元素。

注意:数组有定长特性,长度一旦指定,不可更改。

9.4 一维数组的使用

9.5 一维数组的遍历

9.6 数组元素的默认值

image.png

9.7 一维数组的内存分析

image.png

虚拟机栈: 用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译器可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。

堆内存: 存储对象(包括数组对象)、new来创建的,都存储在堆内存中。

方法区: 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

本地方法栈: 当本程序中调用了native的本地方法时,本地方法执行期间的内存区域。

程序计数器: 程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址。

一维数组的内存图:

image.png

数组常见异常:
  • 角标越界异常:ArrayIndexOutOfBoundsException
  • 空指针异常:NullPointerException

9.8 二维数组的声明与初始化

二维数组声明的语法格式:

二维数组声明的语法格式:

//推荐
元素的数据类型[][] 二维数组的名称;

//不推荐
元素的数据类型	二维数组名[][];
//不推荐
元素的数据类型[] 二维数组名[];

静态初始化:

格式:
int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};

动态初始化:

元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];

9.9 二维数组的长度、角标、遍历

9.10 二维数组的内存解析

image.png

Arrays工具类的使用

请查看文档。

涉及排序算法和数组操作的内容过于简单,略。