引用数据类型: 数组 类 接口
概念:数组就是存放一堆数据的容器
数组的定义格式:
数组的定义格式:
方式1) 数据类型[] 数组名称 ; (推荐)
举例:
int[] arr ; 定义了一个int类型的数组arr变量
方式2) 数据类型 数组名称[] ;
举例
int arr[] ; 定义了一个int类型的arr数组变量;
动态初始化:
int[] arr = new int[5];
静态初始化:
int[] arr = {1,2,3,4,5};
int[] arr = new int[]{1,2,3,4,5};
注意:
不能动静初始化(要么动态初始化,要么静态初始化!)
int[] arr = new int[3]{1,2,3,4}; 错误
数组常见注意事项:
在数组注意问题:
1)数组角标越界异常:ArrayIndexOutOfBoundsException
出现的原因:访问了数组中不存在的索引值,索引值是非法!(大于或者等于数组长度,索引值为负)
解决方案:及时检查错误,然后更新代码!
数组是引用类型,引用类型的默认值是null(空对象),
2)空指针异常:NullPointerException
出现的原因:
1)在数组中的,数组对象已经为null,还要访问里面的元素
2)在后期可能会使用某些类的功能的时候,但是这个类的对象已经为null了
解决方案:(在idea中,使用断点来调试程序!debug)
在某段代码中,如果出现空指针,在使用该对象的时候,进行非空判断!
数组的逆序:
元素逆序
需求:
已知数组,静态初始化,将元素逆序!
举例:
int[] arr = {14,69,24,78,52} ;
分析:
1)已知数组,静态初始化
2)
需要将arr[0]和arr[arr.length-1] 对应的元素进行互换
arr[1]和arr[arr.length-1-1] 对应的元素进行互换...
...
...
保证数的长度arr.length/2(若数组元素个数为奇数,中间的不变;为偶数,则能被2除尽,则全部交换)
class Demo{
public static void main(String[] args){
int[] arr = {14,69,24,78,52} ;
}
//定义一个方法,对于数组进行逆序,没有返回值类型
public static void reverse(int[] arr){
for(int i = 0 ; i < arr.length / 2; i++ ){
int temp = arr[i];
arr[i] = arr[arr.length - 1 -i];
arr[arr.length - 1 -i] = temp;
}
}
// 打印输出函数
public static void printArr(int[] arr){
System.out.print("[");
for(int i = 0 ; i < arr.length ; i++ ){
if(i == arr.length - 1){
System.out.println(arr[i]+"]");
break;
}
System.out.print(arr[i]+", ");
}
}
}
冒泡排序:
需求:键盘录入5个数据,放在数组中,然后使用冒泡排序将数组排序并遍历!
分析:
将每一个元素都与其他元素比较,将最大值放再最大索引处;
依次这样比较.....
最终比较次数 数组长度-1 , arr.length-1
//导入Scanner包
import java.util.Scanner;
class Demo2{
public static void main(String[] args){
//创建文本扫描器对象
Scanner sc = new Scanner(System.in);
//提示并录入
System.out.println("请输入第一个数据:");
int a = sc.nextInt();
System.out.println("请输入第二个数据:");
int b = sc.nextInt();
System.out.println("请输入第三个数据:");
int c = sc.nextInt();
System.out.println("请输入第四个数据:");
int d = sc.nextInt();
System.out.println("请输入第五个数据:");
int e = sc.nextInt();
//创建一个arr数组,将输入的五个数值赋予给数组的元素
int[] arr = {a,b,c,d,e};
//打印原数组
printArr(arr);
//冒泡排序
bubbling(arr);
//打印冒泡后的新数组
printArr(arr);
}
//冒泡排序
public static void bubbling(int[] arr){
//总共要进行数组的长度-1次排序
for(int i = 0 ; i < arr.length - 1;i++){
//将第一个最大元素给到最大索引处的时候,下次排序遍历的次数要-1,所以 j < arr.length -1 -i
for(int j= 0 ; j < arr.length -1 -i;j++){
if(arr[j] > arr[j+1]){
//使用中间变量,将大小元素进行互换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//打印
public static void printArr(int[] arr){
System.out.print("[");
for(int i= 0; i< arr.length;i++){
if(i == arr.length-1){
System.out.println(arr[i]+"]");
break;
}
System.out.print(arr[i]+", ");
}
}
}
数组的最值:
给定一组数组,求出他元素的最大值
class Test{
public static void main(String[] args){
//给定一组数组并进行静态初始化
int[] arr = {23,54,67,34,22,98};
max(max);
}
//写一个方法,求出数组的最大值
public static int max(int[] arr){
//利用假设法,假设下arr[0]就是最大值,依次和其他元素进行比较;
int max = arr[0];
for(int i = 1; i < arr.length; i++ ){
if(max < arr[i]){
max = arr[i];
}
}
return max;
}
}
形式参数传递之数组:
方法的形式参数传递:
1)基本数据类型作为参数传递:四类八种
形式参数的改变不影响实际参数!
2)引用类型作为参数传递:数组,类,接口
形式参数改变会直接影响实际参数(String除外,它作为参数传递和基本类型作为参数传递效果一致!)
String特点:字符串是常量
class Test{
public static void main(String[] args){
int a = 10;
int b = 20;
System.out.println(a+b);
change(a,b);
System.out.println(a+b);
-------------------------------------------------------------
//创建一个数组,静态初始化
int[] arr = {1,2,3,4,5} ;
(遍历完后是1 2 3 4 5 )
change(arr);
这次遍历完后是1 4 3 8 5
}
//改变a和b的值
public static void change(int a,int b){
a = b ; // a = 20
b = a + b ; // b = 20 + 20 = 40
System.out.println("a:"+a+",b:"+b) ;//20,40
}
//重载的change方法
public static void change(int[] arr){
//遍历数组
for(int x = 0 ; x < arr.length ; x ++){
if(arr[x] % 2 ==0){
arr[x] *= 2 ;
}
}
}
}
输出结果是:
a:10,b:20
a:10,b:20
a:20,b:40
a:10,b:20(不会改变值的)
-------------------------------------
1 4 3 8 5