JAVA环境搭建及入门

Java环境搭建及入门基础语法

Java概述

Java语言 背景介绍

1 Java语言背景

  • 语言:人与人交流沟通的表达方式
  • 计算机语言:人与计算机之间,进行信息交流沟通的一种特殊语言
  • Java语言诞生于1995年,是Sun(Stanford University Network)公司推出的一门计算机语言
  • 公认的Java之父:詹姆斯·高斯林(James Gosling)

2 Java语言的三个版本分别是? 

  • Java SE:Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础
  • Java ME : Java 语言的(小型版),用于嵌入式消费类电子设备
  • Java EE:Java 语言的(企业版),用于 Web 方向的网站开发

Java语言 跨平台原理

1 常用的操作系统(平台)有哪些?

  • Windows
  • Mac
  • Linux

2 Java的跨平台原理概述?

  • 跨平台:Java 程序可以在任意操作系统上运行,实现了一次编写,到处运行
  • 跨平台原理概述:在需要运行 Java 应用程序的操作系统上,安装一个与操作系统对应的 Java 虚拟机(JVM Java Virtual Machine)即可

JVM 虚拟机本身不允许跨平台,允许跨平台的是 Java 程序(我们的代码)

一次编写,到处运行

JRE和JDK

1 Java程序开发的三个步骤?

1. 编写代码:书写正确的代码

2. 编译代码:通过javac命令编译java文件,编译成功后,会生成对应的字节码文件

3. 运行代码:通过java命令运行

2 JDK、JRE和JVM分别是什么?有什么作用?

  • JDK(Java Develop Kit)是 Java 语言的软件开发工具包,内部包含了代码的编译工具和运行工具
  • JRE(Java Runtime Environment)指Java运行环境,包含 JVM 虚拟机及 Java 核心类库
  • JVM(JVM Java Virtual Machine)Java 虚拟机
  • 核心类库:我们自己在编写代码的过程中,需要用到 java 已经写好的这些 java 文件

• 类 :java 文件在代码中的集合体现

• 类库:存放多个 java 文件的仓库

包含关系:(JDK1.8之后)JDK 包含JRE 包含JVM

3 JDK的下载和安装

JDK下载地址:https://www.oracle.com

JDK安装目录包含的文件夹

  • bin:该目录下存放了 JDK 的各种工具命令。javac 和 java 就放在这个目录
  • conf:该目录下存放了 JDK 的相关配置文件
  • include:该目录下存放了一些平台特定的头文件
  • jmods:该目录下存放了 JDK 的各种模块
  • legal:该目录下存放了 JDK 各模块的授权文档
  • lib:该目录下存放了 JDK 工具的一些补充 JAR 包
  • 其余文件为说明性文档

第一个Java程序

常用DOS命令

学习目的:JDK提供的[编译]和[运行]工具,并不是双击使用的,我们需要在DOS中通过命令去执行

如何打开DOS命令窗口?

  • win + R,在弹出的窗口输入cmd,敲回车

常用DOS命令有哪些?

  • 切换盘符:盘符名称:
  • 展示当前目录下所有内容:dir
  • 进入某目录:cd + 目标文件夹名
  • 进入多级目录:cd + 目录1\目录2..
  • 回退上一级目录:cd..
  • 回退到根目录:cd\
  • 清理屏幕:cls
  • 退出DOS命令窗口:exit

快速在DOS打开某文件夹目录:通过图形化界面进入目标目录,在[路径栏]输入cmd + 回车

Path环境变量的配置

为什么要配置环境变量?

  • 目的:在计算机中的任意位置,都能访问到bin目录下的javac和java工具

环境变量的配置流程?

  • 我的电脑右键 - 属性 - 高级系统设置 - 环境变量

• 系统变量中:新建变量名为 JAVA_HOME,值为JDK的安装路径

• 系统变量中:找到Path,新建变量 %JAVA_HOME%\bin

• 然后点击三个[确定],缺一不可!

扩展另一种配置方式

  • 在Path中直接配置bin目录的[绝对路径]

HelloWorld案例 的编写和执行

编写和执行的操作流程

  • 步骤1:新建txt文件,文件名为HelloWorld,后缀改为.java
  • 步骤2:书写正确代码,并保存
  • 步骤3:打开DOS命令台,找到该java代码的存放目录
  • 步骤4:使用javac进行编译,如果代码正确,则编译通过,产生对应的字节码文件(.class文件)
  • 步骤5:使用java运行,控制台显示内容:HelloWorld

javac编译和java运行时的书写

  • 范例:javac 文件名.java(带文件后缀,大小写一致)
  • 范例:java 文件名(不带文件后缀)

HelloWorld案例 详解

了解内容

  • public:公共的,权限修饰符,Java中有四种权限修饰符
  • class:代表这是一个类,后面跟类名
  • HelloWorld:类名,我们自己起的。
  • static:静态的意思,后面课程会详解
  • void:表示main方法的返回值类型为空,基础班第五天学习[方法]
  • main:方法名,Java开发人员起的,我们不能改变它

• 注意:main方法是程序的[入口],程序一运行,计算机会找到main方法,执行其中的代码逻辑

  • String[]:字符串数组,基础班第四天学习[数组],第八天学习[字符串]
  • args:方法的形式参数名称,基础班第五天学习[方法]
  • System.out.println();

• 整体记忆!这一句话的作用是,在控制台(DOS窗口)打印小括号内的内容

HelloWorld案例 常见问题

什么是Bug?

  • 程序出现的错误,我们通常称其为Bug

• 解决Bug:多看、多思考、多查阅资料、多尝试总结。以后的开发工作Bug会一直伴随我们,所以不要怕错,重要是提升解决问题的能力!

入门案例常见问题?

  • 问题1:文件名与类名不一致(必须一模一样,包括大小写)
  • 问题2:英文字母大小写(String和System的首字母要大写)
  • 问题3:标点符号使用英文(小写标点)

• 输入法的配置,配置为[中文时使用英文标点]

  • 问题4:丢失括号(建议写括号时成双成对的写)
  • 问题5:忘记保存(此时编译,会编译保存前的代码,会出现意想不到的结果)

• Ctrl + S为保存的快捷键(后期的编码工具不需要手动保存)

Notepad软件的安装使用

有哪些初始配置?为什么这样配置?

  • 设置 - 首选项 - 右边选择[新建]

• [默认语言]改为Java

• [编码]改为ANSI

• 编码和解码需要保持同一种规则(编码字符集),我们使用Notepad编码,使用DOS解码,两边需要同样的规则(配置相同的编码字符集为ANSI),这样的目的是解决[中文乱码问题]

高级记事本高级在哪?

  • 体现1:显示行号
  • 体现2:对关键字特殊颜色显示
  • 体现3:换行自动缩进
  • 体现4:快速设置编码字符集等
  • 体现5:快速定位当前java文件,并打开DOS窗口,可以对着[文件名]右键,选择[打开所在文件夹(命令行)]

基础语法

1 注释

什么是注释?

  • 对代码解释说明的文字信息,方便程序员阅读代码(学习要求必须写注释)

注释的分类?

  • 单行注释 //
  • 多行注释 /* 内容 */
  • 文档注释 /** 内容 */(了解)

多行注释不能嵌套使用;注释不参与编译和运行!

2 关键字

什么是关键字?

  • 被Java赋予了特殊含义的英文单词

• 目前我们接触到的关键字:public、class、static、void

关键字的特点?

  • 特点1:英文小写
  • 特点2:编辑器对其有特殊颜色标记

3 常量

什么是常量?

  • 程序运行过程中,其值不会发生改变的量(数据)

常量的分类?

  • 整数常量:-100 200
  • 小数常量:5.5 3.14
  • 字符常量:'A' '7' '男'

• 字符是单引号引起来的[单个内容]

  • 字符串常量:"HelloWorld"
  • 布尔常量:值只有true和false
  • 空常量:null

• 空常量(null)不能直接打印,否则报错

4 变量介绍

变量:本质是内存中的存储空间,空间中存着经常发生改变的量

5 数据类型

了解内容

  • 最小信息单元:bit,比特位,通常用 b 表示
  • 最小的存储单元:byte,字节,通常用 B 表示
  • 一个byte字节,由8个bit位组成
  • 1B(字节) = 8bit、1KB = 1024B、1MB = 1024KB                   1GB = 1024MB、1TB = 1024GB、1PB = 1024TB

Java是一门强类型语言,不同数据类型分配了不同的[内存空间],所以他们表示的[数据大小]也不一样

Java中数据类型分类?

  • 基本数据类型分为 [四类八种]

• 整型:byte short int(默认) long

• 浮点型:float double(默认)

• 100;

• 字符型:char

• 布尔型(非数值):boolean

  • 引用数据类型:数组([])、类(class)、接口(interface)..

6 变量的定义和使用

定义变量的格式?

  • 数据类型 变量名 = 变量值;

• 范例1:int age = sc.nextInt();

• 范例2:double price = 99.99;

• 范例3:boolean result = true;

如何使用变量?

  • 使用变量的标识(变量名)

• 范例1:System.out.println(age);

• 范例2:System.out.println(price);

• 范例3:System.out.println(result);

使用变量的注意事项

  • 注意1:变量名不能重复定义
  • 注意2:一条语句可定义多个变量,中间用逗号分隔(不推荐)
  • 注意3:变量在使用前必须赋值
  • 注意4:定义float类型变量,在数据末尾加F;定义long类型变量,在数据末尾加L
  • 注意5:变量的作用域范围

7 键盘录入对象 Scanner

学习目的:让我们操作的数据,更加灵活(之前数据都是写死的)

使用步骤?

  • 步骤1:导包

• import java.util.Scanner;

  • 步骤2:创建对象

• Scanner sc = new Scanner(System.in);

  • 推荐步骤:控制台提示

• System.out.println("请输入一个整数:");

  • 步骤3:调用方法,接收数据

• int num = sc.nextInt();

注意:自己起的类名,不能和系统已有的类名相同,否则程序会出现错误(例如:Scanner、String、System不可用作自己的类名)

8 标识符

什么是标识符?

  • 给类、方法、变量等起名字的符号

标识符的定义规则?

  • 规则1:由数字、字母、_、$组成
  • 规则2:不能是Java的关键字
  • 规则3:不能以数字开头
  • 规则4:区分大小写

• 命名约定

• 约定1:小驼峰命名法

• 用于变量、方法..

• 约定2:大驼峰命名法

• 用于类

 运算符

类型转换

隐式转换(自动转换)

为什么学习类型转换?

  • 因为Java中基本数据类型,本质上的区别是数据取值范围大小不一样。那么在操作过程中,会出现赋值、互相转换的过程

隐式转换?

  • 也称为自动转换,是将取值范围小的数据,赋值给取值范围大的数据,可以直接赋值(计算机自动完成)
  • 范例1:double d = 10;
  • 范例2:long l = 10;

数据范围从小到大

  • byte -> short (char) -> int -> long -> float -> double

隐式转换注意细节

  • 细节1:小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算

• 范例:int a = 10; double b = 12.3; double c = a + b; //这里的a会提升为double再参与运算

  • 细节2:byte、short、char在运算时,不管是否有更高的类型存在,都会自动提升为int类型,然后再参与运算

• 范例2:byte a = 10; byte b = 10; int c = a + b; //这里的a和b会提升为int再相加,所以需要用int来接收

强制转换

强制转换?

  • 将取值范围大的数据,赋值给范围小的数据
  • 范例1:int a = 5.5; //编译报错
  • 范例2:int b = 10000000L; //编译报错

强转的格式?

  • 目标数据类型 变量名 = (目标数据类型) 变量值;
  • 范例1:int a = (int)5.5; //手动书写强转格式
  • 范例2:int b = (int)100000000000L; //手动书写强转格式

强转会造成数据精度的丢失,不建议使用

案例 - 类型转换案例

int a = 10,b = 20; byte c = a + b; //怎么理解这段代码?

  • 编译报错,由于a和b是int类型,相加的结果也是int类型,要将一个int类型的结果赋值给byte,需要强转:byte c = (byte)(a + b);

byte b = 10 + 20; //怎么理解这段代码?

  • 由于10和20是两个常量,在Java中存在[常量优化机制],编译是会判断10+20的结果,在不在byte的范围内,如果在编译通过直接赋值;如果不在则报错

运算符

[ 1 ] 算数运 算符

什么是运算符?

  • 对常量或变量进行操作的[符号]

什么是表达式?

  • 用运算符将常量或变量连接起来,并且符合Java语法的式子

算数 运算符

  • 加 +
  • 减 -
  • 乘 *
  • 除 /:整数相除只能得到整数,如果想带有小数的结果,必须有小数(浮点数)参与运算

• 范例1:10 / 3.0 = 3.3333333333333335

• 范例2:10.0 / 3 = 3.3333333333333335

  • 取余 %:两数相除,只取余数

• 范例:10 % 3 = 10 / 3 = 商3...余1 //计算机看到是%,只取余数1

字符的+操作

char字符在参与运算时,是怎么提升为int的?

  • 对应ASCII码表中10进制的int值
  • ASCII:美国信息交换标准代码,计算机中[字节]到[字符]的一套对应关系(不要去背! 会查即可)

字符串的+操作

当+号遇到字符串,这时的+号是?

  • 是字符串连接符。字符串可以使用+号和任意类型进行[拼接]

案例 - 数值拆分

int ge = num % 10;

int shi = num / 10 % 10;

int bai = num / 100;

[ 2 ] 自增自减 运算符

自增自减 运算符

  • ++:变量自身+1,可用于变量前、后
  • --:变量自身-1,可用于变量前、后

变量单独使用和参与操作时的区别?

  • 单独使用:在前在后效果一样(常用)
  • 参与操作

• 符号在前:先拿变量自增或自减,再拿结果参与操作

• 符号在后:先拿变量参与操作,然后将结果自增或自减

[ 3 ] 赋值 运算符

赋值 运算符

  • 基本赋值运算符:=

• 将等号右边的值,赋给左边的变量

  • 扩展赋值运算符:+=、-=、*=、/=、%=

• 将等号两边的值参与运算,再将结果,赋给左边的变量

扩展赋值运算符的特点?

  • 隐含了强转

[ 4 ] 关系 运算符

关系运算符也称为“比较运算符”

  • 等于 ==
  • 不等于 !=
  • 大于>
  • 大于等于 >=
  • 小于 <
  • 小于等于 <=

含有关系运算符的表达式,称为关系表达式

关系表达式的结果,都是什么类型?

  • 结果只能是true和false,都是boolean类型

[ 5 ] 逻辑 运算符

逻辑 运算符

  • 与 &:遇false则false
  • 或 |:遇true则true
  • 非 !:取反
  • 异或 ^:相同为false,不同为true

作用:整合多个关系表达式的条件,结果也都是boolean类型

短路逻辑 运算符

短路逻辑运算符的特点?

  • 短路与 &&:遇fasle则短路(作用上和逻辑运算符结果一样)
  • 短路或 | |:遇true则短路(作用上和逻辑运算符结果一样)

以后推荐使用短路逻辑运算符,可以提升代码的效率

[ 6 ] 三元 运算符

三元运算符的格式?

  • 对应数据类型 变量名 = 关系表达式 ? 位置1 : 位置2;

执行流程:判断关系表达式的结果,为true返回表达式1,为false返回表达式2

案例 - 三个和尚

十一 分支结构 - if语句

流程控制语句 - 顺序结构

作用:通过一些语句,来控制程序(代码)的执行流程

流程控制语句分为

  • 1. 顺序结构:默认执行流程
  • 2. 分支结构:if、switch
  • 3. 循环结构:for、while、do..while

什么是顺序结构?

  • 是Java程序的默认执行流程,从上到下,从左到右依次执行

if语句格式1

注意事项

  • 注意1. 如果if语句所控制的语句体,只有一条语句,可以省略大括号(不建议!)
  • 注意2. if语句的小括号后面,不要写分号,Java中分号代表语句的结束

十二 循环

分支语句 - switch语句

格式说明

  • 表达式:将要被匹配的值,取值为byte、short、int、char、枚举(JDK5)、String(JDK7)
  • case:后面跟的是,要和表达式进行比较的值(被匹配的值)
  • break:表示中断,结束的意思,用来结束switch语句
  • default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似

执行流程

  • 1:首先判断表达式的值
  • 2:依次和case后面的常量进行比较

• 如果有对应的值,执行case后的语句体,在执行过程中遇到break就会结束

• 如果所有的case后面的值都不能匹配,就会执行default语句体,然后将程序结束掉

switch语句的case穿透

case的穿透是如何产生的?

  • 如果switch语句中,case后面省略了break,就会开始穿透
  • 穿开始case穿透,后续的case就不再具有匹配效果,内部语句都会执行;直到再次遇到break停止,或者switch语句执行完毕后停止

循环语句 - for循环

for循环格式

  • for( 初始化语句; 判断语句; 控制语句 ){ 循环体; }

for循环执行流程

  • 1. 执行初始化语句
  • 2. 执行判断语句,看其boolean类型的结果

• 如果为false则结束循环

• 如果为true则继续执行

  • 3. 执行循环体语句
  • 4. 执行控制语句
  • 5. 回到第2步继续判断

案例 - 输出数据1-5和5-1

在控制台打印1-5和5-1

案例 - 求1-5的数据和

求1-5之间整数和,并把求和结果输入在控制台

  • 编程思想:当出现“求和”等需求时,定义求和变量sum,初始值为0

案例 - 求1-100的偶数和

求1-100之间的偶数和,并把求和结果输入在控制台

  • 编程思想:一个数对2取余,结果为0代表该数是偶数

案例 - 水仙花数

案例:在控制台输出所有水仙花数

  • 水仙花都是三位数(数据范围);水仙花数特点是,各个位置上的数立方和为数字本身(判断条件)

案例 - 每行打印2个水仙花数(统计)

案例:在控制台输出所有水仙花数,每行打印2和满足条件的数字

  • 编程思想:当出现“计次”“个数”等需求时,定义计数器count,初始值为0

循环语句 - while循环

while循环完整格式

  • 初始化语句; while(判断语句){ 循环体; 控制语句; }

while循环简化格式

  • while(判断语句){ 循环体; } //多用于死循环

while循环执行流程

  • 1. 执行初始化语句
  • 2. 执行判断语句,看其boolean类型的结果

• 如果为false则结束循环

• 如果为true则继续执行

  • 3. 执行循环体语句
  • 4. 执行控制语句
  • 5. 回到第2步继续判断

案例 - 珠峰折纸案例

已知珠峰高度为8848.42米,加入有一张足够大的纸,厚度为0.1毫米。问纸张对折多少次,能达到珠峰高度?

  • 编程思想:当出现“计次”“个数”等需求时,定义计数器count,初始值为0

循环语句 - do...while循环(了解)

do..while循环完整格式

  • 初始化语句; do{ 循环体; 控制语句; }while(判断语句)

do..while循环简化格式

  • do{ 循环体; }while(判断语句)

三种循环的区别

三种循环区别

  • for和while需要先判断条件是否成立,然后决定是否执行循环体语句(先判断,后执行)
  • do..while先执行一次循环体,然后再判断条件是否成立,然后决定是否执行循环体语句(先执行一次循环体,再判断)

for和while循环区别

  • for循环初始化语句定义的变量,归属于for循环语法结构,所以循环结束后就不能再使用了
  • while循环初始化语句定义的变量,由于在循环体外定义(main方法中),不归属于while循环体,所以循环结束后还可以使用

应用场景区别?

  • 知道循环次数,推荐使用for循环
  • 不知道循环次数,推荐使用while循环
  • do..while循环很少使用

死循环

for循环死循环

  • for( ; ; ){ }

while循环死循环(常用)

  • while( true ){  }

do..while循环死循环

  • do{  }while( true );

如果使用死循环,需要考虑程序的出口(结束循环的条件)

十三 跳转控制语句

跳转控制语句

continue关键字作用?

  • 仅用于循环语句,作用是跳过本次循环,继续下一次循环的执行

break关键字作用?

  • 用于循环语句和分支语句,作用是结束整个循环或者分支

案例 - 减肥计划改进循环标号

案例改进:程序运行后,用户可以多次查询星期对应的减肥计划,知道输入0,结束程序

循环标号的使用?

  • 我们可以给循环语句的关键字前,起一个"标号名",然后在某种情况下,使用break + 标号名,结束该循环语句

十四 Random随机数对象

Random基本使用

Random的作用?

  • 产生一个指定范围内的伪随机数(常用生成整数)

使用步骤?

  • 步骤1:导包

• import java.util.Random;

  • 步骤2:创建对象

• Random r = new Random();

  • 步骤3:获取随机数

• int number = r.nextInt(范围); // 左包含右不包含

• 范围处填写一个整数,代表指定0到该整数(左包含右不包含)的范围

• 获取一个min到max之间的随机整数,包含min和max,万能公式:(max - min + 1) +min;

案例 - 猜数字小游戏

程序生成一个[1-100]之间的整数,实现键盘提示用户猜出这个数字,用户可以多次猜,每次猜的结果打印在控制台(猜对了停止程序)

十五 IDEA

IDEA概述和安装

IDEA中项目结构

1. 项目Project

  • 基础班暂时创建Empty Project空项目,创建完成后进行配置

• Project SDK:new一个当前计算机的JDK路径

• language Level:和JDK版本保持一致即可

2. 模块Module

  • 如果已经配置了Project的相关设置,每次创建模块就不需要再次设置了
  • 模块下会自动生成一个根目录src

3. 包Package

  • 在根目录src下创建包
  • 命名规范为公司域名去掉www的反写,点为包层级的分隔
  • 包的本质是文件夹

4. 类class

IDEA中第一个代码

创建的Java文件中自动包含

  • package 包名:显示在文件第一行,不要修改否则报错
  • class 类名:创建时起好的类名,我们只需加入main方法开始编码即可

main方法快捷键:psvm + 回车

输出语句快捷键:sout + 回车

IDEA常用快捷键

设置 File Settings

  • Ctrl + Alt + S

• 界面风格

• Appearance & Behavior - Appearance

• Theme:自行选择一种风格即可

• 自动导包

• Editor - General - Auto Import

• Insert imports on pasre:选择All

• Ctrl+鼠标滑轮调整字体大小

• Editor - General - Mouse

• 勾选 Change font size(Zoom) with Ctrl + Mouse Wheel

快捷键:不要死记硬背用一个记一个

  • 代码格式化 Ctrl + Alt + L
  • 代码错误修正提示 Alt + 回车
  • 向下复制一行 Ctrl + D
  • 剪切当前行 Ctrl + X
  • 批量单行注释 Ctrl + / (再按一次批量取消)
  • 批量多行注释 Ctrl + Shift +/ (再按一次批量取消)
  • 上移当前行 Ctrl + Shift + ↑
  • 下移当前行 Ctrl + Shift + ↓

IDEA操作模块

IDEA打开关闭项目&类名包名修改

类名修改

  • 方式1. 对要修改的文件 - 右键 - Refactor  - Rename
  • 2. 直接修改类名后 - 光标放在类名报错红线 - Alt + 回车 - 选择 Rename File

包名修改

  • 对要修改的包 - 右键 - Refactor  - Rename

十六 数组 介绍

什么是数组?

  • 数组(array)是一种容器,可用来存储多个相同类型的数据

建议:数组容器的类型,和存储的数据类型保持一致!

数组 的定义格式

格式1:数据类型[] 变量名

  • 范例:int[ ] arr(推荐使用的格式)

格式2:数据类型 变量名[]

  • 范例:int arr[ ]

数组 动态初始化

Java中的数组(变量)必须先初始化,然后才能使用

初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器的过程

数组动态初始化的格式?

  • 数据类型[] 变量名 = new 数据类型[长度];

• 范例:int[] arr = new int[5]; //动态初始化了一个数组,数组名是arr,长度为5,该数组能存储5个int类型数据

打印数组变量名会出现什么?

  • 数组的内存地址

• [:表示一维数组

• @:连接符

• I:int的意思,表示数组中存储的数据类型

• 数字和字母的组合串:该数组16进制的内存地址

• 十六进制:由0-9、a-f组成,字母大小写都可以

数组 元素访问

什么是索引? 它有什么特点

  • 索引是数组容器中空间的编号;可以用来标识数组中元素的位置

• 特点1:从0开始

• 特点2:索引是连续的

• 特点3:逐个+1

数组元素访问的格式?

  • 数组名[索引];

• 范例:arr[0]; //获取该数组第一个元素

十七 Java内存图 - 一个数组内存图

Java中内存分配

  • 栈内存:方法运行时,进入的内存空间;局部变量也存放于栈内存中
  • 堆内存:new出来的内容进入堆内存,并且会产生地址值
  • 方法区:字节码文件(.class)加载时进入的内存空间
  • 本地方法栈:调用操作系统相关资源(不关注)
  • 寄存器:交给CPU使用(不关注)

Java中数据的默认值

  • 整数:0
  • 浮点数:0.0
  • 布尔:false
  • 字符:空字符
  • 引用数据类型:null

引用数据类型:引用,记录了地址值的变量,所对应的数据类型就是引用数据类型

  • 范例:int[] arr = new int[3]; //数组的变量就是引用数据类型

Java内存图 - 两个数组内存图

Java内存图 - 多个数组指向相同内存图

当多个引用指向相同的内存,如果其中一个引用,改变了内存中的内容,其他引用看到的都是"改变后的内容"

  • 理解:两人牵同一条狗;两人住同一屋的例子

数组 静态初始化

数组静态初始化的格式?

  • 数据类型[] 变量名 = new 数据类型[]{元素1, 元素2, ...};

• 范例:int[] arr = new int[]{1, 2, 3};

  • 简化格式:简化了new int[]的书写

• 范例:int[] arr = {1, 2, 3}; (推荐使用的格式)

数组初始化小结

  • 静态初始化:知道数组具体元素(给元素)
  • 动态初始化:不知道具体元素,但是知道数组长度时(给长度)

数组 操作的两个常见问题

索引越界异常 ArrayIndexOutOfBoundsException:

  • 操作了不存在的索引

空指针异常 NullPointerException

  • 访问的引用类型不再指向堆内存

十八 方法

方法概述

什么是方法?

  • 一段具有独立功能的代码块,不调用就不执行

方法有什么好处?

  • 可以提高代码的复用性

方法使用须知

  • 方法必须先创建才可以使用(方法定义)
  • 方法创建后并不是直接运行的,需要手动调用(方法调用)

方法的定义和调用

方法的定义和调用

如果调用了一个没有定义的方法,会出现?

  • 程序会报错

课堂练习:无返回值方法的定义和调用

方法的调用过程

方法没有被调用:在方法区

方法被调用时加载到了哪里?

  • 栈内存:栈内存特点是先进后出,后进先出(子弹匣子)

案例- 奇偶数判断

设计一个方法method,方法中定义一个变量(数值随意)判断这个变量是奇数还是偶数,并在面方法中调用method

带参数方法的定义和调用

改进 “奇偶数判断” 案例,将方法定义为带参数方法,要判断的数据由调用者指定

注意事项

  • 1. 参数中的数据类型与变量名都不能缺少,否则程序报错
  • 2. 多个参数之间使用逗号分隔
  • 3. 调用带参数的方法时,参数的数量、类型必须与方法定义中设置的匹配,否则程序报错

形参和实参

什么是形参?

  • 形式参数,是指方法定义时的参数;作用是接收实参

什么是实参?

  • 实际参数,是指方法调用时的参数;也就是实际参与运算的数据,由调用者指定

案例 - 打印n到m之间所有奇数

设计一个方法,用于打印n到m之间所有的奇数(分析n和m从哪里来?)

带返回值方法的定义和调用

为什么要有带返回值的方法?

  • 我们经常会根据一个方法产出的结果,去组织另一段代码逻辑,为了拿到这个方法产生的结果,就需要定义带返回值的方法

return关键字的作用?

  • 返回结果(并且停止方法)

注意事项

  • 1. return后面的返回值,与方法定义上的数据类型要匹配,否则报错
  • 2. 方法的返回值通常会使用变量接收,否则该返回值将无意义

案例- 求两个数的最大值

设计一个方法,可以获取两个int类型数据的较大值,数据来自于参数(分析参数列表,返回值类型)

方法通用定义格式

方法定义时的两个明确?

  • 明确1:返回值类型

• 该方法需不需要返回一个结果? 它是什么类型的? 如果不需要返回一个结果,在返回值类型处写void

  • 明确2:参数列表

• 该方法执行过程中,需不需要原材料(实际参与运算的数据),如果需要,写在参数列表中,由数据和变量名组成;有多个参数,使用逗号分隔;如果不需要则不写

通用格式

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

方法的注意事项

定义方法时

  • 1:参数中的数据类型与变量名都不能缺少,否则程序报错
  • 2:多个参数之间使用逗号分隔
  • 3:方法不能嵌套定义
  • 4:return后面的返回值与方法定义上的数据类型要匹配,否则报错
  • 5:方法的返回值为void,表示该方法没有返回值,可以省略return不写
  • 6:return的作用是返回返回值,并且停止方法;所以return语句下面不能编写代码,属于无效语句会报错

调用方法时

  • 1:调用带参数的方法时,参数的数量、类型必须与方法定义中设置的匹配,否则程序报错
  • 2:如果调用了一个有返回值的方法,需要用相同类型变量接收,否则返回值将无意义
  • 方法调用的三种方式

• 1. 直接调用

• 用于调用没有返回值的方法(如果调用有返回值的方法,那么将无意义)

• 2. 赋值调用

• 必须调用有返回值的方法(将返回值使用相同类型变量接收,用于后续操作)

• 3. 打印调用

• 必须调用有返回值的方法(在输出语句中调用方法,相当于直接打印了返回值)

方法的重载

方法重载的概念?

  • 在同一个类中,出现了方法名相同,参数列表不同(数量、类型、顺序)的方法,我们称这些方法构成了重载;方法的重载与返回值无关

方法重载的好处:不用记忆过多繁琐的方法名

案例 - 方法重载练习

使用方法的重载的思想,设计比较两个整数是否相同的方法,兼容所有整数类型(byte、short、int、long)

方法的参数传递 基本数据类型

传递基本类型:传递的是“记录的具体数值”,形参的改变,不会影响实参

方法的参数传递 引用数据类型

传递引用类型:传递的是“地址值”,形参的改变,会影响实参

案例 - 数组遍历

设计一个方法用于遍历数组,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]

案例 - 获取数组最大值

设计一个方法用于获取整数数组中,元素的最大值

案例 - 方法同时获取数组最大值和最小值

设计一个方法,该方法能同时获取数组中的最大值和最小值

  • 提示:该方法返回值为int类型的数组(int[])

十九 进制与Debug位运算,二维数组

Debug 介绍与操作流程

Debug:是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序

Debug调试又称为断点调试:断点就是一个标记,告诉Debug从标记的位置开始查看

Debug操作流程?

  • 1.打断点:在代码行号后面,点击出一个小红点,开启Debug运行模式后,从标记的地方开始查看
  • 2.在代码区域右键,单击Debug执行即可
  • 3.看Debugger窗口

• Frames:看代码运行到哪里了

• Variables:看代码执行过程中变量的变化

  • 4.看Console窗口:看代码执行过程中的结果展示,可以录入要录入的数据
  • 5.点Step Into 这个箭头下一步
  • 6.点Stop结束
  • 7.选择要删除的断点,单击鼠标左键即可,或者批量删除

进制

进制的介绍与书写格式

进制:指进制位,是人们规定的一种进位方式

常见进制

  • 二进制:数据使用0和1表示,逢二进一,借一当二(0b开头,b大小写均可)
  • 八进制:由0到7八个数字组成,逢八进一(0开头)
  • 十进制:逢十进一,借一当十(Java中数值默认是10进制,不需要修饰)
  • 十六进制:由0到9,a到f组成,其中a到f表示10到15,字母大小写均可(0x开头,x大小写均可)

学习目的:便于我们对数据运算过程,理解的更加深刻

任意进制 到十进制的转换

系数*基数的权次幂 相加

  • 系数:每一位上的数据本身,不带进制标识
  • 基数:几进制转换,基数就是几
  • 权:从右朝左,0开始逐个+1

十进制 到任意进制的转换

除基取余法

  • 使用源数据,不断的除以基数(几进制转换,基数就是几)得到余数,直到商为0,再将余数【倒着拼接】起来即可

快速进制转换法

8421码:又称BCD码,是BCD码中最常用的一种

  • BCD: (Binary-Coded Decimal) 二进制码十进制数在这种编码方式中,每一位二进制值的1都是代表一个固定数值,把每一位的1代表的十进制数加起来,得到的结果就是它所代表的十进制数

二进制,快速转十进制

  • 128 - 64 - 32 - 16 - 8 - 4 - 2 - 1

• 将二进制的值,从左边套入其中,0对应的值不取,1对应的值取出来相加即可

二进制,快速转八进制

  • 将三个二进制位看为一组,分别套入上述公式,将结果拼接(注意不是加)

• 原因:八进制逢八进一,三个二进制位最多可以表示111,也就是数值7(套入上条公式),如果出现第四位,就超范围了

二进制,快速转十六进制

  • 将四个二进制位看为一组,如果不够使用0补位,分别套入上述公式,将结果拼接(注意不是加)

• 原因:十六进制逢十六进一,四个二进制位最多可以表示1111,也就是数值15,如果出现第五位,就超范围了

原码 反码 补码

计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的

[ 1 ] 原码:给人看的,可通过8421码,推算出具体数值

  • 就是二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小

[ 2 ] 反码:转换的桥梁

  • 正数的反码与其原码相同
  • 负数的反码是对其原码逐位取反,但符号位除外

[ 3 ] 补码:计算机底层运算使用补码,也就是真正做运算的

  • 正数的补码与其原码相同
  • 负数的补码是在其反码的末位加1

面试题 byte b = (byte)130; //b为什么是-126

  • byte b = (byte)130; //-126,这个-126怎么来的?    - 整数130默认int类型占4个字节,一组字节是8个二进制位      - 00000000 00000000 00000000 10000010    - 强转到byte,4个字节强转为1个字节,砍掉前面三组      - 10000010    - 运算后的补码反向推算原码      - 补码 -> 反码:末尾-1 -> 10000010末尾-1 -> 10000001      - 反码 -> 原码:符号位不变,其余数值逐位取反 -> 11111110      - 二进制原码11111110 -> 8421码转换 -> 2+4+8+16+32+64=126 -> 符号位为1是负数 -> -126

案例 - 数据交换

需求:已知两个整数变量a=10,b=20,使用程序实现这两个变量的数据交换,最终输出a=20,b=10

  • 解决方案1:使用异或符号
  • 解决方案2:使用中间变量(推荐)

位运算 基本位运算符

思考 System.out.println(6 & 2); 结果是多少?

  • 这里的&符号是位与,结果是2

什么是位运算?

  • 是二进制位的运算;需要先将十进制数转为二进制后,再进行运算

在二进制位运算中1和0表示什么?

  • 1表示true,0表示false

位运算符

  • & 位与:将十进制数转为二进制后竖式运算,遇false则false,遇0则0
  • | 位或:将十进制数转为二进制后竖式运算,遇true则true,遇1则1
  • ^ 位异或:将十进制数转为二进制后竖式运算,相同为false,不同为true
  • ~ 取反:将十进制数转为二进制后竖式运算,全部取反,0变1,1变0(包括符号位)

异或运算符的特点?

  • 一个数被另一个数,异或两次,该数本身不变

自由主题

位运算 位移运算符

<< 有符号左移:二进制位向左移动,符号位丢弃,右边补齐0

  • 运算规律:向左移动几位,就是乘以2的几次幂

>> 有符号右移:二进制位向右移动,使用符号位进行补位

  • 运算规律:向右移动几位,就是除以2的几次幂

>>> 无符号右移:无论符号位是0还是1,都补0

  • 几乎没什么使用场景

案例 - 数组反转

需求:已知一个数组,使用程序实现,把数组中的元素值交换(反转)

  • 解决思路:定义两个指针为for循环初始化变量,一个指向数组第一个元素,一个指向数组最后一个元素。确定循环继续条件。每交换一次,对第一个指针进行++,对第二个指针进行--。循环体进行两个指针(索引)对应元素的交换,使用中间变量完成

二维数组

二维数组 概述

什么是二维数组?

  • 用于存储一维数组的数组(容器)

二维数组 动态初始化

二维数组的定义格式?

  • 格式1:数据类型[] [] 数组名(常用)
  • 格式2:数据类型 数组名[] []
  • 格式3:数据类型[] 数组名 []

动态初始化格式?

  • 数据类型 数组名[] [] = new 数据类型[m] [n];

• m表示:该二维数组可以存放几个一维数组

• n表示:每个一维数组可以存放多少个元素

二维数组 访问元素的细节问题

二维数组中存储的都是一维数组,可以将创建好的一维数组直接存入(存入的是一个一个一维数组的内存地址),存储完成后,增加其中一维数组的元素(增加长度),程序不会报错

如果使用动态初始化创建二维数组,就不能在后期,改变其中一维数组的长度了

二维数组 静态初始化

静态初始化格式?

  • 数据类型 数组名[][] = new 数据类型[][] {{元素1,元素2,元素3 ..} , {元素1,元素2,元素3 ..}};

• 简化格式:省略书写 new 数据类型[][]

• 范例:int[][] arr = {{11,22,33},{44,55,66}};

二十 面向对象基础与构造方法

类和对象

面向对象和面向过程的思想对比

两种思想的区别?

  • 面向过程 POP:是一种以[过程]为中心的编程思想,功能的每一步,都是自己实现的
  • 面向对象 OOP:是一种以[对象]为中心的编程思想,通过指挥对象实现具体的功能
  • 面向对象是基于面向过程的

类和对象的关系

什么是类? 类的组成有哪些?

  • 类是对现实生活中,一类具有共同属性和行为的事物的抽象
  • 类由属性和行为组成

• 属性:该类事物所具有的共同特征 (成员变量)

• 行为:该事物存在的功能,能做的事情 (成员方法)

什么是对象?

  • 是看得见,摸得着的真实存在的物体

类是对事物也就是对象的一种描述,可以将类理解为一张设计图,根据设计图,可以创建出具体存在的事物

  • 小结1、客观存在的任何一种事物,都可看做为程序中的对象(万物皆对象)
  • 小结2、使用面向对象思想可以将复杂问题简单化
  • 小结3、将我们从执行者的位置,变成了指挥者

类的定义

类的属性和行为,在代码中通过什么体现?

  • 属性:成员变量(类中方法外的变量)
  • 行为:成员方法(和前面学习的方法相比不带static关键字)

定义一个类的步骤?

  • 步骤1、创建Java文件 编写类名
  • 步骤2、编写类的 成员变量
  • 步骤3、编写类的 成员方法

类创建完成后,不能直接右键运行:因为我们没有提供main方法,我们需要再创建一个测试类,在测试类中先创建对象,再进行测试

对象的创建和使用

如何创建对象?

  • 格式:类名 对象名 = new 类名();

• 注意:类名就是对象的[数据类型]

  • 范例:Student stu = new Student();

如果我们打印一个对象名,控制台会打印该对象的内存地址:全类名(包名+类名)@十六进制内存地址

案例:手机类的创建和使用

需求:定义一个手机类,然后定义一个手机测试类,在手机测试类中,通过对象完成,成员变量和成员方法的使用

对象内存图

单个对象内存图

new出来的对象:在堆内存开辟空间

成员变量:有默认初始化值

两个对象内存图

当出现多次new的动作时,字节码文件不会多次加载:我们通常使用一张"设计图",就可以创造出多个"对象"

两个引用指向同一个对象内存图

对象类型的变量,是什么类型的数据?

  • 引用类型

对象类型的变量,记录了什么?

  • 记录了该对象的内存地址

垃圾回收:当堆内存中,对象和数组产生的地址,通过任何方式都不能被找到后,就会被判定为内存中的"垃圾",垃圾会被"Java垃圾回收器"在空闲时间自动进行清理

成员变量和局部变量

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

区别1、类中位置不同

  • 成员变量:类中方法外
  • 局部变量:方法内或方法声明上

区别2、内存中位置不同

  • 成员变量:堆内存(跟随对象走,对象是new出来的进堆)
  • 局部变量:栈内存(跟随方法进栈)

区别3、生命周期不同

  • 成员变量:随对象的存在而存在,随对象的消失而消失
  • 局部变量:随方法的调用而存在,随方法的弹栈而消失

区别4、初始化值不同

  • 成员变量:有默认初始化值
  • 局部变量:没有默认初始化,必须先定义赋值,再使用

封装

private关键字

什么是private关键字?

  • private,私有的意思,是一个权限修饰符,可修饰成员(成员变量、成员方法)

private关键字的特点?

  • 被private修饰的成员,只能在本类中被访问

被private修饰的成员变量,可能被其他类使用,所以我们在本类中,需要提供public修饰的getXxx()、setXxx()方法,让其他类操作私有的成员

private关键字的使用

(不完全)标准类的编写

  • 要求1、将所有成员变量使用private修饰
  • 要求2、提供对应的getXxx()、setXxx()方法

this关键字

this关键字的作用?

  • 作用1、可以调用本类的成员变量、成员方法
  • 作用2、解决局部变量和成员变量重名问题
  • 理解:方法被哪个对象调用,方法中的this就代表哪个对象!

this内存原理

this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象

封装

面向对象的三大特征是什么?

  • 封装、继承、多态(了解,目前重点关注[封装])

什么是封装?

  • 隐藏实现细节,仅对外暴露公共的访问方式

封装常见的体现

  • 体现1、私有成员变量,并对外提供getXxx()、setXxx()方法
  • 体现2、将代码,抽取到方法中,这是对代码的一种封装
  • 体现3、将属性,抽取到类中,这是对数据的一种封装

封装的好处?

  • 好处1、提高了代码的 安全性
  • 好处2、提高了代码的 复用性

构造方法

构造方法的格式和执行时机

什么是 构造方法?

  • 创建对象时,所调用的方法

构造方法的 格式特点?

  • 特点1、方法名与类名相同
  • 特点2、没有返回值,连void都没有
  • 特点3、没有具体的返回值(不能由return带回结果数据)

执行时机是 什么时候?

  • 创建对象时候会自动调用。每创建一次对象,就会执行一次构造方法(注意不能手动调用构造方法)

构造方法的作用

本质上构造方法的作用是:创建对象

根据构造方法的执行时机:我们还可以用它在创建对象的同时,给对象的数据进行初始化

构造方法的注意事项

注意事项

  • 注意1、如果没有定义构造方法,系统会给一个默认空参构造(父类哪里继承来的)
  • 注意2、如果定义了构造方法,系统就不会提供默认构造方法了(所以以后定义类时,空参带参都提供 !!!)

二十一 字符串基础

API

API概述 - 帮助文档的使用

API:application应用 programing编程 interface接口

什么是帮助文档?

  • 一些定义好的类的使用说明文档(理解为字典)

帮助文档的查看流程?

  • 查看1、当前类所在的包(继承体系)
  • 查看2、基本介绍
  • 查看3、构造方法(创建对象)
  • 查看4、成员方法(常用方法)

键盘录入字符串

Scanner的哪些方法可以获取控制台录入的字符串?

  • 方法1、next() 结束标识是空格键、tab键
  • 方法2、nextLine() 结束标识是回车键

String

String概述

java.lang包下的类的使用特点?

  • 使用时,不需要导包

字符串对象一旦创建,对象的内容是否可以更改?

  • 不可以(字符串是常量,底层被final修饰)

String类常见构造方法

打印String的变量名,会不会打印对象的内存地址值?

  • 不会,而是打印了该字符串对象所记录的内容

创建String对象的四种方式

  • 方式1、public String() 创建一个空白字符串对象
  • 方式2、public String(char[] chs) 根据字符数组的内容,创建字符串对象
  • 方式3、public String(String original) 根据传入的字符串内容,创建新的字符串对象
  • 方式4、String s = "abc";  直接赋值的方式创建

创建String对象的区别和对比

==比较基本类型,和引用类型的区别?

  • 情况1、比基本类型:比的是数据[具体值]
  • 情况2、比引用类型比的是[地址值]

构造方法和双引号创建字符串对象,有什么区别?

  • 使用""创建的字符串:只要字符序列相同(顺序和大小写),无论在程序中出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护

• 结论:使用""创建的String对象,在字符串常量池

  • new出来的字符串:每一次new都会在堆内存申请新的内存空间;就算内容相同,但是地址不同

• 结论:使用new创建的String对象,在堆内存

当使用双引号创建字符串对象时,系统会检查该对象,在字符串常量池中是否在

  • 存在,则不会重新创建,直接拿来使用
  • 不存在,则创建

字符串常量池,在JDK7版本开始,从方法区中挪到了堆内存

String特点 - 常见面试题

字符串对象有哪些特点?

  • 特点1:Java程序中所有双引号引起来的内容,都是String类的对象
  • 特点2:字符串内容不可变,它们的值在创建后不能被更改(在底层被final修饰,所以它是一个常量)
  • 特点3:虽然String的内容不可变,但是可以被共享(结合常量池理解:如果使用""创建String,系统会检测常量池中有没有相同内容的,如果有相同内容的,直接拿来使用)
  • 特点4:String在java的lang包下,使用时不需要导包

当字符串使用+号拼接时,底层是怎么执行的?

  • 系统底层会自动创建一个StringBuilder对象,然后调用其append方法完成拼接,再将拼接的结果,调用toString方法转换为String对象

Java常量优化机制

  • 如果是常量"a"+"b"+"c",那么在编译时,就会将它们拼接为"abc"。由于内容一样,且都是通过双引号创建,所以在内存中维护的是同一个对象

字符串的比较

比较字符串内容的方法?

  • boolean equals(Obj obj);

比较字符串内容并忽略大小 的方法?

  • boolean equalsIgnoreCase(Obj obj);

String方法小结

多理解不建议死记硬背,想不起来可以起API中查询

  • boolean equals(Obj obj); 比较字符串内容,严格区分大小写
  • boolean equalsIgnoreCase(Obj obj); 比较字符串内容,忽略大小写
  • int length(); 返回字符串长度

•  -> 快捷键

  • char charAt(int index); 返回指定索引处的char值

•  -> 快捷键

  • char[] toCharArray(); 将字符串拆分为一个字符数组并返回
  • String substring(int 开始索引, int 结束索引); 根据传入的两个索引,左包含右不包含地截取,并返回新的字符串
  • String substring(int index); 从传入的索引截取到字符串末尾 ,并返回新的字符串
  • String replace(被替换的子串, 新的子串); 使用新值替换字符中所有旧值,并返回新的字符串
  • String[] split(String "标识"); 根据传入的标识切割字符串,返回字符串数组

StringBuilder

StringBuilder 概述

StringBuilder:是一个可变的字符串类,我们可以将它看做是一个用来操作字符串对象的容器

StringBuilder的作用:提高字符串操作的效率

System.currentTimeMillis(); 可以获取当前系统时间的毫秒值

StringBuilder 构造方法

构造1、空参构造

  • StringBuilder sb = new StringBuilder(); 创建一个空的sb对象

构造2、带参构造

  • StringBuilder sb = new StringBuilder("黑马程序员"); 根据传入的字符串,创建一个可变的字符串对象(也就是sb对象)

StringBuilder 常用的成员方法

常用方法1、public StringBuilder append(任意类型); 拼接数据,并返回对象本身

常用方法2、public StringBuilder reverse(); 返回相反的字符序列

常用方法3、public int length(); 返回长度(字符出现的个数)

常用方法4、public String toString(); 将当前的sb对象转换为String对象

StringBuilder 提高效率的原理

字符串使用+号拼接,堆内存会有什么现象?

  • 一个+号创建了两个对象(一个sb一个String)

String和StringBuilder的区别?

  • String创建出来内容不可变,StringBuilder内容可变

案例 - 对称字符串案例

需求:键盘接收一个字符串,程序判断出该字符串是否对称? 并在控制台打印对称或者不对称。例如:录入字符串123321,打印"对称"

案例 - StringBuilder 拼接字符串案例

需求:定义一个方法,将int类型数组中数据,按照指定拼接为一个字符串,并返回该字符串;main方法中,调用该方法测试结果(数组为{1,2,3};,拼接成字符串格式为[1, 2, 3])

二十二 集合&学生管理系统

集合基础

集合和数组的区别对比

集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变

集合和数组的区别?

  • 共同点:都是存储数据的容器
  • 不同点:数组容量固定,集合容量可变

ArrayList构造方法和添加方法

如何创建一个集合对象?

  • ArrayList list = new ArrayList(); //不完整格式
  • ArrayList<泛型> list = new ArrayList<>();

如果不指定集合泛型,那么集合可以存储多个不同类型数据,但是这样的需求少之又少,所以创建集合对象我们需要指定泛型

泛型的作用?

  • 对集合存储的类型的数据进行限制(只能填写引用数据类型)

集合如要存基本数据类型,泛型需怎么写?

  • 要写基本类型对应的包装类(引用类型)
  • 除了int的包装类是Integer,char的包装类是Character这两个特殊,其余都是首字母大写(Byte、Short、Long、Float、Double、Boolean)

集合的添加方法

  • boolean add(E e); 将指定元素追加到集合末尾
  • boolean add(int index, E e); 将指定元素插入到指定索引处

ArrayList常用成员方法

常用方法

  • boolean remove(Obj o);删除指定的元素,返回是否删除成功
  • E remove(int index); 根据索引删除元素,返回被删除的元素
  • E set(int index, E e); 修改指定索引处的元素,返回被修改的元素
  • E get(int index); 返回指定索引处的元素
  • int size(); 返回集合中元素个数

案例 - 集合存储字符串 并遍历

需求:创建一个存储字符串的集合,存储三个字符串元素,使用程序实现控制台遍历该集合

案例 - 集合存储学生对象 并遍历

需求:创建一个存储学生对象的集合,存储三个学生对象,使用程序实现控制台遍历该集合

案例 - 键盘录入学生信息到集合

需求:创建一个存储学生对象的集合,使用程序实现在控制台遍历该集合(要求:学生的姓名和年龄来自于键盘录入)

案例 - 集合删除元素

需求:创建一个存储字符串的集合,内部存储(test、张三、李四、test、test)等字符串,删除所有test字符串,删除后将集合剩余元素打印在控制台

案例 - 集合数据筛选

需求:定义一个方法,方法接收一个集合对象(泛型为Student),方法内部将年龄低于18的学生对象找出并存入新集合对象,方法返回新集合

管理系统

步骤分析&学生类代码编写

开发步骤

  • 步骤1. 创建学生类,属性有id、name、age、address,全部定义为String类型;提供空参带参构造;提供getXxx、setXxx方法
  • 步骤2. 创建StudentManager类,main方法中,使用输出语句配合switch搭建主界面(提示用户输入1、2、3、4、0的整数,分别执行对应CRUD的方法)
  • 步骤3. 在switch的case中,分别实现对应功能的方法
  • 步骤4. 测试系统功能,修复bug,优化代码(将重复代码抽取成方法)

菜单搭建

[ 增 ] 添加学生

[ 查 ] 查看学生

判断学号是否存在的方法定义

思路:定义一个方法,该方法接收ArrayList<Student>集合,和一个要查询的sid,在集合中定义一个变量index用于记录索引初始值为-1;遍历集合在集合中,寻找传入sid对应的对象索引,让index记录,并返回index(调用者判断返回的index,如果值为-1代表集合中,不存在sid所对应的对象;如果不是-1,那么index就是sid所对应的对象的索引)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值