一阶段: JavaSE学习04
1.IDEA:一款强大的开发工具(下载,安装,破解网上搜索即可)
IDEA的运行
- 创建Project项目
- 创建Module模块
- 创建Package包
- 创建class类
- 在类中编写代码
- 完成编译运行
IDEA快捷键使用
/**
* @author 你的大龙猫啊
*/
/*
需求:常用快捷键
psvm + 回车 快速生成main方法
sout + 回车 快速生成输出语句
Ctrl + Alt + L 格式化代码
Alt + Enter 代码修正提示
Ctrl + C 复制当前行
Ctrl + V 粘贴
Ctrl + X 剪切当前行
Ctrl +/ 单行注释
Ctrl + Shift 多行注释
Alt + 1 打开\隐藏 工程目录结构
Alt + 4 打开\隐藏 控制台
Ctrl + D 向下复制一行
Ctrl + Shift + ↑ 上移当前行
Ctrl + Shift + ↓ 下移当前行
*/
public class Demo_ShortCut {
public static void main(String[] args) {
System.out.println("快捷键真好用");
}
}
2.数组
**定义:
**数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
数组特点:
1, 数组一旦初始化长度不能发生改变
2, 存储同一种数据类型的多个值
3, 有索引(下标\角标)
最小的索引是:0
最大的索引是:数组名.length-1
数组的定义格式
数组定义格式:
//int [] arr 读法是:定义了一个int类型的数组,数组名是arr (推荐使用)
//int arr [] 读法是:定义了一个int类型的变量 变量名是arr数组
数组的动态初始化
什么是动态初始化?
数组动态初始化就是只给定数组的长度,由系统给出默认初始化值
动态初始化格式:
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
动态初始化格式详解:
-
等号左边:
-
int:数组的数据类型
-
[]:代表这是一个数组
-
arr:代表数组的名称
-
-
等号右边:
- new:为数组开辟内存空间
- int:数组的数据类型
- []:代表这是一个数组
- 5:代表数组的长度
动态初始化默认值(理解)
数据类型 | 默认值 |
---|---|
整数 | 0 |
浮点数 | 0.0 |
字符 | 空字符 |
布尔类型 | false |
引用类型 | null |
/**
* @author 你的大龙猫啊
*/
/*
数组:数组是一种容器,用来存储(同种数据类型)的多个值
数组弊端:长度不可以发生改变
*/
public class Demo16_ArrayFormat {
public static void main(String[] args) {
//数组定义格式
//int [] arr 读法是:定义了一个int类型的数组,数组名是arr (推荐使用)
//int arr [] 读法是:定义了一个int类型的变量 变量名是arr数组
// Java中的数组必须先初始化,然后才能使用。
// 所谓初始化:就是为数组中的数组分配内存空间,并为每个元素赋值
// 数组初始化方式:动态初始化和静态初始化
//动态初始化:初始化值指定数组长度,由系统为数组分配初始值
//格式:数据类型 [] 变量名 = new 数据类型[数组长度]
//范列: int [] arr = new int[3]; 3代表数组长度也表示数组元素个数
int [] arr = new int[3];//[I@17327b6 @分隔符 [:当前空间是一个数组类型
System.out.println(arr);// I:当前数组容器所存储的数据类型 17327b6 十六进制内存地址
//输出数组中的元素
System.out.println(arr[0]); //0
System.out.println(arr[1]); //0
System.out.println(arr[2]); //0
//给元素赋值
arr[0] = 100;
arr[2] = 200;
//再次输出
System.out.println(arr[0]); //100
System.out.println(arr[1]); //0
System.out.println(arr[2]); //200
//数组在动态初始化时,会为存储空间添加默认值
//整数:默认值0 浮点数:默认值为0.0
//布尔值:默认值为false 字符;默认值是空字符 引用数据类型:默认值是null
//栈内存:存储局部变量 定义在方法中的变量 列如arr 使用完毕,立即消失
//堆内存:存储new出来的东西都有一个地址值,使用完毕,会在垃圾回收机器空闲时被回收
//数组初始值之静态初始化
//数据类型 [] 变量名 = new 数据类型[] {数据1,数据2,数据3,......};
//数据类型 [] 变量名 ={数据1,数据2,数据3,......};
//数组常见问题: 1.索引越界 2.空指针异常
}
}
思考:
数组可以存储什么样的类型?
基本数据类型 和引用数据类型都可以? ------
都可以
3内存分配
内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
java中的内存分配
- 目前我们只需要记住两个内存,分别是:栈内存和堆内存
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储所有编译之后的class文件,要用的class文件 |
堆内存(有地址值,有默认值) | 存储对象或者数组,new来创建的,都存储在堆内存。 |
栈内存(先进后出) | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
Java内存分配-一个数组内存图
两个数组内存图
多个数组指向相同内存图
4.数组的静态初始化
什么是静态初始化:
在创建数组时,直接将元素确定
什么是静态初始化
在创建数组时,直接将元素确定
静态初始化格式
public class Demo_StaticArray {
/*
数组静态初始化 : 初始化时指定每个数组元素的初始值,由系统决定数组长度
完整格式:
数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据3...};
简化格式:
数据类型[] 数组名 = {数据1,数据2,数据3...};
*/
public static void main(String[] args) {
// 数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据3...};
int[] arr = new int[]{11,22,33};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 数据类型[] 数组名 = {数据1,数据2,数据3...};
int[] arr2 = {44,55,66};
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
5.数组操作的两个常见问题
索引越界异常
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[3]);
}
}
错误原因:
数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。
程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
解决方案:
把索引改为正确范围内的即可!
空指针异常
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
//把null赋值给数组
arr = null;
System.out.println(arr[0]);
}
}
**错误原因:
**arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此 运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
解决方案:
给数组一个真正的堆内存空间引用即可!
6.数组遍历
/**
* @author 你的大龙猫啊
*/
/*
需求:获取数组中的最大值和最小值
*/
public class Demo18_ArrayMax {
public static void main(String[] args) {
int [] arr = {62,45,59,98,73,60};
int max = arr[0];
int min = arr[0];
//arr.fori 正向遍历 arr.forr 反向遍历
for (int i = 0; i < arr.length; i++) {
if(arr[i]>max){
max =arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
for (int i = arr.length - 1; i >= 0; i--) {
System.out.println(i);
}
System.out.println("数组最大值为:"+max+"\n数组最小值为:"+min);
}
}
数组综合案例应用:
import java.util.Scanner;
/**
* @author 你的大龙猫啊
*/
/*
需求:在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
选手的最后得分为:去掉一个最高分和一个最低分后的4个评委平均值(不考虑小数部分)
*/
public class Demo24_Judges {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[6];
//个人建议:一个for循环完成一件事(基础的时候容易理解)
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第:" + (i + 1) + "个评委打分");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
arr[i] = score;
} else {
System.out.println("您的评分有误,请检查是否输入值为0-100之间");
i--;
}
}
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min > arr[i]) {
min = arr[i];
}
}
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("选手最后的分为:" + (sum - max - min) /(arr.length-2));
}
}