java任务三
初识Idea
-
新建一个项目和类大体步骤:
创建一个空项目(JavaSE_Code)
创建一个新模块(idea_test)
在idea_test模块下的src下创建一个包(com.itheima)
在com.itheima包下新建一个类(HelloWorld)
在HelloWorld类中编写代码
在idea中执行程序 -
详细步骤
点击file—>new—>project…—>Empty Project—>next,然后修改项目名字和本地位置(本地位置最好就不改了,放在统一的地方)
然后—>新建modules—>点击modules下面的“+”—>选择new module,然后进入一个new module的界面,你先看这里的SDK有没有匹配到你JDK的目录,如果没有的话,要自己去选择JDK的安装路径(注意不是bin的路径哦)—>点击next然后修改一下名字如下图
—>然后finish—>点击ok。这样新的项目就做好了
下面右键src,新建包,然后在包下新建类。然后写代码,右键代码区run。
-
什么叫SDK?答:SDK即software development kit,中文意思是软件开发工具包;SDK一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具集合。
-
什么叫集成开发环境?答,集成环境:把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。
-
这Idea中的项目结构,如图,Project就相当于一个门课,数学课与语文课相当于是不同项目。项目下有不同的模块,就相当于,一门课有不同的章节,包就相当于,某章下的某节,类就是知识点。(Idea项目中,与这个内容相关我们建一个模块,与另一个内容相关的,我们建另一个模块)
-
模块的新建、删除、导入(比如你要使用别人的模块,你就需要导入)
新建模块:你点击file—>project Structure—>点击“+”—>new Module—>先看上面的SDK有没有匹配到正确的JDK。没有的话,得自己手动去选择你JDK的路径。—>next—>输入模块名—>点击finish—>点击OK。新建成功。
然后右边就会出现这个新模块,如图
删除模块:你右键选中的模块,选中remove module,他问你是否要删除,你点击remove。然后这个Idea里就没有了,但是你打开项目的磁盘位置,你会发现他没有真正的删除(这里讲一个可以快速找到那个module所在位置的方法,比如你删除了test这个模块,你可以右键idea_test
这个模块,选择show in Explorer就会找到这个idea_test这个模块的位置了,因为test那个模块和这个模块在一个地方,所以这个方法可以快速地找到删除的模块进来你会发现这个test模块还在,你要是在这个文件夹下给他删除,他就是真的删除了)
模块导入:比如你去拿到别人的模块,你需要把模块移到一个项目下,然后在idea中点击file—>project Structure—>点击“+”—>选择import module,然后选择你新模块的位置,点击OK,然后他会跳出一个“create module from exist sources”,你点击next,next,finish,ok,它就进来了,但是可能会出现这个问题,如图
你点击set sdk就行。
数组
-
什么是数组
数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
-
定义的数组变量的格式(两种):
格式1:数据类型[] 数组名
int[] arr; double[] arr; char[] arr;
格式2:数据类型 数组名[]
int arr[]; double arr[]; char arr[];
他们两个定义方式的使用是一样。效果也是一样的。
//int[] arr=new int[3]; //int [] arr=new int[3]; //int [] arr=new int[3]; //int []arr=new int[3]; //int arr []=new int[3]; //int arr []=new int[3]; 这些都是可以的,但是建议还是用最上面两个写法之一比较好
数组的初始化
上面定义数组变量的格式是定义,int[] arr=new int[3];或是int[] arr={12,4,45,1}中前面的部分,下面要讲的是定义数组的后面的那个new int[3]那个部分,这一部分就是在堆中开辟空间的。而且开辟空间的同时也是要伴随初始化的。
Java中的数组和java变量一样,定义后必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋初值
初始化(即赋初始值)可以分为两种方式:一个是动态初始化,一个是静态初始化
动态初始化
-
动态初始化:数组动态初始化就是只给定数组的长度,由系统给出默认初始化值。
格式:数据类型 [ ] 变量名 = new 数据类型[数组长度];
范例:int [ ] arr = new int[3];(其中arr是这整个数组的数组名,3表示数组的长度为3,所以有arr[0]、arr[1]、arr[2]三个元素,arr[3]就下标越界了)
-
动态初始化格式详解
比如这样:
int[] arr = new int[3];
-
等号左边:
-
int:声明数组的数据类型
-
[]:代表声明的变量是一个数组
-
arr:代表数组的变量名称,也叫数组名
-
-
等号右边:
- new:为数组开辟内存空间。new的作用就是开辟空间。
-
int:开辟出来的数组空间是int的数据类型。相当于,你实际开辟出来的数组空间里面的每一个小房间里面实际存放的值是int型的。
- []:代表开辟出来的空间实际是一个数组空间
-
5:代表数组的长度为5
-
-
数组元素访问
-
什么是索引
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。像arr[12];这里的12就是索引。
-
访问数组元素格式
索引就是用来访问数组中的某个元素的。
使用索引的格式如下:
数组名[索引];
实例:
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]); } }
注意:
直接输出数组名,结果是一个地址,原因下面讲。
注意索引下标越界的异常,比如上面的代码你System.out.println(arr[3]);就会出现错误
-
-
内存分配
内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后在适当的时期会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
-
java的内存分配
Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,虚拟机就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
目前我们只需要记住两个内存,分别是:栈内存和堆内存。
-
java中数组的内存分配问题
int[] arr=new int[3];中arr这个变量是存放在栈区的,new int[3]这个对象是存放在堆区的,系统看你new了一个int[3],系统就知道你需要怎样的一个空间,就会如图(堆内存),他会给你分好,给你分配一个多大空间是索引0,多大是索引1,多大是索引3。堆里面他只要知道多大,然后那些给arr[0]哪些给arr[1],但是不知道是吃什么,int的空间让他吃float的变量也不是不可以呀,但是编译器那一关过不了。他只知道,多大是索引1的范畴,多大是索引2的范畴,不知道吃什么。
分好堆区域的内存之后,这个整个分好的数组空间会有一个地址。new int[3]的返回就是一个地址。所以int[] arr的arr就得到了一个能指向那个堆中数组空间得地址了,就是那个[I@880ec60。
像那些局部变量都是放在栈区的。对象放在堆区。
用索引访问数组的元素的过程是怎样的?
比如System.out.println(arr[2]);访问那个arr的索引为2的值是怎么访问的。答:他是先根据arr这个值(这个值是一个地址),找到堆内存里的那块内存,然后再用2这个索引,找到索引值为2的那个空间对应的值给作为arr[2]的返回。所以打印出来为0。
(因为用new来初始化数组,他会先以默认值填充堆内存对应的值,比如他知道这是一个int数组,他默认填充的就是0,若是知道是double类型的数组,就默认填充0.0。下面是个类型数组默认填充的初始值)
整数:默认值0
浮点数:默认值0.0
布尔值:默认值false
字符:默认值是空字符
引用数据类型:默认值是null -
可以改变堆内存里那个索引的对应的值,比如
-
多个数组变量可以指向一个数组对象。然后要是有一个数组变量改变了那个堆内存里的数组对象的某个索引的值,其他同样指向这个对象的变量去访问这个对象,会得到改变之后的值。比如:
-
变量和对象的回收不用太去看,反正对象由垃圾回收器线程自动回收。java的垃圾回收不用太去看,因为他是自动的,主要看他的作用域。
-
静态初始化
-
静态初始化:在创建数组时,直接将元素确定
-
完整版格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
范例: int [ ] arr = new int[ ] { 1 , 2 , 3 } ;
-
简化版格式
数据类型[] 数组名 = {元素1,元素2,...};//即把new 数据类型省略
范例: int [ ] arr = { 1 , 2 , 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]); } }
常见小问题
-
索引越界异常
-
出现原因
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 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
-
解决方案
给数组一个真正的堆内存空间引用即可!
-
常见应用
-
数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
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]); } } }
-
最大值获取:从数组的所有元素中找出最大值。
实现思路:
- 定义变量,保存数组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); } }
注意点
像这样的定义多个变量的可以。且,这个count是int型的变量不是一个数组。
int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},count=0;
但是像这样的化话,想要定义一个数组和变量一起定义的话就不行
int[] oldArr = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},count=0;
但是这样是可以的,只是这个count是数组,不是变量,且没有初始化
int[] oldArr = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},count;