【从零开始重学Java】第4天 数组、向量和字符串
传送门
从零开始重学Java 第0天
从零开始重学Java 第1天 Java概述
从零开始重学Java 第2天 标识符和数据类型
从零开始重学Java 第3天 表达式和流程控制语句
从零开始重学Java 第4天 数组、向量和字符串
从零开始重学Java 第5天 对象和类
从零开始重学Java 第6天 异常
从零开始重学Java 第7天 高级特性
从零开始重学Java 第8_9_10天 图形界面、Swing、Applet
从零开始重学Java 第11天 数据流
从零开始重学Java 第12天 线程
从零开始重学Java 第13天 线程
数组、向量和字符串
数组
数组说明
创建数组
- 要么指定数组长度,要么直接指定好每个元素内容
- 多维数组的长度指定第一个就行了
- 只指定长度不指定元素,元素会都给默认值
数组边界
数组元素的引用
多维数组
都已经快忘记了这么个东西了,日常使用也是Collection套Collection,数组容易出错
int[][] arr = new int[3][];
arr[0] = new int[]{1, 2};
arr[1] = new int[]{2, 3};
arr[2] = new int[]{2, 3, 4};
System.out.println(arr.length + " arr.length ");
for (int[] ints : arr) {
System.out.print(ints.length + " length ");
System.out.println(Arrays.toString(ints));
}
// 3 arr.length
// 2 length [1, 2]
// 2 length [2, 3]
// 3 length [2, 3, 4]
int[][] arr = {{1,2},{2,3},{3,4,5}};
System.out.println(arr.length + " arr.length ");
for (int[] ints : arr) {
System.out.print(ints.length + " length ");
System.out.println(Arrays.toString(ints));
}
// 3 arr.length
// 2 length [1, 2]
// 2 length [2, 3]
// 3 length [3, 4, 5]
int[][][] arr = new int[3][][];
arr[0] = new int[][]{{1, 2}, {2, 3}};
arr[1] = new int[][]{{2}, {3, 4}, {4, 5}};
arr[2] = new int[][]{{8, 9, 10}};
System.out.println(arr.length + " arr.length ");
for (int[][] ints : arr) {
System.out.print(ints.length + " ints.length ");
for (int[] anInt : ints) {
System.out.print(anInt.length + " anInt.length ");
System.out.print(Arrays.toString(anInt));
System.out.print(" ");
}
System.out.println();
}
// 3 arr.length
// 2 ints.length 2 anInt.length [1, 2] 2 anInt.length [2, 3]
// 3 ints.length 1 anInt.length [2] 2 anInt.length [3, 4] 2 anInt.length [4, 5]
// 1 ints.length 3 anInt.length [8, 9, 10]
数组复制
- System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
这是一个native方法,JNI调用系统C语言写的程序实现的,为了提高效率
如果是Collection的复制,直接构造方法就能复制(也是调用的System.arraycopy),例如new ArrayList(Collection<? extends E> c)
Vector类
个人认为已经被废弃的东西(诞生于JDK1.0),有ArrayList(JDK1.2)、CopyOnWriteArrayList(JDK 1.5)作为替代品
只能尾部插入或删除,强制要求连续的内存空间,完全不如常用的两个List灵活
概述
Vector类的构造方法
Vector类对象的操作
Vector类中的其他方法
Vector类的使用举例
字符串类型
String StringBuffer StringBuilder 字符串相关真是Java最基础的东西了
字符串简述
字符串说明及初始化
字符串处理
几个特殊处理
第四章习题
- Java如何完成数组边界检查
arrays.length
- 数组创建的过程,如何创建一个对象数组
- 数组的内存分配如何完成的
虚拟机自动完成,只声明没有实例化的时候栈里只有一个引用变量,不分配内存空间,实例化后堆分配内存,初始化数组元素
- 数组定义相关问题,生成5个空字符串的数组
//多写个逗号没问题的
String[] arr = {"","","","","",};
- 选择一组等长的英文单词,例如,一组4个字母组成的单词:
work back come deal desk book java tool face
一组5个字母组成的单词: watch match noise risky stock
试定义一个字符串数组,数组中每个元素储存一个英文单词,元素个数根据选择的英语单词长度而定。再按照电话机表盘定义数字与字母的对应关系,如数字2对应a或b或c,数字5对应j或k或l,现编制一个程序,要求将用户输入的数字转换成相应的字符串(注意一个数字对应多个字符串),将这些字符串与数组中储存的英文单词逐个比较,如果某一个字符串与英文单词匹配成功,则在屏幕上输出数字和字符串及对应的单词;如果都不匹配,则在屏幕上输出一条信息“没有匹配的单词”。
善用stream来提高可读性
这段代码是在JDK17写的,JDK8 Map.of Set.of Set.copyOf是会报错的
public static void judgeNumberPhoneStr(String str){
Set<String> set = Set.of("work","back","come","deal","desk","book",
"java","tool","face","watch","match","noise","risky","stock");
Map<Integer,String> numberStringMap = Map.of(
2,"abc",3,"def",
4,"ghi",5,"jkl",6,"mno",
7,"pqrs",8,"tuv",9,"wxyz");
Set<String> resultSet = Set.copyOf(set);
try {
Integer.parseInt(str);
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int anInt = Integer.parseInt(String.valueOf(c));
String phoneString = numberStringMap.get(anInt);
if (phoneString == null){
throw new RuntimeException(anInt + " 数字不是键盘上有字母的内容");
}
int finalI = i;
resultSet = resultSet.stream().filter(e -> {
for (char phoneChar : phoneString.toCharArray()) {
if (e.charAt(finalI) == phoneChar){
return true;
}
}
return false;
}).collect(Collectors.toSet());
if (resultSet.isEmpty()){
throw new RuntimeException(str + " 没有匹配的单词");
}
}
System.out.println(str + "匹配到了" + resultSet);
}catch (NumberFormatException e){
System.out.println(str + " 不是纯数字");
}catch (Exception e){
System.out.println(e.getMessage());
}
}
// 9675
// 9675匹配到了[work]
// 967
// 967匹配到了[work]
// 9
// 9匹配到了[watch, work]
// 23
// 23 没有匹配的单词
// 22
// 22匹配到了[back]
// 2
// 2匹配到了[book, back, come]
// 4
// 4 没有匹配的单词
// 6
// 6匹配到了[noise, match]
// 11
// 1 数字不是键盘上有字母的内容
// aa
// aa 不是纯数字
- 数组的排序
平时用Arrays.sort或者Collections.sort就OK了,是改进过的快速排序算法
常见的排序算法参考菜鸟教程十大排序算法
//最简单的还是冒泡排序 只需要注意i 和j 的判断条件就可以了
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
- 数组的插入,删除,查找
插入删除简单,查找有序就用二分查找,无序就线性查找(遍历一遍)或者哈希查找(HashMap 借助空间)