1.数组
1.1定义
相同类型数据的有序集合,按一定顺序排列组合,其中每一个数据称为元素,每个元素可通过数组的索引或下表定位。
1.2特点
1.数组本身是引用类型数据,而元素可以为任意类型(基本类型/引用类型)
2.创建数组会在内存中开辟一块空间,空间是连续的。数组名中的引用时连续空间的首地址
3.数组长度一旦确定不能修改
4.储存数据类型必须相同,不能出现混合类型。
1.3分类
维度:一维数组、二维数组、三维数组、多维数组……
数据类型:基本类型(整形、浮点型、字符型、布尔型)、引用类型
1.3.1一维数组
1.定义格式
格式一: 数据类型 【】 变量名 (数组名) (常用)
格式二: 数据类型 变量名 【】
2.初始化
java中数组必须先初始化(为数组中元素分配空间并赋值)后才能使用
方式一 静态初始化: 数据类型 【】 变量名 = new 数据类型 【】{数据1,数据2,……}
数据类型 【】 变量名 ={数据1、数据2、……}(简化)
(数组声明和元素空间分配及赋值一次进行,可不用声明数组长度)
方式二 动态初始化: 数据类型 【】 变量名 = new 数据类型【数组长度】
(数组声明和元素的分配空间及赋值分开进行)
初始化形式 变量名 【索引】= 变量值
索引即为数组中的空间地址,值为0~(数组长度-1)
3.默认值
数组元素即使没有赋值也会有默认值
byte、short、int类型默认值为0 long类型默认值为0L
float、double类型默认值为0.0 char类型默认值为”\u0000“(空白)
boolean类型默认值为false String类型默认值为null
4.数组长度
可由输出数组属性 数组名.length 获取
当数组索引超过数组长度时,会发生报错 “ArrayIndexOutOfBoundsException”(数组下标越界异常)
5.内存管理
程序向JVM申请内存 —> JVM向操作系统申请内存
内存是计算机中的重要组件,程序必须要申请内存才能执行,且执行结束后需要清空内存
JVM要运行程序,必须对内存进行空间分配
5.1 java中的内存分配
程序计数器 :CPU记录文件运行到何处
本地方法栈:JVM调用操作系统的功能使用
方法区:储存class文件
堆区:储存申请了内存空间(new)的对象或数组,如果申请不到内存则会抛出“”内存溢出异常
虚拟机栈:存放“栈帧”,栈帧中存放对基本类型数据变量和对象的引用、操作数栈、方法出口以及其他信息,每个栈帧对应一次方法的调用。当栈调用的深度大于JVM允许范围时会发生异常。
5.2一维数组内存结构
main方法运行,数组存入栈内存,数组数据存入堆内存,通过栈帧可由数组调用数组中的数据
6.数组使用注意事项
1.“ArrayIndexOutOfBoundsException”数组下标越界异常
说明数组索引大于数组长度
解决方案:修改数组索引,使其小于数组长度
2.“NullPointerException”空指针异常
说明引用类型的变量不指向任何对象(没有引用到数据)
解决方案:给引用类型的变量一个真正的堆内存空间引用
7.数组常见操作
遍历 获取数组中的每一个元素
for(int i= 0;i < arr.length;i++){
System.out.println(arr[i]);
}
增强for循环(jdk1.5新增):专门用于遍历
for(int a:arr){
System.out.println(a);
}
增强for循环 遍历时更简洁
普通for循环 可通过索引精确控制每一个元素,增强for循环不行
拷贝 用于数组扩容
普通拷贝
public static void main(String[] args) {
int[] arrSrc = {2,3,52,11,4,5,43,2,1};
int[] arrDest = new int[arrSrc.length];// 新数组的长度 必须大于等于原数组
for(int i = 0 ; i < arrDest.length;i++){
arrDest[i] = arrSrc[i];
}
for(int a : arrDest){
System.out.println(a);
}
}
无限扩容
public static void main(String[] args) {
int[] arrSrc = new int[5];
int[] arrNew=null;
int count=0;
for(int i = 0 ; i< 100;i++ ){
if(count < arrSrc.length){//当数组中的元素的个数小于数组的长度 则可以保存数据到数组中
arrSrc[i]=i;//给数组添加元素
}else{//数组中的数据的个数大于等于了数组的长度
arrNew = new int[arrSrc.length +(int)(arrSrc.length * 0.75)];
for (int j = 0 ; j < arrSrc.length;j++){
arrNew[j]= arrSrc[j];
}
arrSrc = arrNew;
arrSrc[i]=i;//给数组添加元素
}
count++;//统计数组中数据的个数
}
//遍历
for(int a : arrNew){
System.out.println(a);
}
}
最值 获取数组中的最大最小值
记录元素的值进行输出
public static void main(String[] args) {
int[] arr = {2,52,26,22,12,3,223,22,91,81};
// 获取数组中的最大元素
int max = arr[0];//假设第一个元素是最大的
for(int a : arr){
if(a > max){
max = a;
}
}
System.out.println(max);
}
记录元素的位置进行输出
public static void main(String[] args) {
int[] arr = {2,52,26,22,12,3,223,22,91,81};
// 获取数组中的最大元素
int maxIndex=0;
for(int i = 0 ; i < arr.length;i++){
if(arr[i] > arr[maxIndex]){
maxIndex = i;
}
}
System.out.println(arr[maxIndex]);
}
1.3.2二维数组
1.初始化
动态初始化:
int [][] arr = new int [3][5];//三行五列二维数组
arr [0][0] = 12; //赋值
arr [0][1] = 34;
int [][] arr = new int [3][]
arr[0] = new int [3];
arr[1] = new int [4];
arr[2] = new int [5];
二维数组初始化必须定义行(第一个数组),可不定义列(第二个数组)
静态初始化:
int [][] = int[][] arr = {{2,1,4},{3,1,4,2,1},{3}};
int[][] arr =new int[][]{{2,1,4},{3,1,4,2,1},{3}};
2.二维数组内存结构
与一维数组类似,不同在于堆内存中存放了数组1和数组2的数据,数组2数据由数组1调用,数组1数据由数组2调用
2.方法
方法:将具有独立功能的代码库组织成为一个整体,使其具有特殊功能的代码集。
注意: 方法必须先创建才可以使用,过程就成为方法的定义。方法定义之后不能直接运行 需要手动的调用 才可以执行。过程称为方法的调用。
2.1无参方法的定义和调用
定义:
public static void 方法名称(){
方法体;
}
调用方法: 方法名称();
调用过程:
main方法入栈后,执行main方法中的代码,执行到方法代码时,方法入栈,执行方法代码,执行完毕后方法出栈并清除方法内存,继续执行main方法代码,最后main方法出栈。
2.2带参方法的定义和调用
定义:
public static void 方法名称(参数类型 参数名称,参数类型 参数名称,…………)
调用:
方法名称(参数1,参数2,参数3,…………)(参数的数量和类型必须与方法定义的一致)
形参:方法定义式中的参数。
实参:方法调用时使用的参数。
形参和实参的功能是传递数据,发生方法调用时,实参的值会传递给形参。
2.3形参和实参的区别
1.形参只在方法内部有效,在方法外部无效。
2.实参可以是任意类型数据,但调用时一定要有确定的值。
3.形参和实参在数量、类型、顺序上都必须严格一致。(能够自动类型转换的除外)
4.方法调用时,数据的传递时单向的,即只有实参能传递给形参,且形参的值的改变不会影响实参。参数传递完成后实参和形参将不会有任何关系。
2.4带返回值方法的定义和调用
定义:
public static 返回值类型 方法名称(参列表){
方法体;
return 数据;(数据类型和返回值类型必须一致)
}
调用:方法名称(参数列表)
注意:return后不执行之后的语句 当返回值类型为void是也可写return,形式为 retrun;
2.5方法的注意事项
1.方法不能嵌套定义,方法之间为平行关系,方法只能调用方法
2.void表示无返回值,可省略return,也可单独属性,后面不跟任何数据
3.方法必须被调用才会执行
2.6方法的参数传递
值传递:传递的是数据本身(参考2.3形参和实参的区别)
引用传递:传递的是地址(引用),所以引用的只要是同一个地址空间,任何地方对空间的修改都会引起整个的变化
2.7方法的重载
方法重载条件:1.形参个数不同 2.参数类型不同 3.不同类型参数顺序不同
注意:方法的返回值类型不能作为方法是否重载的判断依据。