课程地址: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
用户在控制台上输入参数,转换为数组
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("鸟儿在歌唱");
}
}
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