Java学习之JavaSE-Java语言基础

第一章:初识计算机和Java语言

一、计算机的体系结构

(一)计算机的基本概念

计算机(Computer)俗称电脑,是现代一种用于高级计算使用非常广泛的设备,主要由计算机硬件计算机软件两个部分组成。
计算机硬件是客观存在的各种计算机相关设备(看得见摸得到),而计算机的软件是用于控制各种硬件设备完成各种功能(看得见摸不到)。

(二)常见的主要硬件

1)中央处理器(CPU)

  • 是计算机中最核心的部件,类似于人的大脑。
  • 是一台计算机运算核心和控制核心,所有运算都由CPU完成。
  • 其功能主要是解释计算机指令以及处理计算机软件中的数据

2)内存

  • 是计算机中的存储部件,内存(Memory)也被称为内存储器。
  • 用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据
  • CPU可以直接访问内存的数据,而且效率比较高。(优点)
  • 容量小不能实现永久存储,一旦断电会造成数据的丢失。(缺点)
  • 时刻记住ctrl+s快捷键进行保存

3)硬盘

  • 是计算机中的存储部件。
  • 主要用于永久存放数据内容容量大且断电不丢失。(优点)
  • CPU不能直接访问硬盘中数据,若希望访问则需要先加载到内存中。(缺点)

4)输入输出设备

  • 其中键盘叫做标准输入设备,显示器叫做标准输出设备。

5)主板、机箱和电源等辅助设备

(三)常见的主要软件

  • 计算机软件(Computer Software)可分为系统软件应用软件系统软件就是操作系统,是其他软件的基础
  • 主流的操作系统有:Windows/Unix/Linux/IOS/Android。

计算机的体系结构图

Java学习之JavaSE-Java语言基础_第1张图片

二、Java语言的概述

(一)计算机语言的概述

  • 语言是人与人之间进行沟通的主要表达方式。
  • 计算机语言是人与计算机之间交流的表达方式,该语言有很多种。

(二)计算机语言的发展

  • 第一代语言:机器语言
    指令以二进制代码形式存在,最开始使用穿孔卡片。
  • 第二代语言:汇编语言
    使用助记符表示一条机器指令,如:ADD、SUB等。
  • 第三代语言:高级语言
    Java、C ,C++,PHP , Python,Scala等。

(三)Java语言的主要版本

  • Java SE(Java Platform, Standard Edition)称之为“Java平台标准版”,是Java平台的基础。
    1、Java SE包含了运行Java应用所需要的基础环境和核心类库。
    2、Java SE还定义了基于桌面应用的基础类库,通过使用这些类库,我们可以编写出类似于像Office那样的丰富多彩的桌面应用。
  • Java EE(Java Platform,Enterprise Edition)称之为“Java平台企业版”。
    1、Java EE构建在Java SE基础之上,用于构建企业级应用。所谓企业级应用是指那些为商业组织、大型企业而创建的应用系统,例如:电信的“计费系统”、银行的“网银系统”、企业中的“客户关系管理系统”等等。
  • Java ME (Java Platform,Micro Edition)称之为Java 平台微型版。
    1、为机顶盒、移动电话和PDA等嵌入式消费电子设备提供的Java解决方案。随着3G移动智能平台时代的到来,特别是以Java为核心编程语言的Android智能平台的迅速普及,Java ME已经走向淘汰

三、开发环境的搭建和使用(重点

(一)开发工具的下载和安装

  • 下载方式
    方式一:通过官网下载 www.sun.com 或者 www.oracle.com
    方式二:通过搜索下载 www.baidu.com
  • 安装方式
    1、若下载的是安装版,则一路点击下一步安装即可;
    2、若下载的是绿色版,则直接解压即可;
    3、无论是安装版还是绿色版,切记安装的路径中不要有中文

(二)相关的概念

  • JDK - 称为Java开发工具包( Java Development Kit)。Java开发人士需要下载和安装JDK,目前的主流版本为JDK11。
  • JRE - 称之为Java SE运行时环境(Java SE Runtime Environment),提供了运行Java应用程序所必须的软件环境等。无论是开发还是运行Java应用都必须安装。
  • javac.exe - 编译器,主要用于将高级Java源代码翻译成字节码文件
  • java.exe - 解释器,主要用于启动JVM对字节码文件进行解释并执行

(三)JDK、JRE、JVM之间的关系

Java学习之JavaSE-Java语言基础_第2张图片

(四)Java开发的常用工具

  • 文本编辑器(TE,Text Editor):记事本、Notepad++、Edit Plus、UltraEdit、…
  • 集成开发环境(IDE,Integrated Development Environment ):Jbuilder、NetBeans、Eclipse、MyEclipse、IDEA、…

(五)编写Java程序的流程

1、新建文本文档,将文件扩展名由xxx.txt修改为xxx.java;
2、使用记事本/Notepad++的方式打开文件,编写Java代码后进行保存;
3、启动dos窗口,并切换到.java文件所在的路径中;
4、使用javac xxx.java进行编译,生成xxx.class的字节码文件;
5、使用java xxx 进行解释执行,打印最终结果;

拓展:
若编写的Java代码中创建了包,如package com.company.test;
需要使用javac -d . xxx.java进行编译,生成包的文件夹以及xxx.class的字节码文件;
最后使用java 包名.xxx(如:java com.company.test.xxx)进行解释执行,打印最终结果。

打开dos窗口(命令窗口)的方式:
1.Win+R,输入cmd,回车
2…在程序所在路径下,Shift+右键,点击在此处打开命令窗口(win10的是在此处打开Powershell窗口),命令窗口中显示地址直接为程序所在路径
3.在程序所在路径的路径栏上直接输入cmd,回车即可打开命令窗口,命令窗口中显示地址直接为程序所在路径

常用dos命令
Java学习之JavaSE-Java语言基础_第3张图片

编写程序常见的错误:

  • 错误: 需要class, interface或enum => 通常都是class等关键字拼写错误
  • 错误: 找不到符号 => 通常因为单词拼写错误或Java中不支持这样的单词
  • 错误: 需要’;’ => 通常都是因为少写分号,加上英文版分号即可
  • 错误: 非法字符: ‘\uff1b’ => 通常是因为出现了中文标点符号,修改为英文版即可
  • 错误: 在类 PrintTest 中找不到 main 方法, 请将 main 方法定义为: =>main写成了mian

Java11新特性之简化的编译运行:
1、新建文本文档,将文件扩展名由xxx.txt修改为xxx.java;
2、使用记事本/Notepad++的方式打开文件,编写Java代码后进行保存;
3、启动dos窗口,并切换到.java文件所在的路径中;
4、使用java xxx.java 进行编译运行,打印最终结果(慎用);

(六)常用的快捷键

ctrl+s 保存 ctrl+c 复制 ctrl+v 粘贴 ctrl+a 全选 ctrl+x 剪切
ctrl+z 撤销 ctrl+f 搜索 ctrl+shift 切换输入法,使用shift进行中英文切换
windows+d 回到桌面 windows+e 打开计算机 windows+l 锁屏
windows+r 打开运行,输入cmd后回车就会启动dos窗口
windows+tab 切换任务 alt+tab 切换任务 ctrl+alt+delete 启动任务管理器

(七)注释

注释用于进行代码说明,是给程序员看的文字描述,编译器会忽略注释。
基本分类:

  • // 单行注释,从 // 开始,到本行结束,都是注释。
  • /* */ 多行注释,中间所有都是注释。
  • /** */ 多行/文档注释,中间所有都是注释,是一种支持提取的注释。

注意:多行注释不允许嵌套使用

(八)环境变量的配置

  • 基本概念:
    通常情况下可执行文件只能在该文件所在的路径中使用,为了使得该可执行文件可以在任意路径中使用,则需要将该文件所在的路径信息配置到环境变量Path中。
  • 配置方式:
    计算机 => 右击,选择属性 => 高级系统设置 => 高级 => 环境变量 =>系统变量 => 找到Path,点击编辑 => 将javac.exe所在的路径信息配置到Path变量值的最前面,加上英文版的分号(如:C:\Program Files\Java\jdk-11.0.2\bin) => 一路点击确定即可
    拓展:
    为了以后方便更换JDK版本,可以事先在系统变量中点击新建,然后填写,变量名:JAVA_HOME,变量值:JDK安装路径的地址(如:C:\Program Files\Java\jdk-11.0.2),然后编辑Path时,在变量值的最前面添加%JAVA_HOME%\bin;即可,其余操作都和上面一样。
  • 注意事项:
    切记Path变量原来的变量值不要删除,配置完毕后记得重启dos窗口!

(九)跨平台原理

同一份Java字节码可以通过不同的JVM翻译为具体平台能够执行的机器指令。定义了JVM规范,而且不同的操作系统大多提供了JVM实现,才使得相同的一个字节码文件可以在不同的系统上运行,从而使Java赢得了“一次编译,到处使用”的美名。

第二章:Java语言的编程基础

一、变量(重点

(一)变量的基本概念

  • 当需要在程序中记录单个数据内容时,则声明一个变量即可,而声明变量的本质就是在内存中申请一个存储单元,由于该存储单元中的数据内容可以发生改变,因此得名为"变量"
  • 由于存放的数据内容大小不一样,导致所需存储单元的大小不一样,在Java语言中使用数据类型加以描述,为了便于下次访问还需要给该变量指定一个名字,用于记录该变量对应的存储单元

(二)变量的声明方式

数据类型 变量名 = 初始值;
注意:其中=初始值可以省略,但;不可以省略

(三)变量的注意事项

  • Java是强类型语言,变量在使用前必须声明来指明其数据类型
  • 变量在使用之前必须初始化
  • 变量不能重复声明

(四)标识符的命名法则(熟记

  • 数字、字母、下划线以及$等组成,其中数字不能开头
  • 不能使用Java语言的关键字,所谓关键字就是Java语言用于表示特殊含义的单词。
  • 区分大小写,长度没有限制但不宜过长。
  • 尽量做到见名知意,支持中文但不推荐使用。
  • 标识符可以给类/变量/属性/方法/包起名字

拓展:

Java语言中的关键字

Java学习之JavaSE-Java语言基础_第4张图片

二、数据类型

(一)数据类型的分类

在Java语言中数据类型主要分为两大类:

  • 基本数据类型(熟记
    byte、short、int、long、float、double、boolean、char
  • 引用数据类型(了解)
    数组、类、接口、枚举、标注

注意:String不是基本数据类型,是引用数据类型

(二)常用的进制

  • 在日常生活中采用十进制进行数据的描述,逢十进一,十进制权重是: 100、101、102、…
  • 在计算机的底层采用0和1组成的二进制序列进行数据的描述,逢二进一,二进制的权重是20、21、22、…
  • 二进制中的最高位(最左边)用于代表符号位,若该位是0则表示非负数,若该位是1则表示负数
  • 八进制和十六进制其实都是二进制的简写。

(三)进制之间的转换

1)正十进制转换为二进制的方式

  • 除2取余法,使用十进制整数不断地除以2取出余数,直到商为0时将余数逆序排序
  • 拆分法,将十进制整数拆分为若干个二进制权重的和,有该权重下面写1,否则写0。
    拆分法举例:十进制45转二进制的结果是:0010 1101
    在这里插入图片描述

(先取小于45且最靠近的二进制权重,后面同样以此类推)45=>32+8+4+1;

2)正二进制转换为十进制的方式

  • 加权法,使用二进制中的每个数字乘以当前位的权重再累加起来。

3)负十进制转换为二进制的方式

  • 先将十进制的绝对值转换为二进制,然后进行按位取反再加1。

注意:负数的需要补码:按位取反,再加1
Java学习之JavaSE-Java语言基础_第5张图片

4)负二进制转换为十进制的方式

  • 先减1再按位取反,合并为十进制整数后添加负号

Java学习之JavaSE-Java语言基础_第6张图片

(四)单个字节表示的整数范围(重点)

在计算机中单个字节表示八位二进制位,其中最高位(最左边)代表符号位,使用0代表非负数,使用1代表负数,具体表示的整数范围如下:

  • 非负数表示范围:0000 0000 ~ 0111 1111 => 0 ~ 127 => 0 ~ 2^7-1
  • 负数表示范围:1000 0000 ~ 1111 1111 => -128 ~ -1 => -2^7 ~ -2^0
  • 单个字节表示的整数范围是:-2^7 ~ 2^7-1,也就是-128 ~ 127.

拓展:

  • 原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
  • 反码:
    正数的反码:与原码相同;
    负数的反码:原码的符号位不变,其余位皆取反
  • 补码:
    正数的补码:与原码相同;
    负数的补码:反码+1

(五)整数类型

  • Java语言中描述整数数据的类型有:byte、short、int、long,默认int类型
  • 其中byte类型在内存空间中占1个字节,表示范围是:-2^7 ~ 2^7-1.
  • 其中short类型在内存空间中占2个字节,表示范围是:-2^15 ~ 2^15-1.
  • 其中int类型在内存空间中占4个字节,表示范围是:-2^31 ~ 2^31-1.
  • 其中long类型在内存空间中占8个字节,表示范围是:-2^63 ~ 2^63-1.
  • 在Java程序中直接写出的整数数据叫做直接量/字面值/常量,默认为int类型。若希望表达更大的直接量,则在直接量的后面加上l或者L,推荐L。

(六)浮点类型

  • Java语言中用于描述小数数据的类型:float 和double,默认double类型
  • 其中float类型在内存空间占4个字节,叫做单精度浮点数,可以表示7位有效数字,范围:-3.403E38~3.403E38。
  • 其中double类型在内存空间占8个字节,叫做双精度浮点数,可以表示15位有效数字,范围:-1.798E308~1.798E308。
  • Java程序中直接写出的小数数据叫做直接量,默认为double类型,若希望表达float类型的直接量,则需要在直接量的后面加上f或者F.

(七)布尔类型

  • Java语言中用于描述真假信息类型有:boolean,数值只有:true 和false
  • 布尔类型在内存空间中所占大小没有明确的规定,可以认为是1个字节。
  • 布尔表达式书写规范:
    boolean flag= true;
    虽然if(flag == ture)可以,但更推荐if(flag)和if(!flag)

(八)字符类型

  • Java语言中用于描述单个字符的数据类型:char类型。如:‘a’、'中’等。
  • 其中char类型在内存空间中占2个字节并且没有符号位,表示的范围是:0 ~ 65535,由于现实生活中很少有数据能够被单个字符描述,因此以后的开发中更多的使用由多个字符串起来组成的字符串,使用String类型加以描述,如:“hello”等。
  • 计算机的底层只识别0和1组成的二进制序列,对于字符’a’这样的图案来说不满足该规则,因此该数据无法直接在计算机中存储,但现实生活中存在这样的图案数据需要计算机存储,为了使得该数据能够存储起来就可以给该数据指定一个编号,然后将编号存储起来即可,该编号就叫做ASCII。
  • 要求掌握的ASCII有:‘0’ -48 ‘A’ -65 ‘a’ -97 空格-32 换行符-10
  • Java字符类型采用Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。
  • 要求掌握的转义字符有:\" ->" \’ ->’ \\->\ \t ->制表符 \n ->换行符

拓展:

ASCII码表

(九)基本数据类型之间的转换

  • Java语言中基本数据类型之间的转换方式:自动类型转换和强制类型转换,又称隐式转换和显式转换。
  • 其中自动类型转换主要指从小类型到大类型之间的转换
  • 其中强制类型转换主要指从大类型到小类型之间的转换,语法格式如下:
    目标类型 变量名 = (目标类型)原类型 变量名;
  • 强转有风险,操作需谨慎!

在这里插入图片描述
数据类型转换遵循的原则:“勿以小物盛大物”。
强制类型转换会导致精度损失:

  • float f = (float)3.1415926; (double强转float,精度失准)
  • int i = (int)f; (小数点后丢失)
  • byte b = (byte)129; (数值越界溢出)

第三章:Java语言的运算符

一、运算符(重点)

(一)算术运算符

  • +表示加法运算符
  • -表示减法运算符
  • *表示乘法运算符
  • / 表示除法运算符
  • % 表示取模/取余运算符

拓展:

  • +既可以作为字符串连接,也可以作为加法运算符
  • 只要+两边的操作数中有一个操作数是字符串类型的,则该+就被当做字符串连接符处理,否则当做加法运算符处理

(二)关系/比较运算符

  • >表示是否大于运算符>= 表示是否大于等于运算符
  • < 表示是否小于运算符<= 表示是否小于等于运算符
  • == 表示是否等于运算符!= 表示是否不等于运算符
  • 所有以关系运算符作为最终运算的表达式结果一定是boolean类型。所以,不能串接使用关系运算符,如:a
  • a == 2; // 表示判断变量a的数值是否等于2
    2 == a; // 表示判断2是否等于变量a的数值,从结果上来看,与上面表达式等价,但更推荐这种方式
    原因:a == 2; 容易编写成为a = 2;并且编译不会报错,而2 == a;若编写成为2 = a;编译会报错,可以减少bug

(三)自增减运算符

  • ++ 表示自增运算符,用于使得当前变量自身的数值加1的效果
  • –表示自减运算符,用于使得当前变量自身的数值减1的效果

注意:

  • 只能用于变量,常数不可以
  • 单元运算符不可以放在括号之外,如:(a+b)++
  • a++这个整体叫做表达式,其中a叫做操作数/变量,而a++和a表示不同的含义,所以它们所占的存储空间应该不同。其中,后++表示先让变量a的数值作为整个表达式的最终结果,然后再让a变量的数值加1,前++则表示先让变量a自身的数值加1,然后再让变量的数值作为整个表达式的结果

(四)逻辑运算符

1)内容

  • && 表示逻辑与运算符,相当于"并且",同真为真,一假为假
  • || 表示逻辑或运算符,相当于"或者",一真为真,同假为假
  • ! 表示逻辑非运算符,相当于"取反",真为假,假为真
  • 逻辑运算符的操作数均为boolean表达式

2)逻辑运算符的图解

Java学习之JavaSE-Java语言基础_第7张图片

3)逻辑运算符的短路特性

  • 对于逻辑与运算符来说,若第一个表达式为假则结果为假,此时跳过第二个表达式;
  • 对于逻辑或运算符来说,若第一个表达式为真则结果为真,此时跳过第二个表达式;

4)逻辑运算符作用

主要用于连接多个关系运算符作为最终运算的表达式,用于实现多条件的连接

(五)条件/三目运算符

  • 格式:条件表达式? 表达式1: 表达式2
  • 判断条件表达式是否成立,若成立则执行表达式1,否则执行表达式2 。

(六)赋值运算符

  • = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量,覆盖变量原来的数值。
  • 赋值表达式本身也有值,其本身之值即为所赋之值。
  • +=、-=、*=、/=、…

拓展:

  • byte b = 1;
    b = b + 2; // 错误:不兼容的类型:从int转换为byte可能会有损失 =>byte + int 相加结果还是int类型
    b = b + (byte)2; // 错误:不兼容的类型:从int转换为byte可能会有损失 =>byte + byte 相加结果还是int类型,原因是编译器的优化,当byte + byte时,编译器自动将byte类型优化为int类型,再进行加法运算。
  • 编译器自动优化为int的原因是,byte的取值范围太小,两个byte相加很容易超过byte的取值范围,从而造成高位溢出,数据的丢失。
  • b = (byte)(b + 2); // 强制类型转换,将int类型转换为byte类型
    b += 2; // 不会报错,所以此表达式真正等价于b = (byte)(b + 2); 这也是与b = b + 2;表达式的区别所在

(七)移位运算符

  • << 左移运算符,用于将数据的二进制位向左移动,右边使用0补充
  • >> 右移运算符,用于将数据的二进制位向右移动,左边使用符号位补充
  • >>> 表示逻辑右移运算符,用于将数据的二进制位向右移动,左边使用0补充。

Java学习之JavaSE-Java语言基础_第8张图片
Java学习之JavaSE-Java语言基础_第9张图片
Java学习之JavaSE-Java语言基础_第10张图片
拓展:

  • 正数右移一直都是正数。
  • 负数右移一直都是负数。
  • 无符号右移不管初始为正负,一律补0。
  • byte和short属于低精度的整型,不适合用于无符号右移,否则结果会溢出。
  • 如:byte b1 = 10;byte b2 = b1 << 1; // 错误:不兼容的类型:从int转换为byte可能会有损失 =>移位运算符自动将byte提升为int

(八)位运算符

  • & 表示按位与运算符,按照二进制位进行与运算,同1为1,一0为0.
  • | 表示按位或运算符,按照二进制位进行或运算,一1为1,同0为0.
  • ~ 表示按位取反运算符,按照二进制位进行取反,1为0,0为1.
  • ^ 表示按位异或运算符,按照二进制位进行异或运算,同为0,不同为1.

位逻辑运算结果
Java学习之JavaSE-Java语言基础_第11张图片
注意:位运算符没有短路特性,左右两边的表达式均要执行

(九)运算符的优先级

  • ()的优先级极高。
  • =的优先级极低。
  • 若无法确认优先级,则使用()来确保即可。
运算符的优先级列表

Java学习之JavaSE-Java语言基础_第12张图片
总结:

  • 从操作数个数来看,单目运算符的优先级高于双目运算符的优先级。
  • 按照运算符的作用来看,()这种级别最高,之后依次是算数运算符,位运算符,关系运算符,逻辑运算符,赋值运算符。

第四章:流程控制语句

一、分支结构(重点

(一)分支结构的概念

  • 当需要进行条件判断并做出选择时,使用分支结构。

(二)if分支结构

if(条件表达式) {
	语句块;
}
  • 判断条件表达式是否成立
    => 若成立,则执行语句块;
    => 若不成立,则跳过语句块;

(三)if else分支结构

if(条件表达式) {
	语句块1;
} else {
	语句块2;
}
  • 判断条件表达式是否成立
    => 若成立,则执行语句块1;
    => 若不成立,则执行语句块2;

(四)if else if else分支结构

if(条件表达式1) {
	语句块1; 
}
else if(条件表达式2) {
	语句块2; 
}
else {
	语句块n; 
}
  • 判断条件表达式1是否成立
    => 若成立,则执行语句块1;
    => 若不成立,则判断条件表达式2是否成立
    => 若成立,则执行语句块2;
    => 若不成立,则执行语句块n;
  • if和else if都需要判断表达式的真假,else不需要,else if和else都必须配合if一起使用,不能单独使用

(五)switch case分支结构

switch(变量/表达式) {
	case 字面值1: 语句块1; break;
	case 字面值2: 语句块2; break;
	...
	default:语句块n;
}
  • 计算变量/表达式的数值=> 判断是否匹配字面值1
    => 若匹配,则执行语句块1 => 执行break跳出当前结构
    => 若不匹配,则判断是否匹配字面值2
    => 若匹配,则执行语句块2 => 执行break跳出当前结构
    => 若不匹配,则执行语句块n
  • switch()中支持的数据类型有:byte、short、char以及int类型,从jdk1.5开始支持枚举类型,从jdk1.7开始支持String类型。
  • switch() case 中,若default位于最后,则加不加break都可以,最终都会结束分支;若default不位于最后,位于其他位置,若不加break,同样会穿透到下面,不会结束分支

二、循环结构(重点

(一)循环结构的概念

  • 在Java程序中若希望重复执行一段代码时,就需要使用循环结构。
  • 任何复杂的程序逻辑都可以通过顺序、分支、循环三种程序结构实现。

(二)for循环

for(初始化表达式; 条件表达式; 修改初始值表达式) {
	循环体;
}
  • 执行初始化表达式=> 判断条件表达式是否成立
    => 成立则执行循环体=> 修改初始值表达式=> 判断条件是否成立
    => 若不成立,则循环结束

(三)双重for循环的格式

for(初始化表达式1; 条件表达式2; 修改初始值表达式3) {
	for(初始化表达式4; 条件表达式5; 修改初始值表达式6) {
		循环体;
	}
}
  • 执行表达式1 => 判断表达式2是否成立
    => 若成立,则执行表达式4 => 判断表达式5是否成立
    => 若成立,则执行循环体=> 执行表达式6 => 表达式5是否成立
    => 若不成立,则内层循环结束=> 表达式3 => 表达式2是否成立
    => 若不成立,则外层循环结束
  • 双重for循环的特点
    1、外层循环用于控制打印的行数,内层循环用于控制打印的列数,外层循环改一下,内层循环从头到尾跑一圈。
    2、在以后的开发中若需要打印多行多列时,需要使用双重循环。
    3、多重循环不宜嵌套太多层,否则效率很低。一般到三重循环即可,最常见的就是双重循环。

(四)while循环

while(条件表达式) {
	循环体;
}
  • 判断条件表达式是否成立
    => 若成立,则执行循环体=> 判断条件表达式是否成立
    => 若不成立,则循环结束

(五)while循环和for循环比较

  • while循环和for循环完全可以互换,当然推荐使用for循环。
  • while循环更适合于明确循环条件但不明确循环次数的场合中。
  • for循环更适合于明确循环次数或范围的场合中。
  • while(true) 等价于for( ; ; ) 都表示无限循环。

(六)do while循环

do {
	循环体;
} while(条件表达式);
  • 执行循环体=> 判断条件表达式是否成立
    => 若成立,则执行循环体=> 判断条件表达式是否成立
    => 若不成立,则循环结束
  • do-while循环主要用于至少执行一次循环体的场合中。

(七)continue关键字

  • continue语句用在循环体中,用于结束本次循环而开始下一次循环

(八)break关键字

  • break用于退出当前语句块,break用在循环体中用于退出循环
  • for( ; ; ) -这种没有循环条件的循环叫做无限循环,俗称“死循环”。
  • 在嵌套的循环结构中,break用于退出所在循环体,如果要退出外层循环体,需要使用标号的方式。
outer:for (...) {
	for (...) {
		break outer;
	}
}

第五章:数组的概念和应用

一、一维数组

(一)一维数组的基本概念

  • 当需要在Java程序中记录单个数据内容时,则声明一个变量即可。
  • 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数组即可,一维数组本质上就是在内存空间中申请一段连续的存储单元
  • 数组是相同数据类型的多个元素的容器,元素按线性顺序排列,在Java语言中体现为一种引用数据类型。

(二)一维数组的声明方式

  • 数据类型[] 数组名称= new 数据类型[数组的长度];
  • 调用数组的length属性可以获取数组的长度
  • 可以通过下标的方式访问数组中的每一个元素需要注意的是:数组的下标从0开始,对于长度为n的数组,下标的范围是0~n-1

(三)一维数组的初始化方式

  • 基本类型的数组(数据元素为基本类型)创建后,其元素的初始值:byte、short、char、int、long为0;float和double为0.0;boolean为false。
  • 可以在数组声明的同时进行初始化,具体如下:
    数据类型[] 数组名称= {初始值1, 初始值2, …};
    int[] arr1 = new int[2]; // 推荐该方式,更容易与变量的声明区分,提高了代码的可读性 动态方式
    int[] arr2 = {1,2,3};
    boolean[] arr4 = new boolean[]{true, true, false, false}; // 特殊的写法 静态方式

(四)数组的优缺点

  • 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快。
  • 数组要求所有元素的类型相同。
  • 数组要求内存空间连续,并且长度一旦确定就不能修改
  • 增加和删除元素时可能移动大量元素,效率低。

拓展:

  • brr = arr;表示将变量arr的数值赋值给变量brr,覆盖变量brr中原来的数值
    数组名arr的内存空间中存放的是数据在堆区中的内存地址信息,赋值后让brr变量中存放了arr所指向堆区的内存地址
    也就是让brr和arr指向了同一块堆区空间,本质上就是改变指向而已
  • int[] scores = new int[num]; // 变长数组 : 主要指变量可以作为数组的长度,但绝不是数组的长度可以发生改变

(五)内存结构之栈区

  • 栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开始到结束会有多次变量的声明。

(六)内存结构之堆区

  • JVM会在其内存空间中开辟一个称为“堆”的存储空间,这部分空间用于存储使用new关键字创建的数组和对象。

(七)数组工具类

1)数组工具类的概念

  • java.util.Arrays类可以实现对数组中元素的遍历、查找、排序等操作。

2)数组工具类的常用方法

Java学习之JavaSE-Java语言基础_第13张图片

  • Java官方提供的拷贝功能
    System.arraycopy(arr, 1, brr, 0, 3); // 表示将数组arr中下标从1开始的3个元素拷贝到数组brr中下标从0开始的位置

二、二维数组

(一)二维数组的概念

  • 二维数组本质上就是由多个一维数组摞在一起组成的数组,二维数组中的每个元素都是一维数组,而一维数组中的每个元素才是数据内容。

(二)二维数组的声明和初始化方式

  • 数据类型[][] 数组名称= new 数据类型[行数][列数];
  • 数据类型[][] 数组名称= {{元素1, 元素2,…}, …};
int[][] arry1 = {{1,2,3},{4,5,6}};
int[][] arry2 = new int[][]{{1,2,3},{4,5,6}};
int[][] arry3 = new int[2][3];
// 给第一行赋值
arry3[0] = new int[]{1,2,3}; 
// 给第二行赋值
arry3[1][0] = 4;
arry3[1][1] = 5;
arry3[1][2] = 6;

你可能感兴趣的:(Java学习,java,javase)