1.数组
1.1.数组的定义
数组就是一个存放【相同数据类型】的【有序】集合(容器)。
1.2.数组的声明
语法1: 数据类型[] 变量名;
int[] arr1;
String[] arr2;
语法2:数据类型 变量名[];
int arr1[];
String arr2[];
注意事项:
a)建议声明数组的时候,采用第一种声明数组的方式。
b)“数据类型[]”代表的就是数组类型,例如:int[]代表int类型的数组。
c)为什么声明数组的时候需要“数据类型”???使用“数据类型”声明数组,代表数组中每个元素都是该数据类型
int[] arr1; ---> 数组中每个元素都是int类型
1.3.数组的创建
强调:数据属于引用数据类型。
方式一:动态创建数组,也就是使用new关键字来创建数组
语法: 数据类型[] 变量名 = new 数据类型[数组长度];
int[] arr = new int[5];
方式二:静态创建数组
语法1:数据类型[] 变量名 = {数据1, 数据2, 数据3, ...};
String[] arr = {"aa", "bb", "cc", "dd"};
语法2:数据类型[] 变量名 = new 数据类型[]{数据1, 数据2, 数据3, ...};
String[] arr = new String[]{"aa", "bb", "cc", "dd"};
理解:不但要创建一个指定空间大小的数组,而且在创建数组的同时还完成了数组的每个元素赋值操作
注意事项:
a)“静态创建数组”的方式无需设置数组的空间长度,因为“静态创建数组”的方式数组的空间长度由设置的元素个数决定。
b)直接使用“{}”创建数组的方式(静态创建数组方式一)不能直接作为方法的实参和返回值!
因为:编译器不认识{}创建的数组。
补充:创建数组,本质上就是在内存中开辟内存空间,准备用来存储数组元素。
1.4.数组的简单操作
核心:通过数组名找到数组在内存中的存储空间,然后通过“索引值”找到数组中某一个格子,然后再操作格子中的元素。
语法:数组名[索引值]
1.5.数组的相关注意事项
a)操作数组的时候,索引不能越界,否则抛出“java.lang.ArrayIndexOutOfBoundsException”
索引合法区间:[0, 数组长度-1]
b)数组存储的元素的数据类型必须和声明数组的数据类型保持一致。
int[] arr = new int[5];
arr[0] = "11"; // 错误
arr[1] = 22; // 正确
c)创建数组的时候必须明确数组的空间长度,数组一旦创建成功,那么数组的空间长度也不能改变了!
补充:属于数组数据类型的核心特点。
d)声明数组的数据类型可以是任意数据类型,可以是基本数据类型,也可以是引用数据类型
int[] arr1 = new int[5];
String[] arr2 = new String[10];
1.6.数组元素的默认值
重点强调“动态创建数组”这种方式的每个元素默认值。
整数(byte、short、int和long)类型的数组的默认值为为0;
小数(float和double)类型的数组的人默认值为0.0;
boolean类型数组的默认值为false ;
char类型数组的默认值为“u0000”,就是一个空格;
引用数据类型数组的默认值为null,null是空对象的意思。
强调:以上默认值必须记住,后面面向对象还会用!!!
1.7.数组常见属性
length属性,用于获取数组的空间长度值。
1.8.使用普通for循环遍历数组
技能:循环 + length属性
1.9.for-each循环
可以遍历数组中的元素,还可以遍历集合中的元素(集合后面学习)。
语法: for(数据类型 变量名 : 数组|集合) {
// 循环体
}
优势:语法简洁,并且效率较高。
劣势:循环过程中无法获取数组的索引值,索引在循环体中不能修改元素的值。
建议:如果只需要遍历数组中元素,那么建议使用for-each循环
如果不但要获取数组中的元素,还要修改数组中的元素值,那么建议使用普通for循环。
1.10.JVM中的堆和栈(重点)
2.随堂练习及内存分析
a)获取10个学生的成绩,然后保存在数组中,最后计算学生的总分和平均分。
3.目前已经接触到的异常???
java.lang.NullPointerException ---> 空指针异常
原因:对一个空对象进行操作,就会抛出空指针异常
java.lang.ArrayIndexOutOfBoundsException ---> 数组索引越界异常
原因:操作数组的索引越界,索引合法区间:[0, 数组长度-1]
java.lang.ArithmeticException --> 算数异常
原因:分母为0。
以上三个异常都属于运行时(在虚拟机执行代码)的时候抛出的错误(异常),编译的时候没有任何问题。
4.数据结构
4.1数据结构和算法
数据结构:数组、链表、图、栈、队列、哈希表、二叉树
4.2.数组的数据结构
核心特点:
a)数组是一块连续的内存空间
b)数组一旦创建成功,空间长度就不能改变了
数组的优势和劣势
优势:通过索引来查找速度非常非常快!
劣势:插入和删除效率低下
需要自己手动实现数组扩容操作。
5.关于static修饰方法的调用
本类中:直接使用“方法名()”调用即可。
在别的类中:通过“类名.方法名()”来调用
6.java提供的数组工具类
java.util.Arrays,使用Arrays工具类的时候需要导包。
7.Arrays工具类中常见的方法
public static String toString(int[] a)
--> 输出数组中的元素,也就是把数组中的元素转化为字符串输出。
public static void sort(int[] a)
--> 对数组中的元素进行排序(默认为升序)
public static int binarySearch(int[] a, int key)
--> 对数组执行二分查找。如果查找失败,那么返回一个负数。
public static int[] copyOf(int[] original, int newLength)
--> 从被拷贝的数组的第一个元素开始拷贝
original:被拷贝的数组。newLength:拷贝数组的长度
返回:返回拷贝完成的新数组。
public static int[] copyOfRange(int[] original, int from, int to)
--> 拷贝指定范围元素的数组
original:被拷贝的数组。from:从哪个位置开始拷贝(包含)。to:拷贝到那个位置结束(不包含)
System.arraycopy(src, srcPos, dest, destPos, length)
--> 拷贝数组
src:源数组,需要被拷贝的数组。 srcPos:从源数组哪个位置开始拷贝。dest:目标数组,拷贝之后的数组。 destPos:把元素拷贝到目标数组的哪个位置开始。 length:需要拷贝的长度
public static void fill(int[] a, int val)
--> 数组元素填充
public static boolean equals(int[] a, int[] a2)
--> 判断两个数组的内容是否相同
如果相同则返回true,如果不相同则返回false
8.main方法的形参(了解)
8.1执行程序的时候,如何给main方法传递实参???
方式一:通过DOS命名传递实参
java MainArgsTest abc 111 ddd
方式二:通过Eclipse来传递实参
鼠标右键 --> Run As --> java config... --> arguments --> 填写参数
8.2给main方法传递实参的作用???
需求:实现两个文件的拷贝操作。
解决:需要两个文件的路径,其中一个就是需要拷贝文件的路径,另外一个就是文件拷贝到哪里去的路径。
怎么得到两个文件的地址???可以通过给main方法传递实参。
8.3main方法的注意事项
作用:是程序的入口,写法固定,能被虚拟机识别并执行。
现实开发中,我们能够手动的去调用main方法吗??? 不能。
9.可变参数
需求1:实现两个整数的加法运算
需求2:实现三个整数的加法运算
需求3:实现多个整数的加法运算,至少有两个以上的整数参与
解决1:方法的参数中包含一个int类型的数组。
虽然能解决问题,但是还是有缺陷。
解决2:使用可变参数来实现。
1.方法的可变参数语法
方法的声明:public static int add(int a, int b, int ... arr) {}
方法的调用: add(1, 2, 3, 4, 5, 6, 7);
2.可变参数的注意点
a)在方法体中,可变参数可以当成数组的方式来操作。
b)调用可变参数方法的时候,传递的实参可以是任意多个,只需要实参和可变参数的类型匹配即可。
c)在一个方法中,最多只能有一个可变参数(0, 1),并且可变参数必须放在形参列表的末尾。
d)public static int add(int a, int b, int[] arr) {}
public static int add(int a, int b, int ... arr) {} 不构成方法重载!
10.二维数组
10.1什么是二维数组??
二维数组中的每个元素又是一个一维数组 。
{1, 2, 3} --> 一维数组
{{1, 2, 3}, {3, 4, 5}, {6, 7, 8}} --> 二维数组
10.2.二维数组的声明
方式一:数据类型[][] 变量名;
int[][] arr1;
String[][] arr2;
方式二:数据类型[] 变量名[];
int[] arr1[];
String[] arr2[];
建议:声明二维数组的时候,建议使用第一个方式来声明。
10.3.二维数组的创建
方式一:创建等长的二维数组,二维数组中的每一个元素(一维数组)元素个数一样多。
语法:数据类型[][] 变量名 = new 数据类型[m][n];
m:代表二维数组的长度,也就是指的二维数组中包含了多少个一维数组
n:代表二维数组中的每个元素(一维数组)的元素个数,也就是代表一维数组的长度。
方式二:创建不等长的二维数组, 二维数组中的每一个元素(一维数组)元素个数可以不一样
语法:数据类型[][] 变量名 = new 数据类型[m][];
m:代表二维数组的长度,也就是指的二维数组中包含了多少个一维数组
什么时候决定元素(一维数组)的空间长度???赋值的时候来决定
方式三:静态二维数组
语法1:数据类型[][] 变量名 = new 数据类型[][]{{数据01, 数据02, 数据03, ...}, {数据11, 数据12, 数据13,}, ...};
语法2:数据类型[][] 变量名 = {{数据01, 数据02, 数据03, ...}, {数据11, 数据12, 数据13,}, ...};