50,503
社区成员
发帖
与我相关
我的任务
分享
1.数组中的数据叫做元素 2.每个元素都有编号,叫做索引/下标 3.下标从0开始 4.数组是引用数据类型 5.数组一旦初始化,长度不可改变(意味着数组不可以添加和删除) 6.数组在内存中开辟的空间是连续的
数据类型 数组名[]; int[] is; -- int类型的数组 String[] names; -- 字符串类型的数组
1.静态初始化:由程序员指定数据,系统自动分配空间
public class 文件名{ public static void main(String[] args){ //静态初始化1 //String[] names = new String[]{"东邪","南帝","西毒","北丐","中神通"}; //静态初始化2 - 先声明,再初始化 //String[] names; //names = new String[]{"东邪","南帝","西毒","北丐","中神通"}; //静态初始化3 - 简化静态初始化1的写法 String[] names = {"东邪","南帝","西毒","北丐","中神通"}; //设置指定下标上的元素 names[2] = "西狂"; //获取指定下标上的元素 String n = names[2]; System.out.println("获取指定下标上的元素:" + n);//西狂 //获取元素个数 int len = names.length; System.out.println("获取元素个数:" + len);//5 System.out.println("-------------------------------------"); //遍历1 - for循环 for(int i = 0;i<names.length;i++){ System.out.println(names[i]); } System.out.println("-------------------------------------"); //遍历2 - foreach/增强for循环 for(String element : names){//依次循环数组中的元素,并赋值给element System.out.println(element); } /** for vs foreach 循环中使用到下标,就使用for 循环中不使用到下标,就使用foreach */ } }
2.动态初始化:由程序员指定长度,系统自动分配初始值
整数类型:0 浮点类型:0.0 字符类型:' ' 布尔类型:false 引用类型:null - 空
public class 文件名{ public static void main(String[] args){ //动态初始化1 //String[] names = new String[5]; //5表示连续开辟几个空间 - {null,null,null,null,null} //动态初始化2 - 先声明,再此初始化 String[] names; names = new String[5]; //5表示连续开辟几个空间 - {null,null,null,null,null} //设置指定下标上的元素 names[0] = "aaa"; names[1] = "bbb"; names[2] = "黄蓉"; names[3] = "ccc"; names[4] = "ddd"; //ArrayIndexOutOfBoundsException - 数组下标越界异常 //names[5] = "eee"; //获取指定下标上的元素 String n = names[2]; System.out.println("获取指定下标上的元素:" + n);//黄蓉 //获取元素个数 int len = names.length; System.out.println("获取元素个数:" + len);//5 System.out.println("-------------------------------------"); //遍历1 - for循环 for(int i = 0;i<names.length;i++){ System.out.println(names[i]); } } }
3.静态初始化 vs 动态初始化
静态初始化:一开始就知道数据 动态初始化:一开始只知道长度
需求:声明5个长度的int数组,元素由用户输入,计算出最大值
import java.util.Scanner; public class 文件名{ public static void main(String[] args){ int [] is = new int[5]; Scanner scan = new Scanner(System.in); for(int i = 0;i<is.length;i++){ System.out.println("请输入第" + (i+1) + "个数字"); is[i] = scan.nextInt(); } int max = is[0]; for(int i = 1;i<is.length;i++){ if(max < is[i]){ max = is[i]; } } System.out.println("最大值为:" + max); } }
口诀: N个数字来排序 两两相比小靠前 外层循环N-1 内层循环N-1-i
public class 文件名{ public static void main(String[] args){ int [] is = {35,81,18,25,9}; for(int i = 0;i<is.length-1;i++){ for(int j = 0;j<is.length-1-i;j++){ if(is[j] >is[j+1]){ int temp = is[j]; is[j] = is[j+1]; is[j+1] = temp; } } } for(int num : is){ System.out.println(num); } } }
思路:从头到尾遍历 缺点:慢
public class 文件名{ public static void main(String[] args){ int[] is = {35,81,18,25,9}; int num = 81; for(int i = 0;i<is.length;i++){ if(num == is[i]){ System.out.println("找到元素了"); } } } }
思路:先排序,在二分
import java.util.Arrays; public class 文件名{ public static void main(String[] args){ int [] is = {35,81,18,25,9}; //排序 -- 9,18,25,35,81 Arrays.sort(is); int num = 81; int start = 0; int end = is.length-1; while(start <= end){ //求中间值 int mid = (start + end)/2; if(num > is[mid]){//说明要查找的值在中间值的右边 start = mid+1; }else if(num <is[mid]){//说明要查找的值在中间值的左边 end = mid-1; }else{//找到了 System.out.println("找到了"); break; } } } }
缺点:修改原数组,会影响到新数组
public class 文件名{ public static void main(String[] args){ //原数组 String[] names = {"哆哆","咪咪","发发","嘻嘻"}; //新数组 String[] newNames = names; //修改原数组中的数据 names[2] = "啦啦"; //遍历新数组 for(String element : newNames){ System.out.println(element); } } }
public class 文件名{ public static void main(String[] args){ //原数组 String[] names = {"哆哆","咪咪","发发","嘻嘻"}; //新数组 String[] newNames = new String[names.length]; //遍历原数组,将原数组中的元素复制到新数组中 for(int i = 0;i<names.length;i++){ newNames[i] = names[i]; } //修改原数组中的数据 names[2] = "啦啦"; //遍历新数组 for(String element : newNames){ System.out.println(element); //遍历原数组 for(String element : names){ System.out.println(element); } } }