JavaSE进阶384-398 一维数组

课程地址:https://www.bilibili.com/video/BV1Rx411876f?p=558
开始时间:2020-11-03

数组

数组对象是在堆内存中
数组本身是引用类型
可以存基本数据类型,也可以存引用数据类型,有点类似Python中的列表
数组存的是这些东西的地址
Python列表
但一旦确定了数组的数据类型,只能装同一类型的元素,这个和列表不同,这样的话算内存空间就好算了,因为每个数组元素占的空间都一样
在这里插入图片描述
数组一旦创建,长度不可变

所有数组对象都有length方法,可以求得数组中元素个数。

数组中元素的内存地址存着是物理连续的
以第一个内存地址作为整个数组的地址

    public static void main(String[] args) {
        
    }

String[]为字符串数组

数组下标从0开始计数,最后一个下标为length-1
优点:检索/查找/查询某个元素效率高
存一百个或者一百万个,在元素查询/检索,效率是相同的
因为数组元素查找不是一个个数的,而是进行计算的
在这里插入图片描述

缺点:保证了物理地址连续,所以随机在数组中增删元素的效率很低,随机增删会涉及到后面元素统一向前或向后位移的操作
也不能存储大数据量,因为很难再内存中找到一块特别大的连续空间
数组对最后一个元素的增删,效率没有影响

定义一个数组:
数据类型[] array1;

初始化一个数组
1.静态初始化:
int[] array={100,200,300};
2.动态初始化:
int[] array2=new int[5];

//C++方式
int array2[];

初始化五个长度的int数据类型,每个元素默认值为0

注意赋值用的是花括号,不是中括号
但读取的时候还是中括号
a[0] a[a.length-1]
单独拿出来赋值也是中括号
a[4]=4;

package Test;

public class Test01 {
    public static void main(String[] args) {
        int[] a = new int[4];
        for (int i = 0; i < a.length; i++) {
            System.out.println("数组中下标为" + i + "的元素是" + a[i]);
        }
    }
}

数组所要的内容很确定,静态生成
否则,动态生成

package Test;

public class Test01 {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        printarray(a);
        System.out.println("========");
        printarray(new int[5]);//也可以直接new进去
    }
    public static void printarray(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

由此可知

public static void main(String[] args)

main函数里面的这个数组,由程序员负责写出,JVM负责调用,JVM调用的时候一定有一个String数组传过来
传过来的默认长度为0
在这里插入图片描述
用户在控制台上输入参数,转换为数组

main方法String参数案例

package BUPT20201102;
//模拟一个系统,需要输入用户名和密码才能进入
public class ArrayTest02 {
    //用户名和密码输入到String[] args数组中
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("输入信息应该为 张三 123 这种类型");
            return;
        }
        //取出用户名和密码
        String name = args[0];
        String password = args[1];
        if (name.equals("admin") && password.equals("123")) {
            System.out.println("登录成功,欢迎" + name + "回来");
        } else {
            System.out.println("用户名不存在或密码不正确");
        }
    }
}

良好的程序风格

   if (name.equals("admin") && password.equals("123"))
   if ("admin".equals(name) && "123".equals(password))

可以避免空指针异常
编译的时候注意了,这个时候键入的数组信息用
run-edit configuration
在这里插入图片描述
键入的部分输入在program arguments里面
注意,在使用时要先运行一遍,才能在这个界面中找到该java类
这个操作等同于在cmd命令中键入
java ArrayTest01 admin 123
但是因为我的注释中写了很多中文,所以javac操作的时候需要编码一下
在这里插入图片描述

数组中存储引用数据类型

package BUPT20201102;

public class ArrayTest03 {
    public static void main(String[] args) {
        Animal A1 = new Animal();
        Animal A2 = new Animal();
        Animal[] animals = {A1, A2};
        for (int i = 0; i < animals.length; i++) {
            animals[i].move();
        }
        Animal[] ans = new Animal[3];
        ans[0] = new Animal();
        ans[1] = new Cat();
        ans[2] = new Bird();
        for (int i = 0; i < ans.length; i++) {
            ans[i].move();
            //取出来的有可能是Cat有可能是Bird
            //如果调用的是父类有的方法,不需要向下转型,直接调用
            if (ans[i] instanceof Cat) {
                Cat cat = (Cat) ans[i];
                cat.CatchMouse();
            } else if (ans[i] instanceof Bird) {
                Bird bird = (Bird) ans[i];
                bird.SingSong();
            }
        }
    }
}

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

class Product {

}

class Cat extends Animal {
    public void move() {
        System.out.println("猫在走猫步!!!");
    }

    public void CatchMouse() {
        System.out.println("抓老鼠!");
    }
}

class Bird extends Animal {
    public void move() {
        System.out.println("鸟在飞!!!");
    }

    public void SingSong() {
        System.out.println("鸟儿在歌唱");
    }
}

在这里插入图片描述

arraycopy

package BUPT.Test;

//Java数组扩容效率较低,实际上是从小数组复制拷贝到大数组中
//实际过程中尽量减少扩容操作
public class ArrayTest {
    public static void main(String[] args) {
        int src[]={11,22,3,4};
        int dest[]=new int[20];
        System.arraycopy(src,1,dest,3,2);
        //调用arraycopy方法来赋值
        //源数组,源数组下标,目标数组,目标数组下标,源数组长度
        for (int i = 0; i <dest.length ; i++) {
            System.out.println(dest[i]);
        }
    }

}

在这里插入图片描述
如果想完整拷贝

System.arraycopy(src,0,dest,3,src.length);

在这里插入图片描述

结束时间:2020-11-04

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值