java学习笔记1

0、编程思想—我亦无他,惟手熟尔

1.化繁为简

拆解步骤,循序渐进

例题:空心金字塔 && 空心菱形
1.打印一个矩形

       for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
*****
*****
*****
*****
*****

2.打印半个金字塔

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
*
**
***
****
*****

3.打印整个金字塔

        /* n是金字塔总层数
        层数   *数(2i-1)  空格数(n-i)
        * 1     1               4
        * 2     3               3
        * 3     5               2
        * 4     7               1
        * 5     9               0
        * */
        System.out.println("请输入金字塔高度:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                    System.out.print("*");
            }
            System.out.println();
        }
    *
   ***
  *****
 *******
*********

2.先死后活

先写死,再换成变量

4.打印空心金字塔

// 通过观察可以发现除最后一行外,其余各行只有第一个和最后一个"*"存在,其余"*"均有" "代替
        System.out.println("请输入金字塔高度:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                if (j == 1 || j == 2 * i - 1 || i == n)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }
    *
   * *
  *   *
 *     *
*********

5.打印空心菱形

//上下两个空心金字塔即可组成一个空心菱形
        System.out.println("请输入高度:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 上金字塔
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                if (j == 1 || j == 2 * i - 1)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }
        // 下金字塔
        for (int i = n-1; i >= 1; i--) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                if (j == 1 || j == 2 * i - 1)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }

一、java语言概述

完整笔记

1. java执行流程:

  • 编写:源文件(.java);
  • 编译:通过javac.exe命令将源文件编译成字节码(.class)文件;
  • 运行:通过java.exe命令解释运行.class文件。
    在这里插入图片描述

2.环境变量的作用

当我们在cmd命令行中执行一条命令时,经常会出现"xxx不是内部或外部命令,也不是可运行的程序或批处理文件。"此类提示。造成这种现象的原因是我们并没有在对应的目录下执行此命令,所以系统找不到此命令。但当我们配置环境变量之后,无论在哪个目录下,都可以执行此命令。
配置环境变量后,如果在当前目录下找不到此命令,则会去环境变量所配置的路径下寻找。

3.跨平台性

java源文件只需要编译一次,就可以在多个系统环境下运行(一次编译,到处运行)。
原理:java程序是通过jvm在系统平台上运行,在系统上安装相应的jvm,就可以运行编译好的字节码文件。

3.总结

 -        * 1.System.out.println换行
         * 2.System.out.print 不换行
         * 3.main就是一个静态方法,可以通过对象或类名调用,一般推荐使用类名调用,因为静态方法是属于类的,被本类中所有对象共享。
         * 4. 每个.java源文件中只能有一个public(可以没有),且此类与文件名相同.
         * 5. 若一个.java源文件中有多个class,则编译后会产生多个.class字节码文件.

二、Java 基本语法

完整笔记

1.标识符

凡是自己手动命名的地方都叫标识符

2.标识符的命名规则

必须遵守,否则编译不通过(相当于法律)

  • 只能由数字、字母,下划线和$组成
  • 不能以数字开头

3.标识符的命名规范

不遵守,编译可以通过,但建议遵守(相当于道德)

  • 包:全部小写
  • 类:每个单词的首字母大写
  • 变量、方法:首单词的首字母小写,其余单词的首字母大写
  • 常量:所有字母大写,相邻单词使用_连接

4.数据类型

4.1 基本数据类型

  • 整型:byte,short,int,long
  • 浮点型:float,double
  • 字符型:char
  • 布尔型:boolean

4.2 引用数据类型

  • 接口
  • 数组

4.3 自动类型转换

基本数据类型中除了boolean,其余都可以进行运算。
范围排序:byte、short、char -> int -> long -> float -> double

  • byte、short、char三者进行运算时,结果都是int
  • 范围小的数据类型与范围大的数据类型进行运算时,结果是范围大的数据类型
  • 范围小的数据类型可以自动转换成范围大的数据类型,反之不行
  • 被fianl修饰的变量不会自动改变类型,当2个final修饰变量相操作时,结果会根据等号左边变量的类型而转化,即等号左边的变量可以是任意基本数据类型。如果一个是final,一个不是,那么还是要进行自动类型转换。例题

4.4 强制类型转换

格式:(基本数据类型)表达式

  • 将范围大的数据类型转换成范围小的数据类型,可能会损失精度。
  • 整数常量默认是int类型,浮点型常量默认是double类型。

4.5 String

  • String不是基本数据类型,是引用数据类型
  • 可以与8种基本数据类型(boolean也可)进行连接运算,结果是String类型
  • 转义字符使用单引号、双引号都可以
       System.out.println('a'+'\t'+'b'); // char类型运算,结果是int类型 204
        System.out.println('a'+"\t"+'b'); //a   b
       System.out.println('a' +'\t'+ "b"); //106b
        System.out.println('a'+('\t'+"b")); //a   b
  • 字符串内容的比较使用方法equal(),推荐将常量放在前面,可以避免空指针异常;
//        登录验证
        Scanner sc = new Scanner(System.in);
        for (int i = 3; i > 0; i--) {
            System.out.println("please input username:");
            String username = sc.next();
            System.out.println("please input password:");
            String password = sc.next();
            if ("123".equals(username)  && "456".equals(password)) {
                System.out.println("登陆成功");
                break;
            } else {
                System.out.println("您还有" + (i - 1) + "次机会");
            }
        }

4.6 练习

short s = 5;
s = s-2; //判断:no;2是int类型,s-2结果是int类型,无法由int类型隐式转换成short类型,所有编译出错。
byte b = 3;
b = b + 4;//判断:no;与上面同理
b = (byte)(b+4);//判断:yes 强制类型转换
char c = ‘a’;
int i = 5;
float d = .314F;
double result = c+i+d; //判断:yes;float的范围最大,故运算结果是float类型的,float类型可以自动转换成double类型。
byte b = 5;
short s = 3;
short t = s + b;//判断:no;byte和short运算结果是int类型,int不能隐式转换成short类型,故编译出错。

5.运算符

完整笔记

5.0 %模运算

a是小数时,模运算的公式:a % b = a - (int) a / b * b

-10.5 % 3 = -1.5

5.1 &和&&的区别

&是逻辑与,第一个表达式无论真假,第二个表达式都会参与计算;
&&是短路与,如果第一个表达式为真,则第二个表达式参与计算,如果第一个表达式为假,则第二个表达式不再计算;

5.2 位运算符

在这里插入图片描述

  • 其中&、|、^三者在逻辑运算符中也出现过,可以根据两侧表达式的类型来判断是逻辑运算符还是位运算符,如果两边是boolean类型的,则为逻辑运算符;如果两边是数值类型(不能是float和double)的,则为位运算符。
  • 没有无符号左移。

5.3 异或实现两数交换

a = (a^b) ^ b

        num1 = num1 ^ num2;
        num2 = num1 ^ num2;
        num1 = num1 ^ num2;

5.4 练习

class OperatorTest {
	public static void main(String[] args) {
		boolean x = true;
		boolean y = false;
		short z = 40;
		if ((z++ == 40) && (y = true)) { // y = true是赋值语句,先赋值再用y参与运算
			z++;
		}
		if ((x = false) || (++z == 43)) {
			z++;
		}
		System.out.println("z = " + z++);
	}
}

z = 44
//比较三个数的大小
        int a = 12, b = 22, c = 22;
        // 方法一
        int max = (a > b) ? ((a > c) ? a : c) : (b > c ? b : c);
        // 方法二
        if (a > b && a > c) {
            System.out.println(a);
        } else if (b > a && b > c) {
            System.out.println(b);
        } else {
            System.out.println(c);
        }
        System.out.println(max);

6.Scanner读取键盘输入

Scanner中并没有提供直接获取char类型的方法,故可以先获取String类型,然后使用charAt(0)方法将其转为char类型

        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        int age = sc.nextInt();
        double height = sc.nextDouble();
        boolean b = sc.nextBoolean();
         char c = sc.next().charAt(0);

7.获取随机数

            // Math.random() 得到的数值范围[0,1)
            // 输出10~99之间的整数
            int random = (int)(Math.random()*90+10);
			获取[a,b]之间的整数公式
			int random = (int)(Math.random()*(b-a+1)+a)

8.分支结构

完整笔记

8.1 if-else

// 从大到小输出abc:一定要注意分类思想,先把简单的情况写出来,然后将复杂的情况写在else中。
            if (a > b) {
                if (c > a) {
                    System.out.println("" + c + a + b);
                } else if (c < b) {
                    System.out.println("" + a + b + c);
                } else {
                    System.out.println("" + a + c + b);
                }
            } else {
                if (c > b) {
                    System.out.println("" + c + b + a);
                } else if (c < a) {
                    System.out.println("" + b + a + c);
                } else {
                    System.out.println("" + b + c + a);
                }
            }

if-else配对遵循就近原则

        int a = 4,b= 5;
        if(a>2)
            if(b<3)
                System.out.println(b);
        else
                System.out.println(a);
4

8.2 switch-case

  • 流程图
    在这里插入图片描述
  • 穿透:如果语句块中没有break语句,那么不会验证是否满足下一个case,而是直接执行下一个语句块,直到遇到break或是switch代码结束为止。
  • case后面是常量,不能是变量
  • switch中的表达式的数据类型只能是:byte、short、char、int、enum、String[JDK7.0后]
  • switch表达式中数据类型应与case后的常量类型一致,或者是可以自动转换的类型(只要两边能互相转换即可,范围大小没关系。如char和int,byte和char)
  • break和default都是可选的
    练习
//将小写字母转为大写字母
        Scanner sc = new Scanner(System.in);
        char c = sc.next().charAt(0);
        switch(c){
            case 'a':
                System.out.println('A');
                break;
            case 'b':
                System.out.println("B");
                break;
            case 'c':
                System.out.println('C');
                break;
            default:
                System.out.println("other");
        }
// 大于60合格,小于60不合格
           System.out.print("请输入:");
           double score = sc.nextDouble();
           switch((int)(score/60)){
               case 1:
                   System.out.println("合格");
                   break;
               case 0:
                   System.out.println("不合格");
                   break;
           }
//        输入年月日,判断是该年的第几天
        while (true){
            System.out.print("please input year:");
            int year = sc.nextInt();
            System.out.print("please input month:");
            int month = sc.nextInt();
            System.out.print("please input day:");
            int day = sc.nextInt();
            int days = 0;
            switch (month) {
                case 12:
                    days += 30;
                case 11:
                    days += 31;
                case 10:
                    days += 30;
                case 9:
                    days += 31;
                case 8:
                    days += 31;
                case 7:
                    days += 30;
                case 6:
                    days += 31;
                case 5:
                    days += 30;
                case 4:
                    days += 31;
                case 3:
                    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
                        days += 29;
                    else
                        days +=28;
                case 2:
                    days+=31;
                case 1:
                    days+=day;
                    System.out.println("第"+days+"天");
                    break;
                default:
                    System.out.println("输入有误");
            }
        }

defalult放在前边,如果没有break,执行完后还会执行下边的语句

    public static void main(String[] args){
        show(0); 15
        show(1); 14
    }
    public static void show(int i){
        switch(i){
            default:
                i+=2;
            case 1:
                i+=1;
            case 4:
                i+=8;
            case 2:
                i+=4;
        }
        System.out.println("i="+i);
    }

8.3 三元运算符

面试题System.out.println(true ? 1 : 2.0); 输出:1.0
如果后边是两个数值型变量,那么三元运算符结果的类型是范围大的那个

8.4 switch-case 和 if-else 选择

  • 当判断的数值不多时,且数据类型是byte、short、char、int、enum、String这六种类型时,建议使用switch;
  • 对区间判断和boolean类型的判断,建议使用if-else;
  • 所有的switch语句和三元运算符都可以转换成if语句,反之则不一定;
  • switch语句和三元运算符的执行效率相对高;

9.循环结构

完整笔记

9.1 for循环

  • 对于在for中定义的初始化语句int i= 0;其中i的作用域是for循环中;
 for (int i = 0; i < 100; i++) {
            if(i%2==0)
                System.out.println(i);
        }

9.2 for循环练习

break不要忘
练习1:最大公约数和最小公倍数

// 最大公约数和最小公倍数
        Scanner sc = new Scanner(System.in);
        System.out.println("please input m:");
        int m = sc.nextInt();
        System.out.println("please input n:");
        int n = sc.nextInt();
        int i = m > n ? n : m;
        for (; i >= 1; i--) {
            if (m % i == 0 && n % i == 0) {
                break;
            }
        }
        System.out.println("最大公约数:" + i);
        // 最小公倍数可以使用公式求出,也可以用求最小公约数的方法求出
		int j = m > n ? m : n;
        for (; j <= m * n; j++) {
            if(j%m==0&&j%n==0){
                System.out.println("最小公倍数:" +j);
                break;
            }
        }
        System.out.println("最小公倍数:" + m * n / i);

每满n个换行,可以采用i%n==0进行判断
练习2:换行输出

        int count = 0;
        for (int i = 1; i <= 100; i++) {
            if(i%5!=0){
                System.out.print(i+"\t");
                count++;
                if(count%5==0){
                    System.out.println();
                }
            }
        }

练习3:循环输出a-z
自增不会改变数据类型

        for (char i = 'a'; i <= 'z'; i++) {
            System.out.println(i);
        }

练习4: 求解1-1/2+1/3-1/4+1/5-…-1/100
注意:在程序中整除的值是商,不留余数,所以常量要写成double类型的

        double sum = 0;
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                sum -= (1.0 / i);
            }else{
                sum += (1.0 / i);
            }
        }
        System.out.println(sum);

9.3 while和do-while的区别

  • do-while至少执行一次,while可以一次也不执行;
  • do-while最后有一个分号;
        do {
			循环体;
        }while (循环条件);

9.4 嵌套循环

练习1:99乘法表

//        99乘法表
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + i * j + "\t");
            }
            System.out.println();
        }

练习2:100以内的所有质数

//  方法1:100以内的所有质数(质数:只能被1和自身整除)
        boolean flag;
        for (int i = 2; i < 100; i++) {
            flag = true;
            for (int j = 2; j*j <= i; j++) {
                if(i%j==0){
                    flag = false;
                    break;
                }
            }
            if(flag){
                System.out.println(i);
            }
        }
// 方法2:利用带标签的continue
        lable:for (int i = 2; i < 100; i++) {
            for (int j = 2; j*j <= i; j++) {
                if(i%j==0){
                    continue lable;
                }
            }
            System.out.println(i);
        }

练习3:打印金字塔

//        打印金字塔
        System.out.println("请输入金字塔高度:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                if (j == 1 || j == 2 * i - 1 || i == n)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }

练习4:打印空心菱形

//打印空心菱形:上下两个空心金字塔即可组成一个空心菱形
        System.out.println("请输入高度:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        // 上金字塔
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                if (j == 1 || j == 2 * i - 1)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }
        // 下金字塔
        for (int i = n-1; i >= 1; i--) {
            for (int j = 1; j <= n - i; j++) {
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
                if (j == 1 || j == 2 * i - 1)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println();
        }

10.break、continue、return

关键字作用
break跳出本层循环,可用于switch和循环
continue跳出本次循环,只能用于循环
return结束当前方法

10.1 带标签的break和continue

可以跳出多层循环

      
          ok:for (int i = 0; i < 100; i++) {
           ok1: for (int j = 0; j < 100; j++) {
                if(i*j==2){
                    break ok;
                    continue ok; // 作用相当于break;
                }
            }
        }

11.项目一:家庭记账系统

  1. while(flag)while的循环条件可以设置一个变量,在循环中通过改变变量值达到退出循环的目的;(系统退出功能模块)

12.一维数组(引用数据类型)

完整笔记

12.1 快速入门

  int[] array = {1,2,3,4};// 定义一个一维数组
  for (int i = 0; i < array.length; i++) { 
      System.out.println(array[i]); // 遍历数组元素,其中array.length表示数组的长度,array[i]表示数组中的i个元素
  }

12.2 数组的四种定义方式

int[ ] array 和 int array[ ] 是等价的,四种定义方式都会在堆中开辟一块新空间;
静态初始化:定义数组时给各元素赋值;
动态初始化:定义数组时不进行赋值;

方式1:动态初始化
int array[] = new int[5];
方式2:先声明,在new分配空间
int[] array;
array = new int[5];
方式3:静态初始化
int[] array = {1,2,3,4,5};
方式4:静态初始化
int[] array = new int[]{1,2,3,4,5};

12.3 数组特点

  1. 数组中元素的数据类型可以是基本数据类型和引用数据类型,但是同一数组中元素的数据类型必须是一致的;
  2. 数组定义后不赋值会有默认值,int、short、byte、long默认为0,float、double默认为0.0,boolean默认为false,char默认为\u0000(整数0的ASCII码),String默认为null(引用数据类型的默认值为null);
  3. 数组的长度一旦确定,就不能修改;
  4. 数字名指向数组首个元素的地址;
  5. 可以通过数组名将此数组地址赋给另一个数组,不用考虑数组的长度;但是类型相同才能赋值,二维数组不能赋值给一维数组
  6. 如果求平均值,应该令总和为double类型;

12.4 值传递和引用传递

  1. 基本数据类型之间赋值是进行值传递,变量之间是相互独立的;
  2. 引用数据类型之间赋值进行的是地址传递,变量共享同一块堆空间(相当于给文件创建了快捷方式);

在这里插入图片描述

12.5 数组拷贝

  1. 如果是使用arr1[i] = arr2[j]的方式给数组赋值,那么这是值传递,两个数组之间互相独立;
数组反转:新创建一个数组,将原数组的值挨个赋值给新数组,最后将新数组的地址赋值给原数组
int[] arr = {1, 2, 3, 4, 5, 6, 7};
int[] arr2 = new int[arr.length];
 for (int i = 0; i < arr.length; i++) {
      arr2[i] = arr[arr.length-1-i];
 }
arr = arr2;
 for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
 }

12.6 内存解析

  1. 局部变量:定义在方法中的变量都是局部变量,局部变量都在栈中;
    放在
    引用数据类型的变量值只可能时null或者地址值,”Tom“在常量池中,而strs[2]中存放的是其地址。
    在这里插入图片描述

13.排序

13.1 冒泡排序

  int[] arr = {2, 1, 4, 5, 6, 3, 14, 8, 32};
   for (int i = 0; i < arr.length - 1; i++) {
       for (int j = 0; j < arr.length - 1 - i; j++) {
           if (arr[j] > arr[j + 1]) {
               swap(arr, j);
           }
       }
   }
   for (int i = 0; i < arr.length; i++) {
       System.out.print(arr[i] + "\t");
   }
 private static void swap(int[] arr, int j) {
   arr[j] = arr[j] ^ arr[j + 1];
   arr[j + 1] = arr[j] ^ arr[j + 1];
   arr[j] = arr[j] ^ arr[j + 1];
}

14.二维数组

定义:数组中的元素类型是一维数组类型的,那此数组就是二维数组。

14.1 快速入门

        int[][] arr = {{1,2,3,4,5},
                        {6,7,8,9,10},
                        {1,2,3,4,5}}; // 声明并初始化二维数组
        // 遍历二维数组,数组名[i][j]访问数组中元素
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+"\t");
            }
            System.out.println();
        }

14.2 二维数组的定义方式

int[ ][ ] arr、int arr[ ][ ] 、int[ ] arr[ ] 三者等价

  • 动态初始化
方式1:int[][] arr = new int[3][4];
方式2;int[][] arr1;
arr1 = new int[3][4];

一维数组中的元素个数不同

方式3:一维数组中的元素个数不同
// 初始化二维数组,但每个一维数组还没有开数据空间,此时一维数组的值为null
  int[][] arr = new int[3][]; 
  for (int i = 0; i < arr.length; i++) {
      arr[i] = new int[i+1]; // 给每个一维数组开辟内存空间
      for (int j = 0; j < arr[i].length; j++) {
          arr[i][j]=i+1;    // 给一维数组中的每个元素赋值
      }
  }
  for (int i = 0; i < arr.length; i++) {
      for (int j = 0; j < arr[i].length; j++) {
          System.out.print(arr[i][j]+"\t"); // 输出每个一维数组
      }
      System.out.println();
  }

1	
2	2	
3	3	3	
  • 静态初始化
int[][] arr1 = {{1,2},{3},{4,5,6}};

int[][] arr2;
arr2 = new int[][]{{1,2},{3},{4,5,6}};✔
arr2 = {{1,2},{3},{4,5,6}};❌(一维数组同理)

14.3 二维数组的特点

  1. 二维数组的每个元素是一维数组;
  2. 二维数组长度:数组名.length;
  3. 二维数组中每个一维数组元素的个数可以不同;
  4. 二维数组定义时,列数可以不指定,但行数必须指定;

14.4 二维数组内存布局

arr[i]中存放的时一维数组的地址值;
在这里插入图片描述
在这里插入图片描述

14.5 二维数组的默认值

 * 	⑤ 数组元素的默认初始化值
 * 	针对于初始化方式一:比如:int[][] arr = new int[4][3];
 * 		外层元素的初始化值为:地址值
 * 		内层元素的初始化值为:与一维数组初始化情况相同
 * 	
 * 针对于初始化方式而:比如:int[][] arr = new int[4][];
 * 		外层元素的初始化值为:null
 * 		内层元素的初始化值为:不能调用,否则报错。
 * 
		int[][] arr = new int[4][3];
		System.out.println(arr[0]);	//[I@15db9742
		System.out.println(arr[0][0]);	//0
		
//		System.out.println(arr);	//ArrayTest3.java
		
		System.out.println("***********************");
		float[][] arr1 = new float[4][3];
		System.out.println(arr1[0]);	//地址值
		System.out.println(arr1[0][0]);	//0.0
		
		System.out.println("***********************");
		
		String[][] arr2 = new String[4][2];
		System.out.println(arr2[1]);	//地址值
		System.out.println(arr2[1][1]);	//null
		
		System.out.println("*********************");
		double[][] arr3 = new double[4][];
		System.out.println(arr3[1]);	//null
//		System.out.println(arr3[1][0]);	//报错

14.6 练习–杨辉三角

使用二维数组打印杨辉三角
int[][] arr = new int[10][];
for (int i = 0; i < arr.length; i++) {
    arr[i] = new int[i + 1];
    for (int j = 0; j < arr[i].length; j++) {
        if (j == 0 || j == arr[i].length - 1)
            arr[i][j] = 1;
        else {
            arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; // 杨辉三角的规律
        }
    }
}
// 输出
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        System.out.print(arr[i][j] + "\t");
    }
    System.out.println();
}

14.7 练习–数组的定义

f:对于引用数据类型来说,类型相同才能赋值

在这里插入图片描述

并对错误的答案加上单行注释,写出错误的原因。
A,float[]=new float[3]; // 没有数组名
B, float f2[]=new float[];//没有定义数组长度
C, float[] f1=new float[3];//
D, boolean[] b={"true","false","true"};// boolean不是字符串
E, double f4[]={1,3,5}; //
F, int f5[]=new int[3]{2,3,4}; // 动态初始化和静态初始化不能同时出现
G, float f4[]={1.2F,3.0,5.4};// 3.0,5.4是double类型的,不能自动转为float

14.8 练习–归并排序思想

题目:向升序数组中插入一个元素,使其仍保持升序
思路:归并排序,把要插入的数当作长度为1的数组。

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[]{10, 12, 45, 90};
        int[] temp = new int[arr.length + 1];
        int i;
        for (i = 0; i < arr.length; i++) {
            if (arr[i] < n) {
                temp[i] = arr[i];
            } else {
                temp[i] = n;
                break;
            }
        }
        if (i == arr.length) {
            temp[temp.length-1] = n;
        } else {
            while (i < arr.length) {
                temp[i + 1] = arr[i];
                i++;
            }
        }
        for (int j = 0; j < temp.length; j++) {
            System.out.print(temp[j]+"\t");
        }

14.9 练习–数组元素的赋值

创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同
i--的思想一定要掌握

        int[] arr = new int[6];
        for (int i = 0; i < arr.length;i++) {
            // 不管是否重复,先给arr[i]赋值,如果重复,则令i--,继续给当前元素赋值
            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.print(arr[i]+"\t");
        }

15.Arrays工具类

笔记

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值