复习
-
内存中的数组
堆: 所有使用new创建出来的对象都放在堆内存中 栈(方法栈): 方法是被放在栈内存中执行。在方法中定义的变量也是在栈内存中的。 堆与栈如何联系起来? int[] arr = new int[10]; arr : 栈 数组在堆内存中的首地址值 new int[10] : 堆 arr[3] = 100; arr保存的是首地址值 + 3 * 所占的空间 4个字节 为什么数组的索引是从0开始的? 为了方便计算地址。如果从1开始,则在计算时还需要再进行减1操作。因为arr里边存的是首地址值。 int byte short long - 0 char - '\u0000' char[] ch = new char[10]; - eclipse - 空格 - idea - 啥也没有 int num = ch[0];// num - 0 char ch1 = ' '; int num1 = ch1;// 32
2.数组中碰到的两个异常
ArrayIndexOutOfBoundsException - 数组索引越界异常 当使用负索引或大于等于数组长度索引时,会报错 NullPointerException - 空指针异常 当没有为数组对象进行初始化,赋值为了null。而又使用数组时报错。
题目
1.编写程序,给定一个整数,按相反顺序输出该数。例如,754321, 控制台输出为7654321。 int num = 1234567; // 程序执行后,在控制台打印出7654321 // 运算符+循环+分支 // 根据1234567对10取余 可以拿 7 // 根据1234567除以10 可以拿123456 // 直到此num为0结束 2.打印出100-999之间所有的水仙花数, 例如:153是一个"水仙花数", 因为153=1的三次方+5的三次方+3的三次方 // 153依次可以拿到 1 5 3 3.1,2,3,4四个数字,看这四个数字能组成多少个无重复数字的三位数?都是多少? // 组成三位数。每位上的数是1,2,3,4其中的任意一个 // 每位上的数不能重复 1 2 3 4 个位 1 2 3 4 十位 1 2 3 4 百位 // 两个输出结果:都是谁?一共多少个? public static void f1() { /* 1.编写程序,给定一个整数,按相反顺序输出该数。例如,754321, 控制台输出为7654321。 int num = 1234567; // 程序执行后,在控制台打印出7654321 // 运算符+循环+分支 // 根据1234567对10取余 可以拿 7 // 根据1234567除以10 可以拿123456 // 直到此num为0结束 */ int num = 1234567; while (num > 0) { int value = num % 10; System.out.print(value);// 7 6 num = num / 10;// 123456 } } public static void f2() { /* 2.打印出100-999之间所有的水仙花数, 例如:153是一个"水仙花数", 因为153=1的三次方+5的三次方+3的三次方 // 153依次可以拿到 1 5 3 */ // 1.依次拿到100-999之间的数 用循环完成 // 2.根据循环遍历的数,拿到个位、十位、百位 用三个变量来接收 // 3.求和 int count = 0; for (int i = 100; i < 1000; i++) { // 定义三个变量来接收 int a = i % 10; int b = i / 10 % 10; int c = i / 100; if (i == a * a * a + b * b * b + c * c * c) { count++; System.out.println(i + "为水仙花数"); } } System.out.println("一共有" + count + "个"); // 2.使用嵌套来完成 // 使用三层循环来表示100 - 999 之间数。 count = 0; for (int i = 1; i <= 9; i++) { for (int j = 0; j <= 9; j++) { for (int k = 0; k <= 9; k++) { int num = i * 100 + j * 10 + k; if (i * i * i + j * j * j + k * k * k == num) { System.out.println(num + "为水仙花数"); } } } } System.out.println("一共有" + count + "个"); } public static void f3() { /* 3.1,2,3,4四个数字,看这四个数字能组成多少个无重复数字的三位数?都是多少? // 组成三位数。每位上的数是1,2,3,4其中的任意一个 // 每位上的数不能重复 1 2 3 4 个位 1 2 3 4 十位 1 2 3 4 百位 // 两个输出结果:都是谁?一共多少个? */ int count = 0; // 1.使用三层循环分别代表个位、十位、百位上的数。数值分别是1,2,3,4 // 2.判断三层循环遍历的数依次不相等,则代表条件满足。计数即可 for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 4; j++) { if (i != j) { for (int k = 1; k <= 4; k++) { // i = 1 2 // j = 1 2 3 4 // k = 1 2 3 4 if (i != j && i != k && j != k) { System.out.println(i * 100 + j * 10 + k); count++; } } } } } System.out.println(count); } 4.给一个数组 int[] a = {3,4,5,6,5,5,3,1,7,9,0,4,3,2,1,2,1,2,1,1},里边放了是10以内的数字,找到里边各个数值的出现的次数。 public static void f4() { /* 4.给一个数组 int[] a = {3,4,5,6,5,5,3,1,7,9,0,4,3,2,1,2,1,2,1,1}, 里边放了是10(0-9之间的数)以内的数字,找到里边各个数值的出现的次数(统计0-9分别出现多少次)。 */ int[] a = {3, 4, 5, 6, 5, 5, 3, 1, 7, 9, 0, 4, 3, 2, 1, 2, 1, 2, 1, 1}; // 定义10个int类型的变量来分别保存出现次数 int num0 = 0; int num9 = 0; for (int i = 0; i < a.length; i++) { if (a[i] == 0) { num0++; } else if (a[i] == 9) { num9++; } } System.out.println("0出现的次数:" + num0); System.out.println("9出现的次数:" + num9); // 定义一个长度为10的数组保存出现次数。nums[0]存放0出现的次数 nums[9]保存9出现的次数 int[] nums = new int[10]; for (int i = 0; i < a.length; i++) { if (a[i] == 0) { nums[0]++; } else if (a[i] == 9) { nums[9]++; } } for (int i = 0; i < nums.length; i++) System.out.println(i + "出现了" + nums[i] + "次"); // // 定义一个长度为10的数组保存出现次数。nums[0]存放0出现的次数 nums[9]保存9出现的次数 // int[] a = {3, 4, 5, 6, 5, 5, 3, 1, 7, 9, 0, 4, 3, 2, 1, 2, 1, 2, 1, 1}; int[] nums1 = new int[10]; for (int i = 0; i < a.length; i++) { nums1[a[i]]++;// nums1[3]++ ;nums1[4]++;nums1[5]++ } for (int i = 0; i < nums1.length; i++) System.out.println(i + "出现了" + nums1[i] + "次"); } 5.现在定义如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5},要求将以上数组中值为0的去掉,将不为0的值存入一个新的数组,生成的新数组为:int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5} public static void f5() { /* 5.现在定义如下的一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}, 要求将不为0的值存入一个新的数组,新数组为:int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5} */ int[] oldArr = {1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5}; // 1. 定义新数组 新数组的长度为原数组中非0数的个数 int count = 0; for (int value : oldArr) { // 当前数不为0则统计 if (value != 0) count++; } int[] newArr = new int[count]; // 2.将原数组中的非0数放在新数组中 for (int i = 0, j = 0; i < oldArr.length; i++) { if (oldArr[i] != 0) { // 新数组的长度要比原数组的长度少,所以直接用原数组索引时,肯定会越界 newArr[j] = oldArr[i]; // 定义一个新的变量来充当新数组索引 j++; } } for (int value : newArr) { System.out.println(value); } }