Java从入门到精通05
文章目录
一、流程控制foreach(又名for强循环)
Java5之后出现了for的强循环,这种循环遍历集合和数组更加便捷,使用时无需考虑集合或者数组的长度,也无需根据索引来访问集合或数组元素,foreach会自动遍历集合或数组的每一个元素。
格式:
for(数组/集合元素类型:数组/集合对象名){
循环体//自动迭代访问每一个元素
}
注意:当想改变数组元素时,切记不要使用foreach(for强循环结构)!!!
二、深谈数组
1.内存中的数组
为啥说数组是引用变量,那是因为数组引用变量只是一个引用,他的数据存在堆区,详细请看下图。
2.数组异常情况
1.越界
简单说如定义一个长度为x的数组,它的索引最大应为x-1,所以当索引大于或等于x时,系统会报错.
public class Demo2 {
public static void main(String[] args) {
int [] arr =new int[5];
System.out.println(arr[5]);
}
}
数组值定义了五个长度,最大索引为4,所以当输出arr[5]时,系统报错
2.指针为空
public class Demo3 {
public static void main(String[] args) {
int [] arr=new int[]{2,5,8,0};
arr=null;
System.out.println(arr[0]);
}
}
当定义一个数组arr,数组变量arr被赋予null时,该数组仍然在堆区存在,只是arr在栈区的地址索引丢失,所以Java找不到原本数组元素所在位置,所以会报错。
3.所谓的多维数组
多为数组即数组的元素还是数组,本质也就是最外面的数组依然是一个以为数组。
以二维数组为例
和正常数组一样,依然存在静态初始化和动态初始化这一说法。
静态初始化
格式:
数据类型[][] 数组名=new int[][]{
元素…
}
也可以是
数据类型[][] 数组名={元素…}
动态初始化
格式:
数据类型 [][]数据名=new 数据类型[m][n]
public class Demo4 {
public static void main(String[] args) {
int [][]arr=new int[5][10];
}
}
此时分配情况如图所示
赋值
格式:
数组名[索引][索引]=数据;
取值
- 直接取值
System.out.print(数组名[索引][索引]); - 赋值取值
变量=数组名[索引][索引];
System.out.print(变量);
public class Demo4 {
public static void main(String[] args) {
int [][]arr=new int[5][10];
arr[2][8]=16;
System.out.println(arr[2][8]);
int a=arr[2][8];
System.out.println(a);
}
}
三、数组工具Arrays类
Arrays.toString(数组名)
此方法将数组转为字符串,按顺序把多个数组元素链接在一起,多个数组元素之间有",“与” "隔开。
import java.util.Arrays;
public class Demo5 {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7,8,9};
System.out.println("arr数组元素为:"+ Arrays.toString(arr));
}
}
Arrays.sort(数组名)
此方法将数组排序(从小到大)
import java.util.Arrays;
public class Demo5 {
public static void main(String[] args) {
int[] arr={82,74,31,48,52,46,78,88,19};
Arrays.sort(arr);
System.out.println("arr数组元素为:"+ Arrays.toString(arr));
}
}
Arrays.equals(数组1名,数组2名)
判断两个数组长度和元素是否相同,如果均相同则返回true
import java.util.Arrays;
public class Demo6 {
public static void main(String[] args) {
int[]arr1={1,2,3,4};
int[]arr2={1,2,3,4};
System.out.println("两数组相等:"+ Arrays.equals(arr1,arr2));
}
}
数据类型(不确定用var) 新数组名=Arrays.copyOf(被复制的数组名,新数组的长度)
新数组默认从旧数组的第一个元素开始复制,若新数组元素个数大于旧数组元素个数,则新数组超过部分均为null
import java.util.Arrays;
public class Demo7 {
public static void main(String[] args) {
int [] a={1,2,3,4,5,6};
var b= Arrays.copyOf(a,4);
var c=Arrays.copyOf(a,10);
System.out.println("a数组元素为:"+ Arrays.toString(a));
System.out.println("b数组元素为:"+ Arrays.toString(b));
System.out.println("c数组元素为:"+ Arrays.toString(c));
}
}
Arrays.fill(数组名,开始索引(包括),结束索引(不包括),新值)
将数组的第a个元素到第b个元素重新赋值
import java.util.Arrays;
public class Demo8 {
public static void main(String[] args) {
int []a={1,2,3,4,5,6,7,8,9};
//将第三个元素到第五个元素赋为新值9
Arrays.fill(a,2,5,9);
System.out.println("新的数组为:"+Arrays.toString(a));
}
}