java学习日志-10
数组+排序+查找
数组
数组是一种类型
创建
创建方法分为 动态初始化 和 静态初始化
1.先定义数组后引用数组( 直接分配 空间)
//下面是两种写法 |
2.先声明数组后创建数组(先声明一个名字,后面具体使用再分配空间)
// 同样是两种方法 |
3.补充一种初始化方法
String str[] = new String[]{"a","b","c"}; |
注意事项及细节
数组是多个 相同类型 的数据的组合,实现堆这些数据的统一管理(自动类型转换可以用)
数组中的元素可以是 基本数据类型 和 引用数据类型 ,但 不能混用 。
数组创建后没有赋值时,默认值有:
int 0;short 0,byte 0,long 0,float 0.0,double 0.0,char \u0000,boolean false,String null使用数组的步骤: 声明数组 并且开辟空间,给数组各个元素 赋值 ,使用数组
数组 下标0 开始,数组的 大小/长度-1 结束。末位的数组元素下标 不等于 数组长度。
数组必须在指定范围内使用,否则会爆出 下标越界异常 (编译为class文件时是不会爆出这个异常的)
数组属于 引用型 ,数组数据类型是对象(object)
数组赋值机制
数组默认使用 引用传递 ,从内存角度来讲,数组的元素放在堆当中,在栈中仅仅只是存储了它的 地址 。
例如 int arr1[] = {1,2,3} ; int[] arr2 = arr1 表示的是arr2和arr1拷贝了相同的地址,共享了数组,两者改变元素时会同时改变数组的元素。
也即是说,两者不能使用变量赋值的那种值传递/值拷贝,只能拷贝 相同的地址 操作 相同的数组 ,这在Python当中也称为浅拷贝。
补充:JVM的内存:堆+栈+方法区
排序
排序时将多个数据按照 指定顺序排列 的过程。
分类(后面有详细解析)
- 内部排序 :指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
- 外部排序 :数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
冒泡排序简述
两两互相比较,谁大谁向右边移动。(反过来也可以,这是观察出来的。)
观察结果:
数组大小为5时,
数组第1次交换5-1次 4
数组第2次交换5-2次 3
数组第3次交换5-3次 2
数组第4次交换5-4次 1
整体交换了4次,每次的子交换逐级递减。
每一轮排序确定一个最大数,确定完成后的最大数不参与排序。
每一轮因为减少一个最大数,排序的方式也就逐级递减。
查找()
- 顺序查找
按个查找- 二分查找
数组必须有序,先看中间数,
预加入数值>中间数 向中间数右边查找
预加入数值<中间数 向中间数左边查找
(算法处讲解)
多维数组-二维数组
- 概述 :二维数组的每一个元素都是一维数组,所以不能出现除了数组和null外的其他类型.
- 使用方式 :
下面是所有的初始化方法
// 1.动态初始化(直接创建) |
二维数组在内存的存在形式
假设有这么一个数组:
int[][] arr = {{1,2,3},{4,5,6}}; |
内存区域当中,分为三个区域:栈/堆/方法
数组先在栈当中新建一个记录,指向堆当中的一个一维数组,但一维数组内的两个值是一个堆地址,指向的是二维的堆地址。
注意事项
- 声明方式:
int[] y[][]/int[] y[]/int y[][](三种方式) |
- 数组组成:多个一位数组组成,各维度长度可相同可不同
- 列数不等二维数组:顾名思义,列数不相等