Java基础

123 阅读2分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。

内存解析

image.png

练习一(观察能否过编译)

声明:int[]x,y[;在给x,y变量赋值以后,以下选项允许通过编译的是:(注意:x是一维数组,y是二维数组)

a ) x[0]= y; no

b) y[0]= x; yes

c) y[0] [0]= x; no

d)x[0] [0] =y; no

e) y[0] [0] = x[0]; yes

f) x = y; no(判断赋值能否过编译:1.同类型 2.能自动类型提升)

例题二(杨辉三角赋值)
/**
 * 打印杨辉三角(10行)
 * 【提示】
 * 1.第一行有1个元素,第n行有n个元素
 * 2.每一行的第一个元素和最后一个元素都是1
 * 3.从第三行开始,对于非第一个元素和最后一个元素的元素。
 * 即:
 * yanghui[i][j]= yanghui[i-1][j-1]+ yanghui[i-1][j];
 */
public class TwoArrayText {
    public static void main(String[] args) {
        int[][] array=new int[10][];
        //赋值
        array[0]=new int[]{1,1};
        for(int i=1;i< array.length;i++){
            array[i]=new int[i+2];
            for(int j=0;j<array[i].length;j++){
                if(j==0||j==array[i].length-1)
                    array[i][j]=1;
                else
                    array[i][j]=array[i-1][j-1]+array[i-1][j];
            }
        }
        //打印
        for(int i=0;i< array.length;i++){
            for(int k=1;k<=array.length-i;k++){
                System.out.print('\t');
            }
            for(int j=0;j<array[i].length;j++){
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }
    }
}
例题三(随机数赋值,且不能重复)
/**
 * 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。
 */
public class TwoArrayText1 {
    public static void main(String[] args) {
        //我的解法
        int[] array=new int[6];
        for(int i=0;i<array.length;i++){
            array[i] = (int) (Math.random() * 30) + 1;//注意随机数本身是double型,要么强制转换,要么用double型
            for(int j=0;j<i;j++) {
                while(true){
                    if(array[i]==array[j])
                        array[i] = (int) (Math.random() * 30 + 1);//注意括号的问题,没括号,
                    													//Math.random()先运算,结果一直是0
                    else
                        break;
                }
            }
        }
        for(int k=0;k<array.length;k++){
            System.out.println(array[k]);
        }
        //老师的解法
//        int[] arr = new int[6];
//        for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
//            arr[i] = (int) (Math.random() * 30) + 1;
//
//            for (int j = 0; j < i; j++) {
//                if (arr[i] == arr[j]) {
//                    i--;
//                    break;
//                }
//            }
//        }
//
//        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);
//        }
    }
}

数组的复制、反转、查找(线性查找、二分法查找)

public class ArrayChange {
    public static void main(String[] args) {
        String[] arr = new String[]{"dd", "bb", "ss", "ff", "ee"};
        //数组的复制
        //数组的复制(区别于数组变量的赋值:arr1 =arr)
        String[] arr1 = new String[arr.length];
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = arr[i];
        }
        //数组的反转
        //方式一
        for (int i = 0; i < arr.length / 2; i++) {//一个变量
            String temp = arr[i];//temp是一个中间值
            arr[i] = arr[arr.length - i - 1];//注意别忘了减1
            arr[arr.length - i - 1] = temp;
        }
        //方式二
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {//两个变量
            String temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        //查找(搜索)
        //线性查找
        String dest = "kk";
        boolean yes = false;//没有yes找到了之后也会再输出一个没找到
        for (int i = 0; i < arr.length; i++) {
            if (dest.equals(arr[i])) {//字符串比较,不能用==,用.equals()
                System.out.println("找到了,位置为" + i);
                yes = true;
                break;
            }
        }
        if (yes == false)
            System.out.println("没找到");
        //二分法查找(前提是有序)(快速)
        int[] arr2 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
        int dest1 = -34;
        boolean isFlag=true;
        int head = 0;//初始的首索引
        int end = arr2.length - 1;//初始的末索引
        while (head <= end) {//注意终止条件
            int middle = (head + end) / 2;
            if (dest1 == arr2[middle]) {
                System.out.println("找到了指定的元素,位置为:" + middle);
                isFlag=false;
                break;
            } else if (arr2[middle] > dest1) {
                end = middle - 1;//因为等于的情况已经排除,所以middle可以排除,这里可以-1,+1
            } else { // arr2[ middle] < dest1
                head = middle + 1;
            }
        }
        if(isFlag)
            System.out.println("没找到");
    }
}

数组元素的排序算法

通常来说,排序的目的是快速查找。

衡量排序算法的优劣:

​ 1.时间复杂度:分析关键字的比较次数和记录的移动次数

​ 2.空间复杂度:分析排序算法中需要多少辅助内存

​ 3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。

分类:

内部排序:所有排序操作都在内存中完成。

外部排序:数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。

​ 外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。