2020-10-15

基础篇数组笔记
数组数组的概念 1. 数组的父类是Object 2. 数组一旦创建,长度不可变 3. 数组是一种引用数据类型,所以数组对象是存储在堆内存当中的 4. 数组中可以存储基本数据类型的数据,也可以存储引用数据类型的数据 5. 对于数组当中存储的是Java对象的话,实际上存储的是对象的引用(内存地址) 6. 数组中的元素类型要统一。比如int类型数组只能存储int类型,Person类型数组只能存储Person类型。或者是它的子类型对象 7. 所有的数组对象都有length属性,用来获取数组中元素的个数 8. 数组在内存方面存储的时候,数组中的元素内存地址是连续的。数组实际上是一种简单的数据结构 9. 所有的数组都是拿第一个元素的内存地址作为整个数组对象的内存地址 10. 数组中每个元素都有下标的,下标从0开始,以1递增,最后一位元素的下标 = length - 1 11. 对于数组中最后一个元素的增删,是没有效率的影响的,因为不涉及到元素偏移 12.父类型数组可以存储子类型对象。多态应用数组数据结构的优缺点 优点: 查询某个下标上的元素时效率极高 原因: 1. 每个元素的内存地址在空间存储上是连续的 2. 每个元素的类型相同,所以占用空间大小一样 3. 知道第一个元素内存地址,每一个元素占用空间的大小,元素下标,所以可以计算出某个下标元素的内存的地址,直接通过内存地址定位元素,所以数组的检索效率是最高的 4. 数组中存储100个元素,和存储100万个元素,在元素查询效率方面是相同的。因为都是通过数学计算公式得出的 缺点: 1. 因为为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低(元素的偏移) 2. 数组不能存储大数据量,因为很难在内存空间中找到一块特别大的连续的内存空间 原因: 因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作数组的分类 一维数组 动态初始化:int[] a = new int[5] ; 初始化一个5长度的int类型数组,每个元素的默认值为0 静态初始化:int[] a = {100, 200, 300}; 一维数组遍历:一个for循环 二维数组 动态初始化:int[][] a2 = new int[3][4]; 静态初始化:int[][] a2 = {{1, 2, 3},{4, 5, 6},{7, 8, 9}}; 二维数组遍历:for循环嵌套for循环 将二维数组作为参数传入的2种方法 int[][] a = {{1, 2, 3, 4},{6, 7, 8, 9},{12, 3, 6}}; m(a); m(new int[][]{{1, 2, 3, 4},{6, 7, 8, 9},{12, 3, 6}}); 三维数组,多维数组 采用动态初始化和静态初始化创建数组的时机: 创建数组的时候,确定数组中存储哪些具体的元素时,采用静态初始化方式 创建数组的时候,不确定将来数组中存储哪些数据,采用动态初始化的方式,预先分配内存空间 数组的读与写 比较简单,不再赘述数组的作用 1. 方法的入参可以为数组 定义:public static void m(int[] i){} 调用:m(new int[] {1, 2, 3}); 直接传递一个静态数组 m(new int[3]); 直接传递一个动态数组 int[] a = {1, 2, 3}; 分步传递一个数组 int[] b = new int[3]; m(a); m(b); 实例: public static void main(String[] args) {}: main方法上面的String[] args数组主要是用来接收用户输入参数的。一开始String[]数组是空的 用户在控制台上输入参数的,这些参数会自动转换转换成String类型存储到String[]数组中。 举个例子:java ArrayTest05 abc def xyz 这个时候JVM会自动将abc def xyz通过空格的方式分离,分离完成之后,自动放到"String[] args"数组当中 把abc def xyz转换成字符串数组:{“abc”, “def”, “xyz”} 调用String[]数组里的数据:String s = args[i];数组扩容 概念 1)在Java开发中,数组长度一旦确定不可变。如果数组满了,需要扩容。 2)数组扩容原理:先新建一个大容量数组,然后将小容量数组中的数据一个一个拷贝到大数组当中 结论:数组扩容效率较低。因为涉及到拷贝问题 3)数组拷贝 创建拷贝源对象 int[] src = {1, 22, 3, 44, 5}; 创建拷贝目标对象 int[] dest = new int[10]; 调用JDK System类中的arraycopy方法,来完成数组的拷贝 System.arraycopy(src, int a, dest, int b, int length); //将指定源数组中的数组从指定位置复制到目标数组的指定位置常见的算法 排序算法 冒泡排序算法 拿着相邻的两个元素进行比较,如果左边>右边,则交换位置 该算法的运算效率最低 选择排序算法 每一次从这堆“参与比较的数据当中”找出最小值,拿着这个最小值和最前面的元素交换位置 选择排序比冒泡排序的运算效率高。高在交换位置的次数上,交换次数比冒泡排序的交换次数少 查找算法 二分法查找 二分法查找算法是基于排序的基础之上(没有排序的数据是无法查找的) 该算法的运算效率最高 以上三种算法原理需见代码 Java中提供了一个数组工具类:java.util.Arrays。工具类中的方法大多数都是静态的 Arrays是一个工具类。其中有一个sort()方法,可以用于从小到大排序,静态方法,直接使用类名调用即可 Arrays.sort(arr); 数组元素的二分法查找 int index = Arrays.binarySearch(arr, 5); //元素没查找到返回的不是-1。是因为源码的return返回值是这么写的:-(low + 1); //如果元素没查找到return总的返回值为-1 //5为数组中要查找的元素 数组元素查找有2种方式 1. 一个一个的查找,直到找到为止 for循环依次检索数组的每个下标 2. 二分法算法查找,这个效率高 每次都对半查找,直到找到元素为止

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 SQL 语句,用于向借阅表中插入数据。该表包含以下字段:借阅编号、读者编号、书籍编号、借阅日期、归还日期、借阅状态。每条数据表示一次借阅记录。其中借阅编号、读者编号、书籍编号、借阅日期和借阅状态是必填项,归还日期为可选项,如果借阅状态为“已还”则必须填写归还日期。 具体插入的数据如下: - 借阅编号:100001,读者编号:123413,书籍编号:0001,借阅日期:2020-11-05,归还日期:NULL,借阅状态:借阅 - 借阅编号:100002,读者编号:223411,书籍编号:0002,借阅日期:2020-9-28,归还日期:2020-10-13,借阅状态:已还 - 借阅编号:100003,读者编号:321123,书籍编号:1001,借阅日期:2020-7-01,归还日期:NULL,借阅状态:过期 - 借阅编号:100004,读者编号:321124,书籍编号:2001,借阅日期:2020-10-09,归还日期:2020-10-14,借阅状态:已还 - 借阅编号:100005,读者编号:321124,书籍编号:0001,借阅日期:2020-10-15,归还日期:NULL,借阅状态:借阅 - 借阅编号:100006,读者编号:223411,书籍编号:2001,借阅日期:2020-10-16,归还日期:NULL,借阅状态:借阅 - 借阅编号:100007,读者编号:411111,书籍编号:1002,借阅日期:2020-9-01,归还日期:2020-9-24,借阅状态:已还 - 借阅编号:100008,读者编号:411111,书籍编号:0001,借阅日期:2020-9-25,归还日期:NULL,借阅状态:借阅 - 借阅编号:100009,读者编号:411111,书籍编号:1001,借阅日期:2020-10-08,归还日期:NULL,借阅状态:借阅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值