20200923 王维
学习总结
1.数组
定义 具有相同数据类型且按照一定的次序排列的一组变量的集合体,即用一个变量名表示一组数据。java为数组在内存中分配一段连续的空间,这段空间存储数据的个数是固定的。
数组元素 构成一个数据的每一个数据称为数组元素
数组下标 数组元素在数组中的位置,都是整数,从0开始,一次累加1
使用数组的步骤 ①定义数组②为数组元素分配内存③数组元素初始化④使用数组
定义数组
数据类型 数组名[];
数据类型[] 数组名;
推荐使用第二种方式,第一种方式容易搞混数组与普通变量
数组是什么数据类型,数组的元素就是什么数据类型。
数组数组的特征是[]
数组是引用数据类型,所以他的默认值是null
定义数组的本质就是向JVM申请内存。定义数组时,JVM将数组名称存储在栈中,栈是一个先进后出的数据结构,保存着数组元素的地址,数组元素保存在堆中。
为数组元素分配内存
声明一个变量时仅仅为数组指定了数组名称和元素类型,并未指定数组元素的个数,也没有为数组元素分配内存,即无法使用数组存储数据。
通过new运算符为数组元素分配内存空间
数组长度是在为数组元素分配内存时确定的,数组长度一旦确定,长度不可更改。
数组元素初始化
数组名[数组下标] = 值 给数组中的每个元素赋值
可以通过字面量的方式定义、分配内存和初始化数组
int[] n = {1,2,3,4,5};
int[] n = new int[]{1,2,3,4,5};
int[] n = {}; 空数组
如果没有为数组元素初始化,数组元素的值为数组元素类型的默认值
数组元素类型 | 默认初始值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | '\u0000' |
boolean | false |
引用数据类型 | null |
基本数据类型中存储的是真是的数据,引用类型的变量存储的是内存编号。
使用数组
数组可以使用foreach循环,jdk1.5增加
for(变量:被循环数组){
代码块
}
每一次循环都会讲被循环的变量的对应值赋值给变量
可以使用foreach的是数组、集合和实现iterable接口的类
排序
必须掌握冒泡排序、选择排序和快速排序,其中着重掌握快速排序
//冒泡排序
int[] score = {57 , 80 , 50 , 79 , 99};
//循环次数
for(int i = 1 ; i < score.length; i++) {
//遍历数元素
for(int j = 0; j < score.length - i; j++) {
//比较
if(score[j] > score[j + 1]) {
//交换
score[j] = score[j] ^ score[j + 1];
score[j + 1] = score[j] ^ score[j + 1];
score[j] = score[j] ^ score[j + 1];
}
}
}
for (int i : score) {
System.out.print(i + "\t");
}
//二分法查找0~100的任意数
Scanner input = new Scanner(System.in);
System.out.println("输入想查找的0~100的任意数字:");
int num = input.nextInt();
int low = 0, heigh = 100;
int n = 0;
while (low <= heigh) {
n++;
int temp = (low + heigh) >>> 1;
if(num < temp) {
heigh = temp - 1;
}else if (num > temp) {
low = temp + 1;
}else {
System.out.println(temp);
System.out.println(n);
break;
}
}
二维数组
数据类型[][] 数组名;
数据类型 数组名[][];
int[][] nums;
[][] 表示二维数组
java虽然支持多维数组,但是从内存分配原理的角度看,java只支持一维数组,或者说表面上是多维数组,实质上哈市一维数组,只是数组元素存储的值又是一个一维数组的引用。
2.Arrays类
java.util.Arrays 是数组的工具类,该类包含用于操作数组的各种方法(如排序和搜索)
方法名 | 返回值 | 说明 |
---|---|---|
equals(array a, array a2) | boolean | 比较两个数组是否相等 |
sort(array a) | void | 将指定数组升序排列 |
toString(array a) | String | 返回指定数组的内容的字符串表示形式 |
fill(array a, val) | void | 将指定的值分配给指定的数组的每个元素 |
copyOf(array,length) | new array | 复制指定数组的指定长度,如果长度大于原 数组长度,用数据类型默认值填充 |
binarySearch(array a, 值) | int | 使用二分搜索算法搜索指定值在目标数组中 的下标,使用前需要先将数组排序 |
binarySearch(array a, int fromIndex, int toIndex, 值) | int | 使用二分搜索算法搜索指定值在目标数组中 的下标,使用前需要先将数组排序 |
注意:
Arrays类使用static修饰,不使用new创建实例,可以直接使用类名.方法名()调用
Arrays.equals(array a, array a2)步骤:①判断引用是否一致②判断是否为null,对null,返回false③判断长度是否一致④判断数组中元素是否一致
Arrays.sort(array a) 使用的是快速排序
println(o)方法执行String.value(o);String.value(o)方法中会执行o.toString(),返回 类型名称+@+hash值(可以理解为地址)
Arrays.copyOf(array,length)类中调用的是System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Arrays.binarySearch()查找元素值下标,使用二分搜索,必须先排序
3.System类
System 类是 final 类不可能存在子类
System 类包含几个有用的类字段和方法。它不能被实例化。
System 类提供的 System 包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变 量; 一种加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将指定源数组中的数组从指定位置复制到目标数组的指定位置
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目的地数据中的起始位置。
length - 要复制的数组元素的数量
心得体会
对分治法的思想有了一定的了解,原来只是知道有二分法这样一个东西,能够使用,对他其中蕴含的思想并不了解。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
应用在二分法寻找我们想要的数中就是把这个数存在的范围无限切割缩小,直到找到这个数。
应用在快速排序中就是先确定一个基准数,再使用这个数进行分区,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边(挖坑填数)。最后再对分区重复前面的步骤,直到分区长度为0,左右边界相等。每个小区间都是规律的,即整个区间是规律的。
近期评论