【从零开始重学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 借助空间)

posted @ 2024-01-08 18:17  迷路的哨兵甲  阅读(10)  评论(0编辑  收藏  举报