byte数组转double_0008.数组001

1.数组

1.1.数组的定义

   数组就是一个存放【相同数据类型】的【有序】集合(容器)。

1.2.数组的声明

 语法1: 数据类型[] 变量名;
      int[] arr1;
      String[] arr2;    
​
 语法2:数据类型  变量名[];
      int arr1[];   
      String arr2[];
  注意事项:
    a)建议声明数组的时候,采用第一种声明数组的方式。
    b)“数据类型[]”代表的就是数组类型,例如:int[]代表int类型的数组。
    c)为什么声明数组的时候需要“数据类型”???使用“数据类型”声明数组,代表数组中每个元素都是该数据类型
         int[] arr1; ---> 数组中每个元素都是int类型

1.3.数组的创建

 强调:数据属于引用数据类型。
  方式一:动态创建数组,也就是使用new关键字来创建数组
    语法:  数据类型[] 变量名 = new 数据类型[数组长度];
         int[] arr = new int[5];
​
  方式二:静态创建数组
    语法1:数据类型[] 变量名 = {数据1, 数据2, 数据3, ...};
         String[] arr = {"aa", "bb", "cc", "dd"};
    语法2:数据类型[] 变量名 = new 数据类型[]{数据1, 数据2, 数据3, ...};
         String[] arr = new String[]{"aa", "bb", "cc", "dd"};
    理解:不但要创建一个指定空间大小的数组,而且在创建数组的同时还完成了数组的每个元素赋值操作
     注意事项:
        a)“静态创建数组”的方式无需设置数组的空间长度,因为“静态创建数组”的方式数组的空间长度由设置的元素个数决定。
        b)直接使用“{}”创建数组的方式(静态创建数组方式一)不能直接作为方法的实参和返回值!
            因为:编译器不认识{}创建的数组。
 补充:创建数组,本质上就是在内存中开辟内存空间,准备用来存储数组元素。    

1.4.数组的简单操作

  核心:通过数组名找到数组在内存中的存储空间,然后通过“索引值”找到数组中某一个格子,然后再操作格子中的元素。
  语法:数组名[索引值]     

1.5.数组的相关注意事项

 a)操作数组的时候,索引不能越界,否则抛出“java.lang.ArrayIndexOutOfBoundsException”
    索引合法区间:[0, 数组长度-1]
​
 b)数组存储的元素的数据类型必须和声明数组的数据类型保持一致。
    int[] arr = new int[5];
    arr[0] = "11";  // 错误 
    arr[1] = 22;    // 正确
 c)创建数组的时候必须明确数组的空间长度,数组一旦创建成功,那么数组的空间长度也不能改变了!
    补充:属于数组数据类型的核心特点。
 d)声明数组的数据类型可以是任意数据类型,可以是基本数据类型,也可以是引用数据类型
    int[] arr1 = new int[5];
    String[] arr2 = new String[10];

1.6.数组元素的默认值

  重点强调“动态创建数组”这种方式的每个元素默认值。  
      整数(byte、short、int和long)类型的数组的默认值为为0;
      小数(float和double)类型的数组的人默认值为0.0;
      boolean类型数组的默认值为false ;
      char类型数组的默认值为“u0000”,就是一个空格;
      引用数据类型数组的默认值为null,null是空对象的意思。
  强调:以上默认值必须记住,后面面向对象还会用!!!

1.7.数组常见属性

  length属性,用于获取数组的空间长度值。  

1.8.使用普通for循环遍历数组

   技能:循环 + length属性      

1.9.for-each循环

  可以遍历数组中的元素,还可以遍历集合中的元素(集合后面学习)。
  语法:  for(数据类型  变量名 : 数组|集合) {
             // 循环体
         }
​
  优势:语法简洁,并且效率较高。
  劣势:循环过程中无法获取数组的索引值,索引在循环体中不能修改元素的值。       
  建议:如果只需要遍历数组中元素,那么建议使用for-each循环
       如果不但要获取数组中的元素,还要修改数组中的元素值,那么建议使用普通for循环。

1.10.JVM中的堆和栈(重点)

9e9d73c3ebc7d47d2054014a438e4fd3.png

2.随堂练习及内存分析

   a)获取10个学生的成绩,然后保存在数组中,最后计算学生的总分和平均分。  

f10aa48aa1aa4c1fc1710f6397519f88.png

d3f70889ea1038b568c3f091efd703ad.png

3.目前已经接触到的异常???

java.lang.NullPointerException ---> 空指针异常
    原因:对一个空对象进行操作,就会抛出空指针异常
    
java.lang.ArrayIndexOutOfBoundsException ---> 数组索引越界异常
    原因:操作数组的索引越界,索引合法区间:[0, 数组长度-1]
​
 java.lang.ArithmeticException --> 算数异常
    原因:分母为0。
以上三个异常都属于运行时(在虚拟机执行代码)的时候抛出的错误(异常),编译的时候没有任何问题。

4.数据结构

4.1数据结构和算法

   数据结构:数组、链表、图、栈、队列、哈希表、二叉树

4.2.数组的数据结构

   核心特点:
   a)数组是一块连续的内存空间
   b)数组一旦创建成功,空间长度就不能改变了
   数组的优势和劣势 
        优势:通过索引来查找速度非常非常快!  
        劣势:插入和删除效率低下
            需要自己手动实现数组扩容操作。     

5.关于static修饰方法的调用

          本类中:直接使用“方法名()”调用即可。
   在别的类中:通过“类名.方法名()”来调用 

6.java提供的数组工具类

 java.util.Arrays,使用Arrays工具类的时候需要导包。

7.Arrays工具类中常见的方法

    public static String toString(int[] a) 
        --> 输出数组中的元素,也就是把数组中的元素转化为字符串输出。
        
    public static void sort(int[] a) 
        --> 对数组中的元素进行排序(默认为升序)
        
    public static int binarySearch(int[] a, int key)
        --> 对数组执行二分查找。如果查找失败,那么返回一个负数。
        
    public static int[] copyOf(int[] original, int newLength) 
        --> 从被拷贝的数组的第一个元素开始拷贝
            original:被拷贝的数组。newLength:拷贝数组的长度
            返回:返回拷贝完成的新数组。
            
    public static int[] copyOfRange(int[] original, int from, int to)
        --> 拷贝指定范围元素的数组
            original:被拷贝的数组。from:从哪个位置开始拷贝(包含)。to:拷贝到那个位置结束(不包含) 
            
    System.arraycopy(src, srcPos, dest, destPos, length)
        --> 拷贝数组
            src:源数组,需要被拷贝的数组。 srcPos:从源数组哪个位置开始拷贝。dest:目标数组,拷贝之后的数组。 destPos:把元素拷贝到目标数组的哪个位置开始。 length:需要拷贝的长度
            
    public static void fill(int[] a, int val)
        --> 数组元素填充
        
    public static boolean equals(int[] a, int[] a2)
        --> 判断两个数组的内容是否相同
            如果相同则返回true,如果不相同则返回false

8.main方法的形参(了解)

8.1执行程序的时候,如何给main方法传递实参???

      方式一:通过DOS命名传递实参   
       java MainArgsTest abc 111 ddd    
      方式二:通过Eclipse来传递实参
            鼠标右键 --> Run As --> java config...  --> arguments   --> 填写参数

8.2给main方法传递实参的作用???

    需求:实现两个文件的拷贝操作。
    解决:需要两个文件的路径,其中一个就是需要拷贝文件的路径,另外一个就是文件拷贝到哪里去的路径。
        怎么得到两个文件的地址???可以通过给main方法传递实参。

8.3main方法的注意事项

    作用:是程序的入口,写法固定,能被虚拟机识别并执行。
    现实开发中,我们能够手动的去调用main方法吗???  不能。

9.可变参数

需求1:实现两个整数的加法运算
​
需求2:实现三个整数的加法运算
​
需求3:实现多个整数的加法运算,至少有两个以上的整数参与
解决1:方法的参数中包含一个int类型的数组。
        虽然能解决问题,但是还是有缺陷。
解决2:使用可变参数来实现。
​
1.方法的可变参数语法
      方法的声明:public static int add(int a, int b, int ... arr) {}
      方法的调用: add(1, 2, 3, 4, 5, 6, 7);
2.可变参数的注意点
      a)在方法体中,可变参数可以当成数组的方式来操作。
      b)调用可变参数方法的时候,传递的实参可以是任意多个,只需要实参和可变参数的类型匹配即可。
      c)在一个方法中,最多只能有一个可变参数(0, 1),并且可变参数必须放在形参列表的末尾。  
      d)public static int add(int a, int b, int[] arr) {}
        public static int add(int a, int b, int ... arr) {} 不构成方法重载!
​
​

10.二维数组

10.1什么是二维数组??

  二维数组中的每个元素又是一个一维数组 。
  {1, 2, 3}  --> 一维数组   
​
  {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}} --> 二维数组

10.2.二维数组的声明

   方式一:数据类型[][] 变量名; 
        int[][]  arr1;
      String[][] arr2;
   方式二:数据类型[]  变量名[]; 
        int[]   arr1[]; 
      String[]  arr2[]; 
​
  建议:声明二维数组的时候,建议使用第一个方式来声明。

10.3.二维数组的创建

  方式一:创建等长的二维数组,二维数组中的每一个元素(一维数组)元素个数一样多。  
        语法:数据类型[][] 变量名 = new 数据类型[m][n];
        m:代表二维数组的长度,也就是指的二维数组中包含了多少个一维数组
        n:代表二维数组中的每个元素(一维数组)的元素个数,也就是代表一维数组的长度。
        
  方式二:创建不等长的二维数组, 二维数组中的每一个元素(一维数组)元素个数可以不一样
       语法:数据类型[][] 变量名 = new 数据类型[m][];
        m:代表二维数组的长度,也就是指的二维数组中包含了多少个一维数组
        什么时候决定元素(一维数组)的空间长度???赋值的时候来决定
        
  方式三:静态二维数组   
    语法1:数据类型[][] 变量名 = new 数据类型[][]{{数据01, 数据02, 数据03, ...}, {数据11, 数据12, 数据13,}, ...};
    语法2:数据类型[][] 变量名 = {{数据01, 数据02, 数据03, ...}, {数据11, 数据12, 数据13,}, ...};     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一段Arduino代码,用于控制一个RFID读卡器。下面是对每一行代码的解释: ``` #include <SoftwareSerial.h> // 引入软串口库 SoftwareSerial rfid(D2, D3); // 创建一个名为rfid的软串口对象,用于与RFID读卡器进行通信 void setup() { Serial.begin(9600); // 打开硬串口,用于与电脑进行通信 rfid.begin(9600); // 打开软串口,用于与RFID读卡器进行通信 pinMode(D5,OUTPUT); // 设置数字5口输出模式 } void loop() { String aa=""; // 定义一个空字符串,用于存储读卡器读到的卡号 String info[10]; // 定义一个字符串数组,用于存储读卡器读到的数据 digitalWrite(D5,HIGH); // 将数字5口电平设为高电平,用于控制一个继电器 for(int i=0;i<10;i++){ // 循环读取RFID读卡器10次 if (rfid.available()) { // 如果读卡器有数据传输 byte data = rfid.read(); // 读取读卡器传输的数据 if (data != 0x00) { // 如果读卡器传输的数据不是0x00 String hexStr = String(data, HEX); // 将读到的数据转换成十六进制字符串 info[i]=hexStr; // 将读到的数据存入字符串数组中 Serial.print(hexStr); // 将读到的数据打印到串口监视器中 } } } for(int u=0;u<10;u++){ // 将读到的数据连接成一个字符串 aa.concat(info[u]); Serial.println(aa); // 打印连接后的字符串 } if(aa == "4c23044a85ce" || aa == "4c23044a85ce73b3"){ // 如果读到的卡号符合要求 Serial.println("UNLOCK"); // 打印"UNLOCK" digitalWrite(D5,LOW); // 将数字5口电平设为低电平,控制继电器断开 delay(5000); // 延时5秒 digitalWrite(D5,HIGH); // 将数字5口电平设为高电平,控制继电器闭合 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值