Calender的月份是从0开始的,但日期和年份是从1开始的
示例代码:
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c1 = Calendar.getInstance(); c1.set(2017, 1, 1); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); c1.set(2017, 1, 0); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); } }
运行结果:
2017-1-1 2017-0-31
可见,将日期设为0以后,月份变成了上个月,但月份可以为0
把月份改为2试试:
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c1 = Calendar.getInstance(); c1.set(2017, 2, 1); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); c1.set(2017, 2, 0); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); } }
2017-2-1 2017-1-28
可以看到上个月的最后一天是28号,所以Calendar.MONTH为1的时候是2月
既然日期设为0表示上个月的最后一天,那是不是可以设为负数呢?
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c1 = Calendar.getInstance(); c1.set(2017, 2, 1); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); c1.set(2017, 2, -10); System.out.println(c1.get(Calendar.YEAR) +"-"+c1.get(Calendar.MONTH) +"-"+c1.get(Calendar.DATE)); } }
2017-2-1 2017-1-18
果然可以,所以日期才可以自由加减。
月份也可以是负数,规则与日期一样,就不上代码了。
实测将年份设为非正数时,会自动变为绝对值+1,不知其意义。
数组这里有一个问题容易搞不清楚的。
在 java 中,关于数组描述正确的是( B,D )
比如说一个 int 类型的数组:
int[] arr = { 'a', 25, 45, 78, 'z' }; System.out.println(Arrays.toString(arr));
输出结果是:[97, 25, 45, 78, 122]
存放进去的 char 类型的字符会自动转为 int 类型的 ASCII 码。
上面的代码中就将 a 转成了 97,z 转成了 122。
所以数组只能存放同一类型的数据是正确的。
D选项。
数组的长度固定时,为了防止下标越界,应该在索引的时候将下标减一。
int[] arr = { 'a', 25, 45, 78, 'z' }; int arrs = arr[5]; System.out.println(Arrays.toString(arr)); System.out.println(arrs);
上面的代码中数组总长度为 5,因为数组是索引是从 0 开始取值,索引取值为5的时候就会产生下标越界异常,在这里最大的索引应当为 4。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
数组实现的一个小游戏
程序随机产生5个按一定顺序排列的字符,作为猜测结果。
玩家可以猜测多次,每猜一次,若猜测的完全正确则游戏结束,并计算玩家的游戏得分并输出。若没有猜对,则提示猜测结果,如猜对了几个字符,以及猜对了几个字符的位置信息,并提示玩家游戏继续。若中途输入EXIT,则游戏提前结束
import java.util.Scanner; //猜字符小游戏 public class Guessing { private static Scanner scan; // 主方法 public static void main(String[] args) { scan = new Scanner(System.in); char[] chs = generate(); System.out.println(chs); int count = 0; // 猜错的次数 while (true) { // 自造死循环 System.out.println("猜吧!"); String str = scan.next().toUpperCase(); // 获取用户输入的字符串 if (str.equals("EXIT")) { // 判断字符串内容相等 System.out.println("下次再来吧!"); break; } char[] input = str.toCharArray(); // 将字符串转换为字符数组 int[] result = check(chs, input); if (result[0] == chs.length) { // 对 int score = 100 * chs.length - 10 * count; System.out.println("恭喜你,猜对了!得分为:" + score); break; } else { count++; System.out.println("字符对个数为:" + result[1] + ",位置对个数为:" + result[0]); } } } // 生成随机字符数组chs public static char[] generate() { char[] chs = new char[5]; char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * letters.length); } while (flags[index] == true); chs[i] = letters[index]; flags[index] = true; } // i=0 index=0 chs[0]='A' flags[0]=true // i=1 index=25 chs[1]='Z' flags[25]=true // i=2 index=0/25/0/25/1 chs[2]='B' flags[1]=true return chs; } // 对比:随机字符数组chs与用户输入的字符数组input public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; // (0,0) for (int i = 0; i < chs.length; i++) { for (int j = 0; j < input.length; j++) { if (chs[i] == input[j]) { result[1]++; if (i == j) { result[0]++; } break; } } } return result; } }
数组容量如果不够用可以使用 Arrays.copyOf() 进行扩容:
Array.copy(E[] e,newLength);
其第一个形参指的是需要扩容的数组,后面是扩容后的大小,其内部实现其实是使用了 System.arrayCopy(); 在内部重新创建一个长度为 newLength 类型是 E 的数组。
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] a= {10,20,30,40,50}; a= Arrays.copyOf(a,a.length+1); for(int i=0;i<a.length;i++) { System.out.println(a[i]); } } }
默认补 0,输出结果为: 10 20 30 40 50 0
java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。具有以下功能:
import java.util.Arrays; public class TestArrays { public static void output(int[] array) { if (array != null) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } } System.out.println(); } public static void main(String[] args) { int[] array = new int[5]; // 填充数组 Arrays.fill(array, 5); System.out.println("填充数组:Arrays.fill(array, 5):"); TestArrays.output(array); // 将数组的第2和第3个元素赋值为8 Arrays.fill(array, 2, 4, 8); System.out.println("将数组的第2和第3个元素赋值为8:Arrays.fill(array, 2, 4, 8):"); TestArrays.output(array); int[] array1 = { 7, 8, 3, 2, 12, 6, 3, 5, 4 }; // 对数组的第2个到第6个进行排序进行排序 Arrays.sort(array1, 2, 7); System.out.println("对数组的第2个到第6个元素进行排序进行排序:Arrays.sort(array,2,7):"); TestArrays.output(array1); // 对整个数组进行排序 Arrays.sort(array1); System.out.println("对整个数组进行排序:Arrays.sort(array1):"); TestArrays.output(array1); // 比较数组元素是否相等 System.out.println("比较数组元素是否相等:Arrays.equals(array, array1):" + "\n" + Arrays.equals(array, array1)); int[] array2 = array1.clone(); System.out.println("克隆后数组元素是否相等:Arrays.equals(array1, array2):" + "\n" + Arrays.equals(array1, array2)); // 使用二分搜索算法查找指定元素所在的下标(必须是排序好的,否则结果不正确) Arrays.sort(array1); System.out.println("元素3在array1中的位置:Arrays.binarySearch(array1, 3):" + "\n" + Arrays.binarySearch(array1, 3)); // 如果不存在就返回负数 System.out.println("元素9在array1中的位置:Arrays.binarySearch(array1, 9):" + "\n" + Arrays.binarySearch(array1, 9)); } }
输出结果:
填充数组:Arrays.fill(array, 5): 5 5 5 5 5 将数组的第2和第3个元素赋值为8:Arrays.fill(array, 2, 4, 8): 5 5 8 8 5 对数组的第2个到第6个元素进行排序进行排序:Arrays.sort(array,2,7): 7 8 2 3 3 6 12 5 4 对整个数组进行排序:Arrays.sort(array1): 2 3 3 4 5 6 7 8 12 比较数组元素是否相等:Arrays.equals(array, array1): false 克隆后数组元素是否相等:Arrays.equals(array1, array2): true 元素3在array1中的位置:Arrays.binarySearch(array1, 3): 1 元素9在array1中的位置:Arrays.binarySearch(array1, 9): -9
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
1351Java 日期时间
Calender的月份是从0开始的,但日期和年份是从1开始的
示例代码:
运行结果:
可见,将日期设为0以后,月份变成了上个月,但月份可以为0
把月份改为2试试:
运行结果:
可以看到上个月的最后一天是28号,所以Calendar.MONTH为1的时候是2月
既然日期设为0表示上个月的最后一天,那是不是可以设为负数呢?
运行结果:
果然可以,所以日期才可以自由加减。
月份也可以是负数,规则与日期一样,就不上代码了。
实测将年份设为非正数时,会自动变为绝对值+1,不知其意义。
1350Java 数组
数组这里有一个问题容易搞不清楚的。
在 java 中,关于数组描述正确的是( B,D )
比如说一个 int 类型的数组:
输出结果是:[97, 25, 45, 78, 122]
存放进去的 char 类型的字符会自动转为 int 类型的 ASCII 码。
上面的代码中就将 a 转成了 97,z 转成了 122。
所以数组只能存放同一类型的数据是正确的。
D选项。
数组的长度固定时,为了防止下标越界,应该在索引的时候将下标减一。
上面的代码中数组总长度为 5,因为数组是索引是从 0 开始取值,索引取值为5的时候就会产生下标越界异常,在这里最大的索引应当为 4。
1349Java 数组
数组实现的一个小游戏
程序随机产生5个按一定顺序排列的字符,作为猜测结果。
玩家可以猜测多次,每猜一次,若猜测的完全正确则游戏结束,并计算玩家的游戏得分并输出。若没有猜对,则提示猜测结果,如猜对了几个字符,以及猜对了几个字符的位置信息,并提示玩家游戏继续。若中途输入EXIT,则游戏提前结束
1348Java 数组
数组容量如果不够用可以使用 Arrays.copyOf() 进行扩容:
其第一个形参指的是需要扩容的数组,后面是扩容后的大小,其内部实现其实是使用了 System.arrayCopy(); 在内部重新创建一个长度为 newLength 类型是 E 的数组。
默认补 0,输出结果为: 10 20 30 40 50 0
1347Java 数组
java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。具有以下功能:
输出结果: