天天看点

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中的堆和栈(重点)

byte数组转double_0008.数组001
2.随堂练习及内存分析
a)获取10个学生的成绩,然后保存在数组中,最后计算学生的总分和平均分。  
           
byte数组转double_0008.数组001
byte数组转double_0008.数组001

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,}, ...};     
           

继续阅读