数组
数组指的是一种容器,可以用来存储同种数据类型的多个值
定义,如何创建一个数组
1.数据类型[] 数组名
2.数据类型 数组名[]
初始化:在内存中,为数组容器开辟空间,并将数据存入容器中的过程
静态初始化
1.类型[] 变量名 = new 类型[]{元素1,元素2...}
2.类型[] 变量名 = {元素1,元素2...}
动态初始化
类型[] 变量名 = new 类型[长度]
数组的地址值
表示数组在内存中的位置,实际的值存储在一个地址中
打印出来的乱码,看似是乱码其实有含义
[:表示是一个数组
D:表示是double类型
@:表示一个间隔符号固定格式
后面的数字就是数组真正的地址值十六进制
数组访问
数组名[索引];指的就是数组中对应位置的值
索引:也叫做下表,角标;特点从0开始,逐个+1增长,连续不间断
当你改变值时,会覆盖原数据
数组遍历
遍历就是将数组中的所有内容取出来,可以打印,求和,判断等
遍历时我们需要用到数组长度属性,数组名.length
idea中更简便的,数组名. fori相当于是快捷键,可以快速创建for循环
要注意索引的值,从0开始,防止访问不存在的索引,引发索引越界异常
数组内存图
了解数组内存的原理,首先要了解java的内存是怎么分配的
首先java内存分配:栈,堆,方法区,本地方法栈,寄存器
这里要注意一下的是JDK8开始,取消方法区,新增元空间,把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中
栈,方法运行时使用的内存,比如main方法运行,进入方法栈中执行
堆,存储对象或者数组,new来创建的,都存储在堆内存,有地址值
方法区,存储可以运行的class文件
本地方法栈,JVM在使用操作系统功能的时候使用,和开发无关
寄存器,给CPU使用,和开发无关
了解完这写我们就可以举一个场景例子,创建一个数组并初始化,然后方法结束
int[] intArray = {1, 2, 3, 4, 5};
左边是方法在栈中,然后右边是数组在堆中,然后其实是将一个地址传给左边,这个时候修改之类的操作其实是将地址中的值修改,而不会影响地址。
方法
方法是程序中最小的执行单元,提高复用性和可维护性,因为在日常的编程中随着问题变得复杂,这个时候可能很多时候会用同一流程,有的代码会重复出现很多次,这个时候如果我们能将这段代码提出然后独立成方法,然后要用直接调用就能省很多力气。
格式
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
打包和调用
方法的定义:把一些代码打包在一起
调用:手动调用执行
无参,有参,有返回值调用
格式中的区别就是,返回值没有就是void有的话是什么类型就写什么,参数就是需要传入什么参数,就写几个和什么类型,返回值有就return没有就不写。
然后我们还要了解一下形参和实参的概念,
形参和实参
形参:方法定义中的参数
实参:方法调用中的参数
但是很多时候我们会发现同样的方法,可能有时候需要输入的参数有区别,比如说同样是将数字相加,可能有时候输入时整数,有时候有小数,所以我们需要同名的方法可以有不同的调用,这里就需要说重载。
重载
在同一个类中,定义了多个同名得方法,这些同名得方法具有同种得功能
不同的参数类型或参数个数,与返回值无关
数据类型
基本数据类型:整数类型,浮点数类型,布尔类型,字符类型
变量中存储的是真实的数据
引用数据类型:除了基本都是
变量中存储的是地址值
引用:使用了其他空间中的数据
值传递
传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值
传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值
快捷方式:ctrl +alt +m自动抽取方法
练习
1.求最值
就是一个循环,从数组的第一个开始,开始和后面比大小,然后留下大的继续循环比较得到最值,最小的同理
2.遍历求和
也是一个循环,定义一个sum用来求和
3.交换数据
在这个时候需要两个下标索引,来进行交换,两个下标一个从左往右一个从右往左然后交换
4.拷贝数组
遍历的时候,创建新数组来存数据,然后调用打印出来