Java学习11(数组)

Java学习11

和老师说做软件了,但是失败了

数组

  1. java语言中的数组是一个引用数据类型,不属于基本数据类型,数组的父类是Object

  2. 数组实际上是一个容器,可以容纳多个元素(数组是一个数据的集合)

  3. 数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据

  4. 数组因为是引用类型,所以数组对象是在堆内存中(数组存储在堆内存中)

  5. 对于数组当中,如果存储的是java对象的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象

  6. 数组一旦创建,在java中规定,长度不可变(数组长度不可变)
    7.数组的分类:一维数组、二维数组、三维数组、多维数组…(一维数组较多,二维数组偶尔使用)
    8.所有数组对象都有length属性(java自带的),用来获取数组中元素的个数

  7. java中的数组要求数组中元素的类型统一,比如int类型的数组只能存储int类型,数组中存储的元素类型统一

  8. 数组在内存方面存储的时候,数组中元素的内存地址(存储的每一个元素都是有规则的挨着排列的)是连续的。数组实际上是一种简单的数据结构

  9. 所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址。(数组中首元素的内存地址作为数组对象的内存地址)
    12.数组每一个元素都有下标,第一个是0,第二个是1…,最后一个元素的下标是:length-1,下标非常重要,因为我们对数组中元素进行存取的时候,都要以下标来进行
    13.数组这种数据结构的优点和缺点是什么?
    优点:查询/查找/检索某个下标上的元素时效率极高,可以说是查询效率最高的一个数据结构
    第一:每一个元素的内存地址在空间存储上是连续的
    第二:每一个元素类型相同,所以占用空间大小一样
    第三:知道每一个元素的内存地址,知道每一个元素占用空间大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址,直接通过内存地址定位元素,所以数组的检索效率是最高的
    缺点:1.由于为了保证数组中的每个元素的内存地址连续,所以在数组上随机删除或增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或向后位移的操作
    2.数组不能存储大数据量,因为很难在内存空间中找到一块特别大的连续的内存空间
    注意:对于数组中最后一个元素的增删,是没有效率影响的
    14.怎么声明/定义一个一维数组?
    语法格式:
    int[] array1;
    double[] array2;
    String[] array3;
    15.怎么初始化一个一维数组?
    静态初始化一维数组:
    int[] array = {100,2100,55};
    也可以 int array[]={1,2,3}; //C++风格,不建议
    动态初始化一维数组:
    int[] array = new int[5]; //这里5表示数组的元素个数,每个元素默认值0

    // Person类型数组,里面可以存储Person类型对象,以及Person类型的子类型都可以。
    Person[][] arr = new Person[2][2];

  10. 如果没有数组元素只有6个,而要取第七个,会报错:
    ArrayIndexOutOfBoundsException(数组下标越界异常)

  11. 什么时候动态初始化,什么时候静态初始化
    当创建数组的时候,确定数组中存储哪些具体的数据的时候,采用静态初始化的方式
    不确定存储哪些数据的时候,可以动态初始化的方式预先分配内存空间
    18.引用数据类型的每个元素的内存空间是4个字节

数组应用

main方法上的“String[] args”有什么用?
分析一下:谁负责调用main方法(JVM)
JVM调用main方法的时候,会自动传一个String数组过来
JVM默认传递过来的这个数组长度为0,不是null

那么这个数组什么时候会有值呢?
其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数会自动被转换为“String[] args”
例如这样运行程序: java ArrayTest02 abc def xyz
那么这个时候JVM会将字符串通过空格的方式进行分离,分离完成后,自动放到“String[] args”数组中,所以main方法上面的String[] args 数组主要是用来接收用户输入参数的

一维数组的扩容

在java开发中,数组长度一旦确定不可变,那么数组满了该怎么办?
数组满了,需要扩容
java中对数组的扩容是:
先新建一个大容量的数组,然后将小容量的数组中数据一个一个拷贝到大数组中,然后小数组对象被垃圾回收
所以数组扩容效率较低,因为涉及到拷贝的问题,所以在以后的开发中,尽量减少数组的拷贝

扩容需要的命令:(例子)
  int[] src = {1,11,22,3,4}; //源数组
  int[] dest = new int[20]; //目标数组
  System.arraycopy(src,1,dest,3,2); //第一个参数:源数组;第二个:拷贝起始位置;三:目标数组;四:目标位置;五:拷贝个数
  //拷贝完结果是在dest中,从第三个元素开始,0 0 11 22 0 0…

二维数组

  1. 二维数组是一个特殊的一维数组,特殊在这个一维数组当中的每一个元素都是一个一维数组。
  2. 三维数组是一个特殊的二维数组,特殊在这个二维数组中每一个元素都是一个二维数组
  3. 二维数组静态初始化:
    int[][] array = {{1,1,1},{2,3,4,5},{0,0,0,0}};
    注意这里二维数组中第二维的数组长度可以不一样
  4. 二维数组的length属性是 一维数组的个数; array.length = 3; array[0].length=3

常见的算法

  1. 排序算法:
     冒泡排序算法
     选择排序算法

  2. 查找算法:
     二分法查找

  3. 算法在java中不需要精通,因为在java中已经封装好了,要排序调用方法就行,例如:在java中提供了一个数组工具类:
      java.util.Arrays
      Arrays是一个工具类。工具类中的方法大部分都是静态的
      其中有一个sort()方法,可以排序。静态方法,直接用类型调用就可以了

1.冒泡排序法:
  相邻位置的数据比较,将较大的值放在右边;
  每循环一次,将最大的值放在最右边(冒出最大的气泡);
2.选择排序法:
  每一次从这堆参与比较的数据中找出最小值,拿着这个最小值和参与比较的最前面的元素交换位置
 选择排序比冒泡排序的效率高,高在交换位置的次数上
 关键在于:怎么找一堆数据中的最小的
 先假设最左面的元素最小,将其下标存储在临时变量中,然后分别与后面的元素进行比较,如果比这时的最小元素小,则下标变为该元素的下标;当比较完一轮后,将最小元素交换到最前面;
 因此交换次数等于元素个数减1

二分法查找
  1. 二分法查找是建立在排序的基础之上的
    2 .二分法查找效率要高于“一个一个找”的查找方式
  2. 二分法查找原理?
    10(下标为0)23 56 89 100 111 222 235 500 600(下标为9)
    目标找出600的下标:
    (0+9)/2=4;(中间元素的下标)
    arr[4]为100,由于100<600,说明被查找的元素在100的右边
    那么此时开始的下标变为:4+1
    (5+9)/2=7
    arr[7]为235

    4 .二分法查找的终止条件是:一直折半,直到中间的那个元素恰好是被查找的元素

可以调用java.util.Arrays中的binarySearch方法和sort方法对数组进行查找和排序;(查看帮助文档)
java.util.Arrays中的方法都是静态的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值