Java数组学习

一、数组

1.认识数组

    1.什么是数组:数组是一个数据的集合,数组实际上是一个容器,可以同时容纳多个元素
    2.数组动态声明和静态声明
    3.数组可以存储基本数据类型也可以存储引用数据类型
    4.数组具有lentgth属性,并且数组一旦创建,长度不可变
    5.每个数组元素都有下标,从0开始
    6..数组元素的数据类型都一致,空间大小一致,存储空间连续
    7.数组的内存地址就是数组第一个元素的内存地址
    8.数组数据结构的优缺点:
优点:检索某个下标上的元素时效率极高,
缺点:在数组上元素存储时连续的,所以随机增加/删除元素效率较低,同时数组无法存储大数据量,因为很难找到这么大的空间
注意:对于数组最后一个元素的增删是没有效率影响到

2.为什么数组检索效率高?

1.每一个元素地址在空间上存储连续的
2.每一个元素类型相同,所以占用空间大小一样
3.知道第一个元素内存地址,知道每一个元素占用的空间大小,知道下标,就可以通过一个数字表达式计算出某一个下标上元素的内存地址,直接通过内存地址定位到这个元素,所以数组时检索效率最高的

3.图解析

4.数组使用

    1.数组的使用:
声明:int[] abc;
    2.初始化:
静态初始化:int[] abc = {1,2,3};
动态初始化:int[] abc = new int[5];
    3.数组访问:abc[4];
    4.数组下标越界异常:访问数组没有的下标,ArrayIndexOUtOfBoundsException
    5.数组遍历:for(int i = 0;i < abc.length;i++){}
倒序遍历:for(int i = abc.length-1;i>=0;i--){}

5.数组排序

    1.冒泡排序法(从小到大一次输出)
    从一个数开始两两比较,小的在前,大的在后,第一个对大的数冒出来
    找大数,外循环从length-1开始,比较之后交换位置
    2.选择排序
    对冒泡排序进行改进,交换次数减少,但是比较次数没有减少
    先使用下标为0的元素,对后面元素依次进行比较,找到较小元素进行替换。
    找小数,外循环从0开始,进行比较,较小数坐标不是i,则进行数据交换
    3.二分法查找(必须建立在已经排好序的前提下)
    数据与a[(startPos + endPos)/2]进行比较,
    使用while循环

6.Arrays工具类

    1.Object类
实例方法:toString
实例方法:equals
实例方法:clone
实例方法:finallize
实例方法:hashCode
    2.Arrays工具类:工具类都是静态方法
    String toString(数组):把数组里的数据,用逗号连接成一个字符串[值1,值2]
    asList:将数组转化为list集合
    binarySearch()二进制搜索数组中某一个KEY
    copyOf(数组,新长度):从0下标复制数组到另一指定长度数组
    copyOfRange()从指定范围复制数组
    重写了equals方法
    重写了toString方法,输出[1,2,3]
    void sort(数组);升序方法:对数组进行排序,对于基本类型的数组使用的是优化后的快速排序算法,效率高
对引用类型数组,使用的是优化后的合并排序算法
    Arrays.copyOf(数组,新的长度):把数组赋值成一个指定长度的新数组
新数组的长度 大于 原数组, 相当于复制,并增加位置
新数组的长度 小于 原数组, 相当于截取一部分数据
    copyOfRange()用于完成数组的截取,3个参数:
         * 参数1:要截取哪个数组【原数组】
         * 参数2:从原数组的哪个下标开始
         * 参数3:到原数组的哪个下标结束
         * 注意:截取的元素包含开始下标处的元素,不包含结束下标处的元素

7.当方法的参数是数组的时候

//这种创建方式没问题(C++的写法)
int a[] = [3,2,2]
​
doSome(a2);
doSome(new int[]{1,2,3})
doSome(new int[3]);

8.main方法的一维数组

//JVM传递过来的String类型的数组   长度为0;
//这个数组里面会有值吗?
//这个数组是留给用户的,用户在控制台上输入参数,这个参数自动转换成”String[] args“
//例如 运行程序中,输入java Text abc abc abc
//使用IDEA,运行中的编辑配置,程序参数输入abc abc abc
//JVM将abc abc abc以空格隔开转换成数组
​
//有什么用?
//模拟一个系统,系统需要输入账号密码

public class  A{
    public static void main(String[] args){
        //输入账号密码
        if(args.length!=2){
            System.out.println("登录错误");
            return;
        }
        //判断用户是否正确
        if(args[0].equals("admin") && args[1].equals("123"))
//建议使用下列判断
//不会出现空指针异常
//  if("admin".equals(args[0]) && "123".equals(args[1]))
            System.out.println("登录成功");
        else {
            System.out.println("123");
            return;}

​9.数组中存储的是引用数组类型和多态

    父类数组中可以存放子类的元素
Animal[] a1 = new Cat[6];

数组扩容

    //步骤:
    1.第一步,先新建一个大容量的数组
    2.第二部,将小数组存放到大数组中
    3.第三步,将数组取消掉
数组扩容效率较低,因为涉及拷贝,所以在开发中最好预估好容量
​
    //数组拷贝
System.arraycopy(src,srcPos:1, dest,destPos:2,length:2);
五个参数: 源(从哪拷贝) 起始位置  目标(拷贝到哪) 起始位置   拷贝长度

9.二维数组

二维数组是一个特殊的一维数组
​
三维数组是一个特殊的二维数组
​
    静态初始化:
int[][] a = {
    {1,2,3},
    {1},
    {1,2,3,4,5}
};
a[0];表示第一个一维数组
a[0][2];表示第一个一维数组的第一个元素
    
    动态初始化:
int[][] a = new int[3][4]
三行四列,3个一维数组,每个一维数组四个元素  

10.作业

编写程序:使用一维数组,模拟栈数据结构
要求:1.这个栈可以存储java中的任何引用数据类型
2.在栈中提供push方法模拟压栈(栈满了要求提示信息)
3.在栈中提供pop方法模拟弹栈(栈空了,有提示信息)
4.编写测试程序:new栈对象,调用push方法,pop方法模拟压栈和弹栈动作
package cn.edu.nuc.javase;
import java.util.Scanner;
public class  A{
    public static void main(String[] args){
    B b1 = new B(new Object[3]);
    Stack s1 =new Stack();
    b1.push("abc");
        b1.push("s1");
        b1.push("b1");
        b1.push("abc");
        b1.pop();
        b1.pop();
        b1.pop();
        b1.pop();
​
    }
​
}
package cn.edu.nuc.javase;
​
public class B extends Stack{
    public void push(Object obj){
        if (getStackPoint() >= element.length){
            System.out.println("此栈已满,压栈错误");
        }
        else {
            System.out.println(obj+"压栈成功");
            setStackPoint(getStackPoint()+1);
            element[getStackPoint()-1] = obj;
        }
    }
​
    @Override
    public void pop() {
        if (getStackPoint() == 0){
            System.out.println("此栈已空,弹栈错误");
        }
        else {
            System.out.println(element[getStackPoint()-1]+"弹栈成功");
            element[getStackPoint()-1] = null;
            setStackPoint(getStackPoint()-1);
        }
    }
​
    public B(Object[] element) {
        super(element);
    }
​
    public B() {
    }
}
​
package cn.edu.nuc.javase;
​
public class Stack {
    Object[] element;
    private int stackPoint = 0;
​
    public void push(Object obj){
    }
    public int getStackPoint() {
        return stackPoint;
    }
​
    public void setStackPoint(int stackPoint) {
        this.stackPoint = stackPoint;
    }
​
    public void pop(){}
    public Stack(Object[] element) {
        this.element = element;
    }
​
    public Stack() {
    }
}
 
为某个酒店编写程序:酒店管理系统,模拟订房,退房,打印所有房间状态等功能。
1该系统是酒店前台;
2.酒店中的所有房间使用一个二维数组来模拟。"Room[][] room"
3.酒店中的每一个房间应该是一个java对象:Room
4.每一个房间Room应该有:房间编号、房间类型属性、房间是否是空闲
​
5.一个Room有 房间号属性;房间类型;是否空闲
  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值