Java学习笔记:数组

数组:
1,Java语言中的数组是一种引用类型,不属于基本数据类型,数组的父类是Object。
2,数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合。)
数组:字面意思是“一组数据”;
3,数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据。
4,数组因为是引用类型,所以数组对象是堆内存当中。
5,数组当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”
Java学习笔记:数组_第1张图片
6,数组一旦创建,在Java中规定,长度不可变。
7,数组分类:一维数组,二维数组。。。
8,所有数组对象都有Lenth属性,用来获取数组中的元素个数。
9,java中数组要求元素类型统一。比如int类型数组只能存储int类型。
10,数组在内存中存储的元素内存地址是连续的。
11,所有的数组都是利用栈中的内存地址作为整个数组对象的内存地址。
(栈中的内存地址是每个数组对象的地址)
12,数组中每一个元素都是有下标的,下标从0开始,以1递增。
13,数组这种数据结构的优点和缺点是什么?
优点:可以通过下标和存储类型计算出具体元素位置,检索效率高。
缺点:数组在随机删,增元素操作时效率低,因为需要移动大量元素,并且数组无法存储大数据量,无法存储不同类型元素数据。
14,怎么声明/定义一个一维数组?
语法格式:

int[ ] array1;
double[ ] array2;
boolean[ ] array3;
String[ ] array4;
Object[ ] array5;

15,怎样初始化一个一维数组呢?
包括两种方式:静态初始化一维数组,动态初始化一维数组。
静态初始化语法格式:

int[ ] array = (100, 2100, 300, 55);

动态初始化语法格式:

int[ ] array = new int[5];//表示5个元素类型为int元素个数,默认值为0
String[ ] name = new String[6];//表示6个元素类型为String元素个数,默认值为null

public class Arraytest01 {
     
    public static void main(String[] args){
     
       //静态初始化
       int[] a = {
     1, 100, 10, 20, 55, 689};
       String[] a = {
     "sds", "sss"};
       //动态初始化
       Object[] o = new Object[3];
       //存储Object,采用静态初始化
       Object o1 = new Object();
       Object o2 = new Object();
       Object o3 = new Object();
       Object[] objects = {
     o1, o2, o3};  
         //与以下等同
       Object[] objects = {
     new Object(), new Object(), new Object()};
    }

}

16,通过方法使用数组

public class ShuZhu {
     
    public static void main(String[] args){
     
        int[] a = {
     1,23,4,5};
        PrintArray(a);

        String[] m = {
     "213", "22", "33", "44"};

        PrintArray(m);
        PrintArray(new int[4]);

        String[] d = new String[4];
        PrintArray(d);
    }

    public static void PrintArray(int[] array){
     
        for(int i=0; i<array.length; i++){
     
            System.out.println(array[i]);
        }
    }

    public static void PrintArray(String[] array){
     
        for(int i=0; i<array.length; i++){
     
            System.out.println(array[i]);
        }
    }
}

17,main方法上面的“String[ ] args” 有什么用?
分析以下:谁负责调用main方法(JVM)
JVM调用main方法的时候,会自动传一个String数组过来。

public class Shuzhu {
     
    public static void main(String[] args){
     
       //JVM默认传递过来的这个数组对象的长度?默认为0.
        System.out.println("JVM给传递过来的String数组参数,它这个数组的长度是?"+args.length);
        //这个数组什么时候有值呢?
       //其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数自动被转换为“String[] args”
       //例如这样运行程序 :java ShuZhu abc def xyz
       //那么这个时候JVM会自动将“abc def xys”通过空格的方式进行分离,分离完成之后,自动放到“String[] args”
       //所以main方法上面的String[] args 数组主要是用来接收用户输入参数的。
       //把abc def xyz 转换成字符串数组:{“abc”,“def”,“xyz”};

        for(int i=0; i<args.length; i++){
     
            System.out.println(args[i]);
        }
    }
}

模拟一个系统,假设这个系统要使用,必须输入用户名和密码。

public class ShuZhu {
     
    //用户名和密码输入String[] args数组当中.
    public static void main(String[] args){
     
        if(args.length!=2){
     
            System.out.println("使用该系统时请输入程序参数,参数中包括用户名和密码信息,例如:zhang 123");
            return;
        }
        //程序执行到此处说明用户确实提供了用户名和密码。
        //接下来你应该判断用户名和密码是否正确。
        //取出用户名
        String username = args[0];
        //取出密码
        String password = args[1];

        //假设用户名是admin ,密码是123的时候表示登录成功。其他一律失败。
        //判断两个字符串是否相等,需要使用equals方法。
        if("admin".equals(username)&&"123".equals(password) ){
     
            System.out.println("登录成功,欢迎["+username+"]回来");
            System.out.println("使用该系统...");
        }else{
     
            System.out.println("验证失败,用户名不存在或者密码错误 !");
        }
    }
}

使用idea,点击中run下的edit configurations选项,在program arguments中输入需要传入agrs数组中的数据(用户名和密码),显示以下结果。
在这里插入图片描述

18,数组中存储引用类型数据
在不同类中,应该注意Animal[ ] 与 Animal 类型的区别。

public class ShuZhu {
     
    public static void main(String[] args){
     

         Animal a1 = new Animal();
         Animal a2 = new Animal();

         Animal[] a = {
     a1, a2};
         for(int i=0; i<a.length ; i++){
     
             Animal m = a[i];
             m.move();
         }
    }
}

class Animal
{
     
    public void move(){
     
        System.out.println("Animal move...");
    }

}

调用对象特有方法的话,需要向下转型!!!

public class ShuZhu {
     
    public static void main(String[] args){
     

         Animal a1 = new Cat();
         Animal a2 = new Bird();

         Animal[] a = {
     a1, a2};
         for(int i=0; i<a.length ; i++){
     
              if(a[i] instanceof Cat){
     
                  Cat m = (Cat)a[i];
                  m.catCatchMouse() ;
              }else if(a[i] instanceof Bird){
     
                  Bird m = (Bird)a[i];
                  m.birdFlying() ;
              }else{
     
                  System.out.println("error");
              }
         }

    }
}

class Animal
{
     
    public void move(){
     
        System.out.println("Animal move...");
    }
}

class Cat extends Animal{
     
    public void move(){
     
        System.out.println("cat moving...");
    }
    //特有属性 猫捉老鼠
    public void catCatchMouse(){
     
        System.out.println("猫捉老鼠");
    }
}

class Bird extends Animal{
     
    public void move(){
     
        System.out.println("bird moving...");
    }
    //特有属性 鸟在飞
    public void birdFlying(){
     
        System.out.println("鸟在飞");
    }
}

19,数组的扩容
数组满了,需要扩容,java先创建一个大容量的数组,然后一个一个将原来的数组元素拷贝入大数组中。

public class ShuZhu {
     
    public static void main(String[] args){
     
        //拷贝源
        int[] src = {
     1, 2, 3};
       //拷贝目标
        int[] dest = new int[6];
       //从src数组第1号元素拷贝到dest数组中3号位置,长度为2
        System.arraycopy(src, 1, dest, 3, 2);
        for(int i=0; i<dest.length; i++){
     
            System.out.println(dest[i]);
        }
      //以下为全拷贝方式
        System.arraycopy(src, 0, dest, 0, src.length);
    }
}

你可能感兴趣的:(JAVA,java)