标签(空格分隔): 未分类
数组的概述(非常非常重要)
数组是什么?
可以存储同一数据类型数据的集合/容器
格式
数据类型[] 数组名 = new 数据类型[数组的长度];
int[] arr = new int[3];
char[] arr = new char[5];
double[] arr = new double[10];
数据类型: 基本数据类型 引用数据类型
基本数据类型 :四类八种
String 引用数据类型
String[] arr = new String[5];
分解
左边:
int:数据类型
[]:代表的数组,几个中括号就代表几维数组
arr:合法的标识符
右边:
new:创建新的实体或对象
int:数据类型
[]:代表的数组
5:代表数组的长度
数组的动态初始化(重要)
class DataArray_Demo {
public static void main(String[] args) {
/*
什么是数组初始化? 为数组开辟连续的内存空间
默认初始化值
整数 0 小数 0.0 布尔 false char '\u0000'
数组的动态初始化格式
数据类型 [] 数组名 = new 数据类型[数组的长度];
*/
int [] arr = new int[5]; //整型
char [] arr1 = new char[10]; //字符型
double [] arr2 = new double[5]; // 浮点型
String [] arr3 = new String [5]; //字符串类型
//问题: 怎么获取数组中元素?
// 数组名[索引/下标/角标]
System.out.println(arr[0]);
System.out.println(arr1[0]);
System.out.println(arr2[0]);
System.out.println(arr3[0]);
}
}
数组的内存图(要会画出来)
内存分区:
栈内存 堆内存 方法区 本地方法区 寄存器
栈内存 堆内存
举例:int [] arr = new int[5] ;
栈内存 : 方法进栈 存放局部变量
堆内存 : new 出来的对象
内存图的练习
要求能够自己根据案例画出内存图
一个数组 两个数组 三个引用两个数组
疑问:
class ArrayDemo {
public static void main(String[] args) {
int [] arr1 = new int[5];
int [] arr2;
int [] arr3;
//疑问: 没有初始化的引用数据类型,能直接用吗?不可以,要初始化后才在堆内存赋予默认值
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[3]);
System.out.println(arr1[4]);
}
}
数组静态初始化(非常重要)
静态初始化
一开始创建数组,直接给数组赋值
格式:
数据类型 [] 数组名 = new 数据类型[] {元素1,元素2....};
简写版本
数据类型[] 数组名 = {元素1,元素二...};
注意事项:
举例 int [] arr ;
arr = {1,2,3...};
简写版本不允许写成两条语句,标准版本可以.简写不可以!
不允许动静结合
举例 int [] arr = new int[5]{1,2,4,5,6}; //不允许!
定义什么数据类型的就写什么类型的元素,不要搞错!
class ArrayDemo01 {
public static void main(String[] args) {
//静态初始化 简写版本
int[] arr = {1,2,5,6};
char [] arr2 = {'我','爱','超','帅'};
double [] arr3 = {1.1,1.2,13.5,2.0};
//标准版本
int [] arr4 = new int[]{5,6,7,8};
char [] arr5 = new char[]{'超','帅','很','帅'};
}
}
数组两个异常(非常重要)
数组越界异常ArrayIndexOutOfBoundsException
空指针异常NullPointerException
class ArrayException_Demo {
public static void main(String[] args) {
//定义一个数组,开辟三个连续空间
int[] arr = new int[3];
//System.out.println(arr[5]); ///java.lang.ArrayIndexOutOfBoundsException: 5 越界异常
//空指针异常 没有任何指向,地址值木有了....
int [] arr2 = new int[4];
arr2 = null;
System.out.println(arr2[2]); java.lang.NullPointerException
}
}
数组的遍历(非常非常非常重要)
遍历:把数组中的元素依次输出
属性: 数组名.length 可以求出数组的长度
int[] arr = {1,2,3,4,5};
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
/*
* A:案例演示
* 数组遍历:就是依次输出数组中的每一个元素。
* 数组的属性:arr.length数组的长度
* 数组的最大索引:arr.length - 1;
*/
class Demo8_Array {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55};
/*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]);*/
for (int i = 0;i < 5 ;i++ ) {
System.out.println(arr[i]);
}
System.out.println("---------------");
//arr.length 代表的是数组的长度
System.out.println(arr.length);
for (int i = 0;i < arr.length ;i++ ) {
System.out.println(arr[i]);
}
int[] arr2 = {3,4,5};
print(arr2);
}
/*
数组的遍历
1,返回值类型void
2,参数列表int[] arr
*/
public static void print(int[] arr) {
for (int i = 0;i < arr.length ;i++ ) {
System.out.print(arr[i] + " ");
}
}
}
获取最值(练习)
第一步: 创建一个数组
第二步: 先把数组中第一个元素 用一个变量存储起来
第三步: 遍历数组,然后拿刚才保存的第一个元素 逐个和第二个开始的元素比较,如果第一个元素小于第二个,那就交换,定个临时变量交换!
第四步:直至遍历完成,得到的那个变量就是最大值
数组反转(练习)
class ArrayReverseDemo {
public static void main(String[] args) {
//第一步 创建一个数组
int [] arr = {11,22,33,44,55};
//第二步: reverseArr
int[] newArr = reverseArr(arr);
for (int j = 0;j < newArr.length ;j++ )
{
System.out.print(newArr[j] + " ");
}
}
public static int[] reverseArr(int[] oldArr){
//思想
//第一步 创建一个新的数组,然后长度和你传进来的数组长度一样
//第二步 把旧的数组元素 从后面开始 往前一个个 存到新的数组里面
int [] newArr = new int[oldArr.length];
//第三步 遍历
for (int i = 0;i < oldArr.length ;i++ )
{
newArr[i] = oldArr[oldArr.length - 1 - i];
}
return newArr;
/*
for (int j = 0;j < newArr.length ;j++ )
{
System.out.print(newArr[j] + " ");
}*/
}
}
数组的查找(练习)
第一步: 创建一个数组
第二步: 定义一个方法,方法声明要求传入你要找的值和值所在的数组
第三步: 遍历数组,把数组中的元素逐个和你要找的元素匹配,如果能找到,返回这个数的角标,如果找不到,返回-1
二维数组(了解)
本质
其实就是一个一维数组,在一维数组里面放的是一维数组
定义
写法一 :数据类型 [] [] 数组名 = new 数据类型 [m][n];
写法二 :数据类型 [] 数组名 [] = new 数据类型[m][n];
举例:
int[][] arr = new int[3][2];
int[] arr[] = new int[5][3];
格式二
数据类型 [][] 数组名 = new 数据类型[m][];
举例:
int[] [] arr = new arr[3][];
格式三
数据类型[][] 数组名 = {元素一,元素二..},{元素一,元素二},{...}...};
举例 : int[] [] arr = {{1,2,3},{1,2,3},{...}...};
二维数组中多个一维数组的长度可以不同(之后学习),且存储的是一维数组的地址值。
二维数组的遍历(掌握)
/*
* A:案例演示
* 需求:二维数组遍历
* 外循环控制的是二维数组的长度,其实就是一维数组的个数。
* 内循环控制的是一维数组的长度。
*/
class Test1_Array {
public static void main(String[] args) {
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
for (int i = 0;i < arr.length ;i++ ) { //获取到每个二维数组中的一维数组
for (int j = 0;j < arr[i].length ;j++ ) { //获取每个一维数组中的元素
System.out.print(arr[1][1] + " ");
}
System.out.println();
}
}
}
二维数组的求和(遍历)
/*
* A:案例演示
*
需求:公司年销售额求和
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
*/
class Test2_Array {
public static void main(String[] args) {
int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
int sum = 0; //定义变量,记录每次相加的结果
for (int i = 0;i < arr.length ;i++ ) { //获取每一个一维数组
for (int j = 0;j < arr[i].length ;j++ ) { //获取每一个一维数组中的元素
sum = sum + arr[i][j]; //累加
}
}
System.out.println(sum);
}
}
java中 参数传递问题(非常非常非常重要)
/*
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问
Java中到底是传值还是传址
1,既是传值,也是传地址,基本数据类型传递的值,引用数据类型传递的地址
2,java中只有传值,因为地址值也是值(出去面试都说这种,支持者是高司令(java之父))
*/