文章目录
IDEA开发工具
1.1开发工具概述
IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写。所以,需要有JRE运行环境并配置好环境变量。
它可以极大地提升我们的开发效率。可以自动编译,检查错误。在公司中,使用的就是IDEA进行开发。
1.2 IDEA软件安装
此软件集成了32位和64位,双击 ideaIU-2017.3.2.exe 进入安装
1.2.1 欢迎界面
1.2.2 选择安装路径
1.2.3 配置安装选项
1.2.4 开始菜单
1.2.5 安装完毕
IDEA开发工具安装完成
1.3 IDEA的项目结构
1.3.1 IDEA的项目结构介绍
1.3.2 选择不导入任何设置,点击 OK
1.3.3 选择 Create New Project
1.3.4 选择左下角的 Empty Project
1.3.5 输入项目名称和保存路径
1.3.6 打开一个每日一帖对话框,勾掉每次启动显示,点击 close
1.3.7在弹出的窗口中,点击+号。选择 new module
1.3.8 在弹出的new module窗口中,点击new
1.3.9 选择 JDK9 目录 ,点击确定。再点击 next
1.3.10 给视图起名字,然后点击 finsh
1.3.11 创建完成后,点击 ok
1.3.12 看到我们创建好的项目
1.4 创建包和类
1.4.1 展开创建的工程,在源代码目录 src 上,鼠标右键,选择 new-package ,键入包名 com.itheima.demo ,点击确定。
右键点击 com.itheima.demo ,选择 Show in Explorer ,会发现创建包的目录结构。
可见 com.itheima.demo ,表示创建了多级的文件夹。
小贴士:所谓包,就是文件夹,用来对类文件进行管理。
1.4.2 在创建好的包上,鼠标右键,选择 new**-**>class 创建类,键入类名。
1.4.3 在代码编辑区,键入主方法,并输出 HelloWorld 。
1.4.4 运行程序,在代码编辑区鼠标右键,选择 Run HelloWorld 即可,
或在菜单中选择 Run>Run HelloWorld 。
1.5 字体设置
IDEA工具的默认字体非常小,代码编辑器和控制台的输出字体都需要进行调整。
- 点击菜单栏上的 File->Settings->Editor->Font 修改字体。
1.6 IDEA的项目目录
-
我们创建的项目,在d:\ideawork目录的demo下
out 目录是存储编译后的.class文件
src 目录是存储我们编写的.java源文件
1.7 IDEA常用快捷键
1.8 IDEA修改快捷键
在IDEA工具中, Ctrl+空格 的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中的快捷键。
File->Settings->keymap->Main menu->code->Completion->Basic
双击 Basic->remove->Ctrl+空格
再次双击 Basic->Add Keyboard->键入 Alt+/->点击OK
1.9 IDEA导入和关闭项目
关闭IDEA中已经存在的项目, File->Close Project
File->Close Project 这时IDEA回到了刚启动界面,点击项目上的 X ,IDEA中就没有这个项目了
在IDEA的启动界面上,点击 OPEN ,选择项目目录即可
小贴士:课后若想通过IDEA同时开启多个项目,点击OPEN打开项目时,点击New Window按钮
1.数组
1.1什么是数组【理解】
数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
1.2数组定义格式【记忆】
1.2.1第一种
数据类型[] 数组名
示例:
int[] arr;
double[] arr;
char[] arr;
1.2.2第二种
数据类型 数组名[]
示例:
int arr[];
double arr[];
char arr[];
1.3数组动态初始化【应用】
1.3.1什么是动态初始化
数组动态初始化就是只给定数组的长度,由系统给出默认初始化值
1.3.2动态初始化格式
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
1.3.3动态初始化格式详解
-
等号左边:
-
int:数组的数据类型
-
[]:代表这是一个数组
-
arr:代表数组的名称
-
-
等号右边:
-
new:为数组开辟内存空间
-
int:数组的数据类型
-
[]:代表这是一个数组
-
5:代表数组的长度
-
1.4数组元素访问【应用】
1.4.1什么是索引
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
1.4.2访问数组元素格式
数组名[索引];
1.4.3示例代码
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
//输出数组名
System.out.println(arr); //[I@880ec60
//输出数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
1.5内存分配【理解】
1.5.1内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
1.5.2java中的内存分配
- 目前我们只需要记住两个内存,分别是:栈内存和堆内存
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
1.6单个数组的内存图【理解】
定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。
我们定义一个名称为arr的数组,长度为:3,假设输出地址为:001,我们可知局部变量在栈,new新建的对象在堆,arr的地址指向new创建对象的地址,
动态分配的初始值为:0 0 0,arr[0]=0;arr[1]=0;arr[2]=0;
我们给数组重新赋值:arr[0]=1;arr[1]=2;arr[2]=3;
package com.demo01;
/*
* 数组:存储同一种数据类型的多个元素的容器
*
* 定义格式:
* A:数据类型[]数组名; (推荐的方式)
* B:数据类型 数组名[];
*
* 举例:
* int[] arr; 定义了一个int类型的数组名,数组名是arr
* int arr[]; 定义了一个int类型的变量,变量名是arr数组
*
* 数组初始化
* A:所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
* B:数组的初始化方式
* a:动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
* b:静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
* 动态初始化
* int [] arr = new int [30];
*/
public class ArrayDemo {
public static void main(String[] args) {
// int [] arr = new int [30];
int[] arr = new int[3];
/*
* 左边
* int:说明数组的元素类型是 int 类型
* []:这是一个数组
* arr:数组的名称
*
* 右边
* new:Ϊ为数组申请内存分配,开辟空间
* int:说明数组中的元素类型是int类型
* []:说明这是一个数组
* 3:数组长度
*/
//输出数组名字
System.out.println("arr:"+arr); //arr:[I@626b2d4a 内存地址
//我们获取数组的地址是没有意义的,我要的是数组中的元素值,该怎么办呢?
//不用担心,Java已经帮我们想好了
//其实数组中每个元素都是有编号的,编号从0开始,最大的编号是数组长度-1
//ͨ通过数组名和编号的配合使用我们就可以获取指定编号的元素值ֵ
//这个编号的专业叫法:索引
//访问格式:数组名[索引]
System.out.println("*****************************");
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("*****************************");
//给数组赋值
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
运行结果:
1.7多个数组的内存图【理解】
定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。
定义两个数组,分别是arr和arr2,长度为:2和3,假设arr输出地址为:001,arr2输出地址为:002,我们可知局部变量在栈,new新建的对象在堆,arr的地址指向new创建对象的地址,动态分配的初始值为:0 0 ,arr[0]=0;arr[1]=0;
我们给数组重新赋值:arr[0]=0;arr[1]=1;arr2的地址指向new创建对象的地址,动态分配的初始值为:0 0 0,arr[0]=0;arr[1]=0;arr[2]=0;我们给数组重新赋值:arr[0]=0;arr[1]=1;arr[2]=2;
package com.demo01;
/*
* 定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。
*/
public class ArrayTest2 {
public static void main(String[] args) {
//定义两个数组
int[] arr = new int[2];
int[] arr2 = new int[3];
//分别输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
System.out.println("--------------------");
//然后分别给数组中的元素赋值ظ�ֵ
arr[1] = 100;
arr2[0] = 200;
arr2[2] = 300;
//再次输出数组名及元素ٴ
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
运行结果:
1.8多个数组指向相同内存图【理解】
定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
然后给第二个数组赋值,再次输出两个数组的名及元素,
首先我们定义一个arr数组,给arr数组赋值,arr[0]=100;arr[1]=200;arr[2]=300;
然后把第一个数组的地址赋值给第二个数组,第二个数组的地址和第一个数组的地址是一样的,他们的值也是一样的,
之后给第二个数组赋值,他们的地址都指向同一个地址,他们重新赋值后,他们值应该都是新的重新赋值的值。
package com.demo01;
/*
* 定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素
*/
public class ArrayTest3 {
public static void main(String[] args) {
//定义一个数组
int[] arr = new int[3];
//赋值ֵ
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
//输出
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("-----------------------------");
//然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组
int[] arr2 = arr;
//给第二个数组赋值ֵ
arr2[0] = 111;
arr2[1] = 222;
arr2[2] = 333;
//再次输出两个数组的名称及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("-----------------------------");
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
System.out.println("-----------------------------");
}
}
运行结果:
1.9数组静态初始化【应用】
1.9.1什么是静态初始化
在创建数组时,直接将元素确定
1.9.2静态初始化格式
-
完整版格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
-
简化版格式
数据类型[] 数组名 = {元素1,元素2,...};
1.9.3示例代码
public class ArrayDemo {
public static void main(String[] args) {
//定义数组
int[] arr = {1, 2, 3};
//输出数组名
System.out.println(arr);
//输出数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
1.10数组操作的两个常见小问题【应用】
1.10.1索引越界异常
-
出现原因
public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr[3]); } }
数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。
程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
-
解决方案
将错误的索引修改为正确的索引范围即可!
1.10.2空指针异常
-
出现原因
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 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
-
解决方案
给数组一个真正的堆内存空间引用即可!
1.11数组遍历【应用】
-
数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
public class ArrayTest01 { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]); System.out.println(arr[4]); } }
以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。
public class ArrayTest01 { public static void main(String[] args) { //定义数组 int[] arr = {11, 22, 33, 44, 55}; //使用通用的遍历格式 for(int x=0; x<arr.length; x++) { System.out.println(arr[x]); } } }
1.12数组最值【应用】
-
最大值获取:从数组的所有元素中找出最大值。
-
实现思路:
- 定义变量,保存数组0索引上的元素
- 遍历数组,获取出数组中的每个元素
- 将遍历到的元素和保存数组0索引上值的变量进行比较
- 如果数组元素的值大于了变量的值,变量记录住新的值
- 数组循环遍历结束,变量保存的就是数组中的最大值
-
代码实现:
public class ArrayTest02 { public static void main(String[] args) { //定义数组 int[] arr = {12, 45, 98, 73, 60}; //定义一个变量,用于保存最大值 //取数组中第一个数据作为变量的初始值 int max = arr[0]; //与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中 for(int x=1; x<arr.length; x++) { if(arr[x] > max) { max = arr[x]; } } //循环结束后打印变量的值 System.out.println("max:" + max); } }