1 IDEA开发工具
需要的IDEA工具的找我吧,发不了。
1.1 IDEA安装
注意:建议指定自定义安装路径。
详细步骤参考笔记中的《IDEA安装详解.pdf》文档。
1.2 IDEA工具
需要的IDEA工具的私我下。
1.3 创建IDEA工程
创建工程(Project) --> 模块 (Module) -->建包(文件夹) --> 创建java文件,编写代码
需求:使用idea工具创建工程,运行HelloWorld案例。
步骤:
1、创建空工程javaBase。Create New Project —> Empty Project
2、创建新模块day04。File —> New —> Module
3、在模块的src下创建包com.itheima.demo1。 New —> Package
4、在包中新建一个类HelloWorld。 New —> Java Class
5、编写代码并执行程序。
图解:
1 创建工程
2 创建模块
3 创建包和类
注意:
1. 模块下有src文件夹,所有java代码必须写在src文件夹下。
2. 通常在src下创建包,包中再创建类,通过不同的包管理所有类。
1.4 idea中的项目结构
Project:
Project在IDEA中表示一个完整的工程。一个工程下面可以包含多个模块,即一个Project包含多个Module。
Module:
Module即模块,依赖于工程而存在。模块下有src目录,java代码必须写在src。开发时一般会在src下先创建包,再创建类编写代码。
总结:
一个Project工程下可以有多个Module模块,模块的src下可以有多个Package包,一个包下可以有多个java类文件。
1.5 IDEA基本设置
- 字体设置 File->Settings->Editor->Font。
背景设置 File->Settings->Appearance & Behavior->Appearance->Theme (Darcula为经典黑色)
修改注释颜色 File–>Setting–>Editor–>Color Scheme -->Language Defaults–>Comments
系统设置 File -> Settings -> Appearance & Behavior -> System Settings
更多设置请参考《idea使用教程.pdf》文档
1.6 IDEA常用快捷键
快捷键 | 功能 |
---|---|
Ctrl + / | 添加或取消单行注释 |
Ctrl + Shift + / | 选中代码注释,多行注释,再按取消注释 |
Ctrl + Alt + L | 格式化代码 |
Ctrl + Y | 删除光标所在行 |
Ctrl + D | 复制光标所在行的内容,插入光标位置下面 |
Alt + Shift + 上下箭头 | 移动当前代码行 |
Ctrl + Alt + Space | 自动代码补全提示 |
psvm | 快速生成main方法 |
sout | 快速生成打印语句 |
fori | 快速生成for循环语句 |
1.7 IDEA模块操作
模块导入
File --> Porject Structure --> Modules --> 加号 --> Import Module
选择【模块名称】或者对应的【 模块名.iml 】文件即可完成导入。
方式2:File --> Porject Structure --> Modules --> 选择模块 --> 减号 --> Yes
注意:模块删除只是删除在IDEA中的工程目录,不会删除磁盘下的模块文件夹。
创建idea工程:
创建工程-->创建模块-->在src中建包--->在包中建类
idea中的项目组成:
一个工程是idea中管理的代码的单位,工程中可以创建多个模块,模块中可以创建多个包,包中可以创建多个类
idea的快捷键
单行注释: Ctrl + /
多行注释: Ctrl + Shift + /
格式化代码: Ctrl + Alt + L
快速生成main方法: psvm + 回车
快速生成输出语句 : sout + 回车
工程中有模块文件夹,
有out目录,存放class文件的地方
.idea 文件夹 : 存放工程的管理和配置文件.
模块中:
模块名.iml :模块的配置文件, 导入模块时可以选择该文件导入模块
2 数组
得到50位同学的成绩
2.1 数组的作用和特点
作用:数组可用于存储同一类型的多个数据,是一个java的数据容器。
特点:数组长度固定,所存数据类型一致。
2.2 数组的定义格式
//【格式1】(掌握)array
数据类型[] 数组名
//示例
int[] arr
boolean[] arr
double[] arr
//【格式2】(了解)
数据类型 数组名[]
//示例
double arr[]
什么是数组初始化?**
java中变量使用前必须完成初始化,数组也一样,需要完成初始化才能使用。
数组初始化就是为数组分配内存空间,并为数组中每个元素赋值。
数组的初始化分为:
动态初始化
静态初始化
2.3 数组的动态初始化
什么是动态初始化
只给定数组的长度,由系统给出默认初始化值。
动态初始化的格式
数据类型[] 数组名 = new 数据类型[数组长度];
double[] arr = new double[50];
//数组动态初始化
//定义长度为3的int数组
int[] arr = new int[3];
//定义长度为5的double数组
double[] arr = new double[5];
//定义长度为5的char数组
char[] arr = new char[5];
//定义长度为4的字符串数组
String[] arr = new String[4];
格式说明
int[] arr = new int[5];
- 等号左边:
- int:数组的数据类型
- []:代表这是一个数组
- arr:代表数组的名称
- 等号右边:
- new:为数组开辟内存空间
- int:数组的数据类型
- []:代表这是一个数组
- 5:代表数组的长度
2.4 数组元素访问
数组变量存储的是什么?
数组在堆内存中的地址值
什么是索引?
数组索引:数组元素的编号,从0开始,最大值为数组长度-1。
可以通过索引操作数组元素。
数组元素访问的格式?
数组名[索引]
public class ArrayDemo {
public static void main(String[] args) {
//定义并初始化长度为3的int数组
int[] arr = new int[3];
//输出数组名,得到一个地址值
System.out.println(arr); //[I@880ec60
//输出数组中的元素
System.out.println(arr[0]); //默认值0
System.out.println(arr[1]); //默认值0
System.out.println(arr[2]); //默认值0
}
}
2.5 JVM的内存分配(了解)
各个内存区的作用
区域名称 | 作用 |
---|---|
栈内存(Stack) | 方法运行时使用的内存,存放方法中的变量和参数。 |
堆内存(Heap) | 存储对象或数组,new出来的数据,都存储在堆内存。 |
方法区 | 存储已加载的class文件信息。 |
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
目前我们只需要关注栈内存和堆内存。
栈内存:栈中存放局部变量,方法执行完毕,内存释放。
堆内存:堆中存放的是new出来的数据( 数组,对象等 )。数据使用完毕后,等待垃圾回收器回收。
new出来的数据, 都有一个对应的地址
2.6 数组的内存图
数组元素的默认初始化值
整数类型 0
浮点类型 0.0
字符类型 空字符 ' '
布尔类型 false
引用类型 null
一个数组的内存图
多个数组的内存图
多个数组指向相同的内存地址
其中任意一个数组改变了堆中元素的值,其他的数组都会受到影响
2.7 数组的静态初始化
动态初始化格式
特点: 给定数组长度, 系统给出数组默认值
数据类型[] 数组名 = new 数据类型[数组长度];
数组名[索引] = 初始化值;
什么是静态初始化
在创建数组时,直接确定元素的值。
静态初始化的格式
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...}
//示例
静态初始化简化格式(掌握)
数据类型[] 数组名 = {元素1, 元素2, 元素3...};
//示例
创建一个double类型数组,存放:1.1, 2.2, 3.3
double[] arr = new double[]{1.1 ,2.2 , 3.3};
double[] arr = {1.1 ,2.2 , 3.3};
创建一个字符类型数组,存放: '中' '国'
char[] arr = {'中' , '国'};
创建一个布尔类型数组,存放:true true false
boolean[] arr = {true, true, false};
【练习】下面创建数组错误的是( C )
A、 int[] arr = new int[5];
B、 int arr[] = new int[5];
C、 int[] arr = new int[3]{1,2,3};
//int[] arr = new int[]{1,2,3};
//int[] arr = {1,2,3};
【练习】下面为数组初始化正确的写法是( A )
A: double c[]=new double[]{1,2}
B: double c[]=new double(1,2) // double c[]=new double[]{1,2}
C: double c[]=new double[](1,2) //double c[]=new double[]{1,2}
D: double c[]=new double{1,2} //double c[]=new double[]{1,2}
E: double c[]=new double[2]{1,2} //double c[]=new double[]{1,2}
【总结】数组的动态初始化和静态初始化的区别:
动态初始化:
只给出数组长度,系统给出默认值
int[] arr = new int[10];
静态初始化:
只给出元素的值. 系统给出长度
int[] arr = new int[]{1,2,3};
int[] arr = {1,2,3};
使用场景:
键盘录入50位同学的成绩: 使用动态初始化,创建长度为50的数组, 再为每一个元素赋值.
当数组元素的值是确定的时候,使用静态初始化
2.8 数组操作的常见问题
1、数组索引越界异常:ArrayIndexOutOfBoundsException
产生原因:访问到了数组中不存在的索引。
如何避免:在索引范围内访问数组元素。
/*
* 数组索引越界异常的产生:使用了不存在的索引
*/
public class TestArray5 {
public static void main(String[] args) {
int[] arr = {10,20,30}; //索引0 1 2
//下面代码会运行报错,因为arr索引范围为0~2,-1和3都不在范围内
System.out.println( arr[-1] );
System.out.println( arr[3] );
}
}
2、空指针异常:NullPointerException
产生原因:数组地址为null,此时操作数组元素就会报空指针异常。
注意:一旦出现空指针异常,要在代码中进行修改或进行非空判断,避免空指针异常产生。
/*
* 空指针异常的产生:操作了地址为null的数组
*/
public class TestArray5 {
public static void main(String[] args) {
int[] arr = {10,20,30};
//将数组地址置为null
arr = null;
//以下代码会报空指针异常
System.out.println( arr[0] );
}
}
2.9 数组的遍历
获取数组长度
数组名.length
遍历数组
//for循环进行数组遍历
public class ArrayDemo2 {
public static void main(String[] args) {
//定义数组
int[] arr = {11, 22, 33, 44, 55};
//使用for循环遍历并打印
for(int i=0; i <arr.length; i++) {
System.out.println(arr[x]);
}
}
}
2.10 求数组最值
需求:求数组最大值
分析:打擂台思想
步骤:
1、定义临时变量max,存储数组最大值,并假设第一个元素为最大值。
2、遍历数组,从第二个元素开始,逐个与max比较。
3、如果该元素比max变量还大,将该元素赋值给max变量。
4、循环结束后,max中存储的就是数组的最大值。
实现代码:
/*
* 需求:求出数组的最大值、最小值
*/
public class ArrayDemo3 {
public static void main(String[] args) {
//定义数组
int[] arr = {45,12,98,73,60};
//------------求数组最大值------------
//定义变量存放数组最大值,并假设第一个元素为最大值
int max = arr[0];
//从第二个元素开始,依次和max变量比较
for(int i=1; i<arr.length; i++){
//如果比max大的,就替换max的值
if( arr[i]>max ){
max = arr[i];
}
}
//循环结束后max存放的就是最大的值
System.out.println("最大值为:"+ max);
//------------求数组最小值------------
//假设第一个元素是最小的
int min = arr[0];
//从第二个元素开始,依次和min变量比较
for(int i=1; i<arr.length; i++){
//如果比min小的,就替换min的值
if( arr[i]<min ){
min = arr[i];
}
}
//循环结束后,打印最小值
System.out.println("最小值为:" + min);
}
}
数组
特点: 长度一致, 类型相同
初始化格式:
动态初始化
int[] arr = new int[5];
赋值:
arr[0] = 10;
静态初始化
标准写法:
int[] arr = new int[]{1,2,3};
简化写法
int[] arr = {1,2,3};
索引:
数组元素的编号, 从0 开始, 到数组长度-1为止
获取数组长度:
数组名.length
数组遍历
int[] arr = {1,2,3};
for(int i = 0; i<arr.length; i++){
//遍历的操作 arr[i]
System.out.println( arr[i] );
}
//数组元素求和
int[] arr = {1,2,3};
int sum = 0;
for(int i=0; i<arr.length; i++){
sum+=arr[i];
}
System.out.println( sum );
数组常见小问题:
索引越界异常 ArrayIndexOutOfBoundsException
访问了不存在的索引
空指针异常 NullPointerException
数组没有指向任何堆内存地址 int[] arr = null;
JVM内存分配
栈内存 : 存储局部变量, (main)方法里定义的变量
堆内存 : new出来的对象或数组
方法区
寄存器
本地方法栈
数组的内存图
int[] arr = new int[5];
new int[5]在堆中创建了一个长度为5的数组. 并将数组的地址返回给变量 arr ,arr存储在栈内存中.
方法执行完毕, 栈内存中的变量arr就会消失, 堆中创建出来的数组等待垃圾回收器的回收 (不可达)
多个数组指向相同的内存空间: int[] arr2 = arr;
其中任意一个数组改变元素的值, 另外的所有数组都会受到影响.
加强练习:手机验证码
/*
需求:定义数组,存储6位手机验证码
要求验证码为随机生成的0~9之间的整数,且不能重复。
*/
public class RandomNum {
public static void main(String[] args) {
//静态初始化数组
int[] arr = {-1,-1,-1,-1,-1,-1};
Random r = new Random();
//定义一个记录数组索引的变量
int index = 0;
loop:while(true){
//生成随机数
int num = r.nextInt(10);
//将num在数组中遍历,如果在数组中存在,则重新生成随机数
for(int i=0 ;i<=index; i++){
if( num==arr[i] ){
continue loop;
}
}
//如果代码能走到这里,说明num在数组中不会重复
arr[index++] = num; //index的范围0~5
//index++;
if(index==6){
break;
}
}
System.out.println(Arrays.toString(arr));
}
}
package com.itheima.test;
/*
生成网站登录验证码:
4位
组成包括 数字0—9 英文大写小写, 随机生成
*/
import java.util.Random;
public class CharTest {
public static void main(String[] args) {
//随机数工具类
Random r = new Random();
for(int i=0; i<4; i++){
int number = r.nextInt(3); //0 1 2
switch (number){
case 0:
//随机生成数字0—9
int num1 = r.nextInt(10);
System.out.print(num1);
break;
case 1 :
//随机生成英文大写 65 -90
int num2 = r.nextInt(26)+65;
System.out.print((char)num2);
break;
case 2:
//随机生成英文小写97 -122
int num3 = r.nextInt(26)+97; //0~25 + 97
System.out.print((char)num3);
break;
}
}
}
}