Java笔记——基础知识(1)

注⚠️⚠️⚠️:本系列java笔记为个人学习过程中笔记记录,分享给各位小伙伴,希望能对各位小伙伴有所帮助。在参考笔记时,可根据自己的学习进程选取参考哦。此外,对于笔记中一些个人当时的学习理解,如有不妥欢迎各位小伙伴指正哦~

笔记内容多数是学习java语言时看的一些网课所记录,主要参考的是B站黑马程序员java课程。

目录

一.基础知识

1.程序框架

2.标识符

3.关键字

4.字面量

5.基本数据类型

6.运算符

(1)算数运算符

(2)关系运算符

(3)逻辑运算符

(4)三元运算符

(5)运算符的优先级

7.流程控制语句

(1)顺序结构

(2)分支结构

a.if语句

b.switch语句

(3)循环结构

a.for循环

b.while循环

c.do...while循环

d.循环扩展

e.循环综合练习

二.数组

1.数组相关概念

(1)数组的定义

(2)数组地址值

2.数组的初始化

(1)静态初始化

(2)动态初始化

3.数组常见操作

a.求最值

b.求和

d.打乱数据

4.数组的内存图

一.基础知识

1.程序框架

package basic;

public class HelloWorld {
    public static void main(String[] args){
        //System.out.println("Hello World!");
    }
}

2.标识符

  • 标识符:给方法变量等起的名字

    1.由数字、字母、下划线(_)和美元符($)组成;

    2.区分大小写;

    3.不能以数字开头;

    4.不能是关键字;

    见名知意

    方法、变量命名:

    • 标识符是一个单词的时候,全部小写

    • 标识符有多个单词组成时,第一个单词首字母小写,其他单词首字母大写

    类命名:

    • 标识符是一个单词的时候,首字母大写

    • 标识符有多个单词组成时,每个单词首字母大写

  • Scanner(java包含的一个类,键盘录入)

    • 导包---Scanner所处的类

      import java.util.Scanner;    
      //导包动作必须出现在类定义的上边

    • 创建对象---使用Scanner

       Scanner sc = new Scanner(System in);
       //以上仅sc为变量名可以改变,其余不可改变
    • 接受数据---Scanner发挥作用

      int i = sc.nextInt();
      //以上格式仅i是变量名,可以改变,其余不可改变
package basic;
//导包---Scanner所处的类
//导包动作必须出现在类定义的上边
import java.util.Scanner;

public class Scan {
    public static void main(String[] args){
        //创建对象---使用Scanner
        Scanner sc = new Scanner(System.in);

        //接受数据---Scanner发挥作用
        //变量 i 记录了键盘录入的数据
      	System.out.println("请输入第一个数字:");
        int i = sc.nextInt();

      	System.out.println("请输入第二个数字:");
      	int j = sc.nextInt();
        //System.out.println();
     
        System.out.println(i+j);
    }

}

3.关键字

关键字:被赋予特定涵义的英文单词,小写

关键字涵义
class用于创建/定义一个类

类:java中最基本的组成单元

4.字面量

字面量类型说明范围
整数类型不带小数点的数字
小数类型带小数点的类型
字符串类型用双引号括起来
字符类型用单引号括起来,内容只有一个
布尔类型布尔值,表示真(1)假(0)
空类型一个特殊的值,空值

5.基本数据类型

  • 整型

    关键字取值范围内存占用
    byte-128~1271
    short-32768~327672
    int【默认】+-e104
    long+-e198

    long类型在进行定义的时候需要在数据值后加上l/L作为后缀,建议使用L避免与数字1混淆

  • 浮点型

    关键字取值范围内存占用
    float-3.40128e-38~3.40128e+384
    double【默认】-4.9000000e-324~1.797693e+3088

    float类型在进行定义时需加f/F作为后缀

  • 字符型(char; 0~65535; 2字节)

  • 布尔(boolean; true, false; 1字节)

6.运算符

(1)算数运算符
符号作用
+
-
*
/
%取余
++自增
--自减
=赋值
+=加后赋值
-=减后赋值
*=乘后赋值
/=除后赋值
%=取余后赋值

整数参与计算,结果得到整数;想要得到小数,必须有浮点数参与运算

小数参与计算,结果有可能是不精确的

/取结果的商,%取结果的余数

a%=b,即a➗b的余数赋值给a

  • 隐式类型转换:取值范围小的数值-->取值范围大的数值

    隐式类型转换是自动类型提升:

    取值范围小的,和取值范围大的进行运算,小的会先提升为大的再进行计算【 byte --> short --> int --> long --> float -->double 】

    byte short char三种类型的数据结构在运算的时候,都会直接先提升为int ,再进行计算。

    数据类型不一样,不能进行计算,需要转换成一样的才可以进行计算

  • 强制类型转换:取值范围大的数值-->取值范围小的数值

    强制类型转换:将取值范围大的数值,赋值给取值范围小的变量是不允许直接进行的

    格式:目标数据类型 变量名 = (目标数据类型)被强制转换的数据;

package basic;

public class count{
  public static void main(String[] args){
    byte b1 = 10;
  byte b2 = 20;
  byte result = (byte)(b1 + b2);
  System.out.println(result);//20
  }
}




package basic;

public class count{
  public static void main(String[] args){
    byte b1 = 100;
  byte b2 = 200;
  byte result = (byte)(b1 + b2);
  System.out.println(result);//结果发生错误,超出byte范围
  }
}

关于'+'

字符➕字符;字符➕数字时会把字符通过ASCII码表查询到对应的数字再进行计算【A==65; a=97】

当“➕”操作中出现字符串时,这个“➕”是字符串链接符,而不是算数运算符。会将前后的数据进行拼接,并产生一个新的字符串。【eg:"abc" + 123 --> "123123"】

连续进行“➕”操作时,从左到右逐个执行。【eg: 1 + 99 +"年牛马" --> "100年牛马"】

package basic;

public class count{
  public static void main(String[] args){
    System.out.println(3.7 + "abc");//"3.7abc"
    System.out.println("abc" + true);//"abctrue"
    System.out.println('中' + "abc" + true);//"中abctrue"
    
    int age = 18;
    System.out.println("我的年龄是" + age + "岁");//"我的年龄是18岁"
 		System.out.println("我的年龄是" + "age" + "岁");//"我的年龄是age岁"
    System.out.println(1 + 2 + "abc" + 2 + 1);//"3abc21"
    int a = 18;
    int b = 20;
    a += b;
    System.out.println(a);
    System.out.println(b);

    short s = 1;
    s += 1;
    //等同于:s = s + 1;  but,short-->int
    //因此,此处存在强制类型转换:s = (short)(s + 1);
    //+=,-=,/=,%=的底层都隐藏一个强制类型转换
    System.out.println(s);
  }
}

+=,-=,/=,%=的底层都隐藏一个强制类型转换

(2)关系运算符
符号作用
==a==b,判断a和b的值是否相等,成立为true,不成立为false
!=a!=b,判断a和b的值是否不相等,成立为true,不成立为false
>a>b,判断a是否大于b,成立为true,不成立为false
>=a>=b,判断a是否大于等于b,成立为true,不成立为false
<a<b,判断a是否小于b,成立为true,不成立为false
<=a<=b,判断a是否小于等于b,成立为true,不成立为false

关系运算符的结果都是boolean类型,仅true、false

(3)逻辑运算符
符号作用说明
&逻辑与并且,两边都为真,结果才为真
逻辑或或者,两边都为假,结果才为假
^逻辑异或相同为false,不同为ture
逻辑非取反
&&短路与结果和&相同,但有短路效果
||短路或结果和|相同,但有短路效果

对于短路逻辑运算符,当左边的表达式能确定最终的结果,那么右边的表达式就不会参与运行了

package basic;

import java.util.Scanner;
public class judge {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要判断的次数:");
        int num = sc.nextInt();

        System.out.println(true & true);//true
        System.out.println(false & false);//false
        System.out.println(true & false);//false
        System.out.println(false & true);//false

        System.out.println(true | true);//true
        System.out.println(false | false);//false
        System.out.println(true | false);//ture
        System.out.println(false | true);//ture

        System.out.println(true ^ true);//false
        System.out.println(false ^ false);//false
        System.out.println(true ^ false);//ture
        System.out.println(false ^ true);//ture

        System.out.println(!true);//false
        System.out.println(!false);//ture
      
      	System.out.println(true && true);//true
        System.out.println(false && false);//false
        System.out.println(true && false);//false
        System.out.println(false && true);//false

        System.out.println(true || true);//true
        System.out.println(false || false);//false
        System.out.println(true || false);//ture
        System.out.println(false || true);//ture
      
      	//关于短路运算符
        int a = 10;
        int b = 10;
        boolean result = ++a < 5 && ++b < 5;
        System.out.println(result);//false
        System.out.println(a);//11,++a参与运算
        System.out.println(b);//10,//&&前运算符判断出结果为false,&&后的++b没有参与运算
        b++;
        result = ++a < 5 & ++b < 5;
        System.out.println(result);//false
        System.out.println(a);//12,++a参与运算
        System.out.println(b);//12,//&&前运算符判断出结果为false,&&后的++b依旧78参与运算

    }
}
(4)三元运算符
 格式:关系表达式 ? 表达式1 : 表达式2;

作用:可以进行判断,根据判断的结果得到不同的内容

计算规则:

首先计算关系表达式的值

如果值为true, 表达式1的值就是运算结果;

如果值为false, 表达式2的值就是运算结果;

(5)运算符的优先级
优先级运算符
1.(){}
2!、-、++、--
3*、/、%
4+、-
5<<、>>、>>>
6<、<=、>、>=、instances
7==、!=
8&
9^
10|
11&&
12||
13?:
14=、+=、-=、*=、/=、%=、&=

7.流程控制语句

(1)顺序结构

(2)分支结构
a.if语句
  • 格式

    //格式一:单条件判断
    if (关系表达式){
      语句体;
    }
    
    //格式二:双条件判断
    if(关系表达式){
      语句体1;
    }else{
      语句体2;
    }
    
    //格式三:多条件判断
    if(关系表达式1){
      语句体1;
    }else if(关系表达式2){
      语句体2;
    } 
        ....
      else{
            语句体n + 1;
          }

    执行流程:

    1.首先计算关系表达式的值

    2.如果关系表达式的值为true就执行语句体,否则不执行语句体/执行else if/else语句

    3.继续执行后续语句

  • 考试成绩

    package basic;
    import java.util.Scanner;
    public class ConditionOne {
        public static void main(String[] args){
            Scanner sc =  new Scanner(System.in);
            System.out.println("请输入小明的成绩:");
            int score = sc.nextInt();
            if(score >= 0 && score <= 100){
                if(score >= 95 && score <= 100){
                    System.out.println("送自行车一辆");
                }else if(score >= 90 && score <= 94){
                    System.out.println("游乐场玩一天");
                }else if(score >= 80 && score <= 89){
                    System.out.println("送变形金刚一个");
                }else if(score <80){
                    System.out.println("揍一顿");
                }
            }else{
                System.out.println("当前输入的成绩不合法");
            }
    
        }
    
    }

  • 会员支付

     package basic;
     import java.util.Scanner;
     public class ConditionOne {
         public static void main(String[] args){
             Scanner sc =  new Scanner(System.in);
             System.out.println("商品的的价格为:");
             int price = sc.nextInt();
             System.out.println("请输入会员的级别:");
             int vip = sc.nextInt();
             if(vip == 1){
                 System.out.println("实际支付的钱为:" + (price * 0.9));
             }else if(vip == 2){
                 System.out.println("实际支付的钱为:" + (price * 0.8));
             }else if(vip == 3){
                 System.out.println("实际支付的钱为:" + (price * 0.7));
             }else{
                 System.out.println("实际支付的钱为:" + price);
             }
         }
     ​
     }

b.switch语句
  • 格式

    switch(表达式){
      case 值1:
        语句体1;
        break;
      case 值2:
        语句体2;
        break;
      ....
      default:
        语句体n+1;
        break;  
    }
    
    
    格式说明:
    1.表达式:(将要匹配的值)取值为byte、short、int、char【JDK5以后可以是枚举,JDK7以后可以是String】
    2.case:后面跟的是要和表达式进行比较的值(被匹配的值)
    3.break:表示中段,结束的意思,用来结束switch
    4.default:表示所有情况都不匹配的时候,就执行该处的内容
    5.case后面的值只能是字面量,不能是变量,且case后面给出的值不能重复

    执行流程:

    1.首先计算表达式的值

    2.依次和case后面的值进行比较,如果有对应的值就会执行相应的语句,在执行过程中遇到break就会结束

    3.如果所有的case后面的值和表达式都不匹配,就会执行default里面的语句体,然后结束整个switch语句

  • 吃面点单

    package basic;
     ​
     import java.util.Scanner;
     ​
     public class ConditionTwo {
         public static void main(String[] ars){
             Scanner sc = new Scanner(System.in);
     ​
             System.out.println("请输入您要吃的面:");
             String noodles = sc.nextLine();
     ​
             switch (noodles){
                 case"兰州拉面":
                     System.out.println("吃兰州拉面");
                     break;
                 case"武汉热干面":
                     System.out.println("吃武汉热干面");
                     break;
                 case"北京炸酱面":
                     System.out.println("吃北京炸酱面");
                     break;
                 case"陕西油泼面":
                     System.out.println("吃陕西油泼面");
                     break;
                 default :
                     System.out.println("吃方便面");
                     break;
             }
         }
     }

  • 运动计划

     package basic;
     ​
     import java.util.Scanner;
     ​
     public class ConditionTwo {
         public static void main(String[] ars){
             Scanner sc = new Scanner(System.in);
             
             System.out.println("请录入星期:");
             int week = sc.nextInt();
             switch (week){
                 case 1 :
                     System.out.println("跑步");
                     break;
                 case 2 :
                     System.out.println("游泳");
                     break;
                 case 3 :
                     System.out.println("慢走");
                     break;
                 case 4 :
                     System.out.println("动感单车");
                     break;
                 case 5 :
                     System.out.println("拳击");
                     break;
                 case 6 :
                     System.out.println("爬山");
                     break;
                 case 7 :
                     System.out.println("除顿好的");
                     break;
                 default :
                     System.out.println("输入错误");
                     break;
             }
         }
     }

    switch扩展:

    1.default 可以省略不写(如果没有备选项的话),也可以在整个语句的其他位置,不一定在下面,但习惯上将它放在最后面

    2.case穿透:通过break控制,遇到break才会中断,否则继续向下运行【一般在多个case语句体重复时使用】

    3.switch特性+1【JDK12之后可使用】:简化代码

    4.if与switch比较:if一般用于对范围的判断;switch一般用于把有限个数据一一列举出来,从中任选其一

  • 运动计划的拓展

    package basic;
     ​
     import java.util.Scanner;
     ​
     public class ConditionTwo {
         public static void main(String[] ars){
             Scanner sc = new Scanner(System.in);
             
             System.out.println("请录入星期:");
             int week = sc.nextInt();
             switch (week){
                 case 1 ->{
                   System.out.println("跑步");
                 }
                 case 2 ->{
                   System.out.println("游泳");
                 }
                 case 3 ->{
                   System.out.println("慢跑");
                 }
                 case 4 ->{
                   System.out.println("动感单车");
                 }
                 case 5 ->{
                   System.out.println("拳击");
                 }
                 case 6 ->{
                   System.out.println("爬山");
                 }
                 case 7 ->{
                   System.out.println("吃顿好的");
                 }
                 default ->{
                   System.out.println("吃顿好的");
                 }
             }
         }
     }
     ​
     ​
     //case后大括号只有一条语句,大括号也可以省去
     package basic;
     ​
     import java.util.Scanner;
     ​
     public class ConditionTwo {
         public static void main(String[] ars){
             Scanner sc = new Scanner(System.in);
             
             System.out.println("请录入星期:");
             int week = sc.nextInt();
             switch (week){
                 case 1 -> System.out.println("跑步");
                 case 2 -> System.out.println("游泳");
                 case 3 -> System.out.println("慢跑");
                 case 4 -> System.out.println("动感单车");
                 case 5 -> System.out.println("拳击");
                 case 6 ->
                   System.out.println("爬山");
                 case 7 -> System.out.println("吃顿好的");
                 default -> System.out.println("吃顿好的");
             }
         }
     }

  • 工作周

    package basic;
    
    import java.util.Scanner;
    
    public class ConditionTwo {
        public static void main(String[] ars){
            Scanner sc = new Scanner(System.in);
    				System.out.println("请输入一个整数表示星期 ");
            int week = sc.nextInt();
    
            switch (week){
                case 1 :
                case 2 :
                case 3 :
                case 4 :
                case 5 :
                    System.out.println("工作日");
                    break;
                case 6 :
                case 7 :
                    System.out.println("休息日");
                    break;
                default :
                    System.out.println("录入错误");
                    break;
            }
        }
    }
    
    //进一步化简
    package basic;
    
    import java.util.Scanner;
    
    public class ConditionTwo {
        public static void main(String[] ars){
            Scanner sc = new Scanner(System.in);
          
          	System.out.println("请输入一个整数表示星期 ");
            int week = sc.nextInt();
    
    				switch(week){
                case 1, 2, 3, 4, 5 :
                    System.out.println("工作日");
                    break;
                case 6, 7 :
                    System.out.println("休息日");
                    break;
                default :
                    System.out.println("录入错误");
                    break;
            }
        }
    }
    

  • 机票业务

    package basic;
     ​
     import java.util.Scanner;
     ​
     public class ConditionTwo {
         public static void main(String[] ars){
             Scanner sc = new Scanner(System.in);
     ​
             System.out.println("请输入您的选择:");
             String noodles = sc.nextLine();
     ​
             switch (noodles){
                 case "1" :
                     System.out.println("机票查询");
                     break;
                 case "2" :
                     System.out.println("机票预订");
                     break;
                 case "3" :
                     System.out.println("机票改签");
                     break;
                 case "4" :
                     System.out.println("退出服务");
                     break;
                 default :
                     System.out.println("退出服务");
                     break;
             }
           
       }
     }
(3)循环结构
a.for循环
  • 格式

    for(初始化语句;条件判断语句;条件控制语句){
    循环体语句;
    }

执行流程:

1.执行初始化语句【作为循环的开始,仅执行一次】

2.执行条件判断语句,看其结果是true还是false,如果是ture执行循环体语句;如果是false,循环结束

3.执行条件控制语句

4.回到2继续执行条件判断语句

b.while循环
  • 格式

    初始化语句;
    while(条件判断语句){
      循环体语句;
      条件控制语句;
    }

执行流程:

1.执行初始化语句【作为循环的开始,仅执行一次】//可位于循环外

2.执行条件判断语句,看其结果是true还是false,如果是ture执行循环体语句;如果是false,循环结束

3.回到2继续执行条件判断语句

for与while对比:

相同点:运行规则都是一样的

区别:

for循环中控制循环的变量归属于for循环的语法结构中,在for循环结束后,就不能再次被访问到。但当for循环的变量定义在循环体外时,脱离循环体也可以访问

while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

!!for循环:知道循环次数或者循环的范围;while循环:不知道循环的次数和范围,只知道循环的结束条件。

  • 回文数

     package basic;
     ​
     import java.util.Scanner;
     ​
     public class PalindromicNumber {
         public static void main(String[] args){
             Scanner sc = new Scanner(System.in);
             //判断回文数,是打印ture;不是打false
             //核心思路:把数字到过来与原数字比较
     ​
             //录入数字
             System.out.println("请输入所需要判断的数字:");
             int x = sc.nextInt();
             int num = 0;
             int temp = x;
     ​
             while(temp != 0){
                 //从右往左获取每一位数字
                 int ge = temp % 10;
                 temp /= 10 ;
                 num = num * 10 + ge;
             }
             System.out.println(num);
             System.out.println(num==x ? "ture" : "false");
     ​
         }
     }
     ​

  • 循环中的除法

     package basic;
     ​
     import java.util.Scanner;
     ​
     public class Divisor {
         public static void main(String[] args){
             Scanner sc = new Scanner(System.in);
             /*
             给定两个整数,除数和被除数(都是正整数,且不超过int范围)
             将两数相除,要求不使用乘法、除法、取余运算符得到商和余数
              */
             //分析:被除数 / 除数 = 商 ... 余数
     ​
             System.out.println("请输入被除数:");
             int dividend = sc.nextInt();
             System.out.println("请输入除数:");
             int divisor = sc.nextInt();
             int cnt = 0;
             while(dividend >= divisor){
                 dividend -= divisor;
                 cnt ++;
     ​
             }
             System.out.println("商:" + cnt);
             System.out.println("余数:" + dividend);
     ​
         }
     }
     
c.do...while循环
  • 格式

    初始化语句
    do{
      循环体语句;
      条件控制语句;
    }while(条件判断语句);
d.循环扩展
  • 无限循环

    无限循环:
    //for循环
    for(;;){
    	循环体;
    }
    
    //while循环
    while(ture){
      循环体;
    }
    
    //do...while循环
    do{
      循环体;
    }while(ture);  
    
    //无限循环下面不能写其他代码,循环不会停止,循环后代码不能得到执行
  • 跳转控制语句

    continue:跳出本层循环的本轮循环,继续执行本层循环的下一轮循环;
     break:跳出本层循环;
e.循环综合练习
  • 逢七过

    package basic;
    
    public class SevenPass {
        public static void main(String[] args){
            for(int i = 1; i <= 100; i++){
                if(i % 10 == 7 || i / 10 % 10 == 7 || i % 7 == 0){
                    System.out.println("过");
                    continue;
                }else{
                    System.out.println(i);
                }
            }
        }
    
    }
    

  • 平方根

     package basic;
     ​
     import java.util.Scanner;
     ​
     public class SquareRoot {
         public static void main(String[] args){
             Scanner sc = new Scanner(System.in);
             System.out.println("请输入需要处理的数字:");
             int num = sc.nextInt();
     ​
             for(int i = 0; i <= num; i++){
                 if(i * i == num){
                     System.out.println(i + "就是" + num + "的平方根");
                     break;
                 }else if(i * i > num){
                     System.out.println((i-1) + "就是" + num + "平方根的整数部分");
                     break;
                 }
             }
         }
     }
     ​

  • 求质数

     package basic;
     ​
     import java.util.Scanner;
     public class PrimeNumber {
         public static void main(String[] args){
             Scanner sc = new Scanner(System.in);
     ​
             System.out.println("请输入需要判断的数:");
             int num = sc.nextInt();
             boolean flag = true;
     ​
             for(int i = 2; i < num/2; i += 1){
                 if(num % i == 0){
                     //System.out.println(num + "不是一个质数");
                     flag = false;
                     break;
                 }
             }
             System.out.println(num + (flag ? "是" : "不是") + "一个素数");
     ​
         }
     ​
     }
     ​
  • 猜数字

    //获取随机数
     ​
     //导包
     import java.util.random;
     ​
     //创建对象
     Random r = new Random();
     //以上仅r为变量名可以改变,其余不可改变
     ​
     //random发挥作用
     int number = r.nextInt(随机数的范围);
     //以上格式内,仅number为变量名,可以改变,其余均不可改变
     ​
     int number = r.nextInt(a , b);
     //实际范围:[a,b)
     package basic;
     ​
     import java.util.Scanner;
     import java.util.Random;
     ​
     public class GuessNumber {
         public static void main(String[] args){
             Scanner sc = new Scanner(System.in);
             Random r = new Random();
     ​
         //生成一个随机数范围1~100
             int num = r.nextInt(0,100) + 1;
     ​
             //扩展机制:保底3次猜中
             int count = 0;
             while(true){
                 System.out.println("请输入你要猜的数:");
                 int x = sc.nextInt();
                 count ++;
                 if(x == num || count == 3){
                     System.out.println("恭喜您猜对了!");
                     break;
                 }else if(x > num){
                     System.out.println("大了!");
                 }else{
                     System.out.println("小了!");
                 }
             }
     ​
         }
     }
     

二.数组

  • 数组:可以用来存储多个同种数据类型的值

    数组容器在存储数据的时候,需要结合隐式转换考虑

    Eg:

    int类型数组容器【boolean. byte. short. int. double.】

    double类型数组容器【byte. short. int. long. float. Double】

1.数组相关概念

(1)数组的定义

//格式一
 数据类型 [] 数组名    //eg: int [] array
 ​
 //格式二
 数据类型 数组名[]    //eg: int array[]

(2)数组地址值

  • 数组的地址值表示数组在内存中的位置

  • 数组地址分析

    举个栗子:地址:[D@776ec8df

    [ :表示当前是一个数组

    D :表示当前数组内元素为double 类型;【如果为int类型则为I】

    776e8df : 数组真正的地址值以十六进制形式展现

  • 索引:即下标,角标。索引从0开始,逐个+1增长,连续不间断

  • 数组遍历:利用循环对数组内每个元素进行遍历

    //开始条件:0
    //结束条件L:数组长度 - 1(最大索引)
    //数组长度属性,length ;调用方式:数组名.length
    for(int i = 0;i < arr.length; i++){
      System.out.println(arr[i]);
    }
    
    
    //idea中快速生成数组的遍历方式: 数组名.fori + 回车

    数组常见问题:索引越界异常,索引超出了数组范围

    小建议:一个循环尽量做一件事情,方便整理思路

2.数组的初始化

(1)静态初始化

  • 初始化:在内存中为数组容器开辟空间,并将数据存入容器过程中

  • 完整格式:数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...};

  • 简化格式:数据类型[] 数组名 = {元素1, 元素2, 元素3...};

  • Eg: int[] array = new int[]{11, 22, 33};

    double[] array2 = new double[]{11.1, 22.2, 33.3};

(2)动态初始化

  • 动态初始化时只指定数组长度,由系统为数组分配初始值

  • 格式:数据类型[] 数组名 = new 数据类型[数组长度]

数组默认初始化值:

整数类型:默认初始化值为 0

小数类型:默认初始化值为 0.0

字符类型:默认初始化值为 '/u0000'

布尔类型:默认初始化值为 false

引用数据类型:默认初始化值为 null

3.数组常见操作

a.求最值
  • 打擂台

    int max = arr[0];
    for(int i = 1; i < arr.length; i++){
      if(arr[i] > max){
        max = arr[i];
      }
    }

    1.定义max变量准备记录擂台上的变化: int max = arr[0];

    2.遍历数组获取每一个元素

    让每一个元素与max进行比较,如果找到更大的,就使max记录该元素

b.求和
package basic;

import java.util.Random;
public class Sum {
    public static void main(String[] args){
        Random r = new Random();
        //定义数组
        int[] arr = new int[10];
        //把随机数存到数组当中
        for (int i = 0; i < arr.length; i++){
            int number = r.nextInt(100) + 1;
            //将生成的随机数添加到数组当中
            //数组名[索引] = 数据;
            arr[i] = number ;
        }

        //求和
        int sum = 0;
        for (int i = 0; i < arr.length; i++){
            sum += arr[i];
        }
        System.out.println("数组中所有数据的和为:" + sum);
        double avg = (double)sum / arr.length;
        System.out.println("数组平均数为:" + avg);

        int count = 0;
        for(int i = 0; i < arr.length; i++){
            if(arr[i] < avg){
                count++;
            }
        }
        System.out.println("在数组中,一共有" + count + "个数据比平均数小");

        //遍历数组,验证答案
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i] + "\t");
        }


    }
}

 遍历数组,利用循环进行求和,取平均值,记录等操作

d.打乱数据
 package basic;
 ​
 import java.util.Random;
 ​
 public class Disorganize {
     public static void main(String[] args){
         Random r = new Random();
         //需求:定义一个数组,存入1~5,要求打乱数组中所有数据顺序
         //获取随机索引
         int[] arr = {1, 2, 3, 4, 5};
         for(int i = 0; i < arr.length; i++){
             int temp = arr[i];
             int x = r.nextInt(arr.length);
             arr[i] = arr[x];
             arr[x] = temp;
         }
 ​
         for(int i = 0; i < arr.length; i++){
             System.out.print(arr[i] + "\t");
         }
     }
 }
 ​

4.数组的内存图

(1)JAVA的内存分配

  • 栈:方法运行时使用的内存,方法开始执行时进栈,执行完毕出栈

  • 堆:存储对象或数组,new来创建的数据都存储在堆内存,在堆内存开辟空间并产生地址。

  • 方法区:存储可以运行的class文件

  • 寄存器:给CPU使用

  • 本地方法栈 :JVM在使用操作功能的时候使用

JDK7及之前方法区域堆相连,JDK8之后方法区一部分分给堆,一部分存储在新分离出的元空间

当两个数组指向同一个小空间时,其中一个数组对小空间的值发生了改变,那么其他数组再次访问的时候都是修改后的结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值