Day09&Day10
数组
数组:是相同类型数据的有序集合 数组秒速的是相同类型的若干个数据,按照一定的先后次序排列组合 去只不过,每一个数据称作一个数组元素,每个数组元素可以通过一个下表来访问他们(数组的下标是从0开始的)
数组声明创建:
首先必须声明数组变量,才能在程序中使用,下面是声明数组变量的语法:
dataType[] arrayRefvar; //首选方法
或者
dataType arrayRefvar[]; //效果相同,但不是首选
java语言使用new操作符来创建数组,语法如下java语言使用new操作符来创建数组,语法如下
```java
dataType[] arrayARefcar= new dataType[arraySize]
package com.Array;
public class Demo01 {
//变量的类型 变量的名字 =变量的值
public static void main(String[] args) {
int nums2[]; //1.声明一个数组;方便c语言的读写,不推荐
int[] nums = new int[10];// 2.nums = new int[a],创建一个数组,分配空间
/*
nums = new int[a];在此给nums进行赋值,a表示数组空间大小
然后这一组数只有一个名字nums,然后自动带下标,下标从0开始
*/
//3.给数组元素赋值
nums[0]=1;
nums[1]=2;
nums[2]=3;
nums[3]=4;
nums[4]=5;
nums[5]=6;
nums[6]=7;
nums[7]=7;
nums[8]=90;
nums[9]=8;
System.out.println(nums[9]);//取值
//计算所有数组的和
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum =sum+nums[i];
}
System.out.println("总和为:"+sum);
}
}
数组的元素是通过索引访问的,数组索引从0开始 获取数组的长度: arrays.Length
数组的四个基本特点
-
其长度是 确定的,数组一旦被创建,他的大小就是不可以改变 的
-
其 元素 必须是 相同类型,不允许出现 混合类型
-
数组 中的元素 可以 是 任何数据类型,包括基本类型 和 引用类型
-
数组变量属于引用类型 ,数组 也可以 看成是 对象,数组中的每个元素相当于该对象的成员变量
-
数组本身就是 对象 ,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
数组边界: 下标的合法区间:【0,Length-1】,如果越界就会报错
内存分析
Java内存分析:
堆:存放new的 对象和数组,可以被 所有线程共享,不会存放别 的对象引用 栈:存放基本变量类型(会包含这个基本类型的具体数量) 引用对象的变量(会存放这个引用在堆里具体位置) 方法区 :可以被 所有的线程共享 包含了所以的class和static变量
三种初始化
静态初始化: 动态初始化: 数组的默认初始化:数组 是引用类型,他的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化
package com.Array;
public class Demo02 {
public static void main(String[] args) {
//静态初始化:创建+赋值
int[] a={12,3,4,5};
//动态初始化:包含默认初始化
int[] b=new int [10];
b[0]=2;
}
}
数组的使用
For-Each循环
数组方法入参
数组作为返回值
package com.Array;
public class Demo04 {
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5};
printArray(arrays); //打印1
System.out.println(); //换行
int[] reverse = reverse(arrays);
printArray(reverse); //打印2
System.out.println();
//JDK1.5之后才有的 增强for循环 ,没有下标
//适合打印 输出,操作内部元素就不太适合
// for (int array : arrays) { //arrays.for加回车
// System.out.println(array);
// }
}
//打印数组元素
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]+" ");
}
return;
}
//反转
public static int[] reverse(int[] arrays) {
int[] result = new int[arrays.length];
//反转的操作
for (int i = 0, j = result.length - 1; i < arrays.length; i++, j--) {
result[j] = arrays[i];
System.out.println(result[j]);
}
return result;
}
}
多维数组
多维数组可以看成是数组的数组,比如二位数组就是一个特殊的一维数组,其 每个元素都是一个一维数组
二维数组:
int a[][]= new int int[2][5];
解析:以上 二维数组a可以看成一个2行5列的数组
思考:多维数组的使用
package com.Array;
public class Demo05 {
public static void main(String[] args) {
//[4][2]
/*
*/
int [][] array={{1,2},{2,3},{3,4},{4,5}};
printArray(array[0]);//1 2
System.out.println();//
System.out.println(array[0][1]);//2
System.out.println(array.length);//4
System.out.println(array[0].length);//2
for (int i = 0; i < array.length; i++) {
for (int i1 = 0; i1 < array[i].length; i1++) {
System.out.print(array[i][i1]+" ");
}
}
}
//打印数组元素
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]+" ");
}
return;
}
}
Arrays类
数组的工具类 java.util.Arrays Arrays类 中的方法都是static修饰的静态方法,在使用的 时候可以 直接使用类名 进行 调用 ,而不用使用对象来调用 常用的一下功能;
-
给是数组赋值:通过fill方法
-
对数组排序:通过sort方法。升序
-
比较数组:通过equals方法比较数组中的元素是否相等
-
查找数组元素:通过binarSearch方法能对排序号的数组进行二分查找法操作
package com.Array;
import java.lang.reflect.Array;
import java.util.Arrays;
public class Demo06 {
public static void main(String[] args) {
int[] a ={1,4,4,456,43645,434,};
System.out.println(a);//会输出一个对象
//打印数组元素
System.out.println(Arrays.toString(a));
printArray(a);
System.out.println();
//排序.升序
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//fill填充方法//再次表示为第二个元素到第四个元素直接填充0
Arrays.fill(a,2,4,0);
System.out.println(Arrays.toString(a));
}
//自己写的 toString方法
public static void printArray(int[] a){
for (int i = 0; i < a.length; i++) {
if (i==0){
System.out.print("[");
}if (i==a.length-1){
System.out.print("]");
}else
System.out.print(a[i]+",");
}
}
}
冒泡排序
冒泡排序总共 有 八大排序 比较简单,两层循环,外层 冒泡轮数,内层 一次比较 我们看到 嵌套循环们可以得出这个算法的时间复杂度为O(n2);
package com.Array;
//,冒泡排序
import java.lang.reflect.Array;
import java.util.Arrays;
public class Demo07 {
public static void main(String[] args) {
int[] a={12,345,4564,456,57,23,234,2};
sort(a); //调用完我们自己写的排序方法以后,返回一个排序后的数组
System.out.println(Arrays.toString(a));
}
/*
思路:
1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
2.每一次比较,都会产生一个最大和最小的值
3.下一轮循环则可以减少一次排序
4.依次循环,知道结束
*/
public static void sort(int[] array){
int temp=0;
//外出循环:判断我们这个要走多少次
for (int i = 0; i < array.length-1; i++) {
//内层循环,比较两个相邻的数,如果第一个比第二个数大,则交换位置
for (int i1 = 0; i1 < array.length-1-i; i1++) {
if (array[i1]<array[i1+1]){
temp=array[i1];
array[i1]=array[i1+1];
array[i1+1]=temp;
}
}
}
return ;
}
}
思考:如何 优化
稀疏数组
package com.Array;
//稀疏数组
public class Demo08 {
public static void main(String[] args) {
//创建一个二维数组 11*11 0:没有棋子 1:黑棋 2:白棋子
int[][] array1= new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//输出原始的 数组
System.out.println("输出原始数组");
//arrays.for
for (int[] ints : array1) {
//,遍历整个数组
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
// 转换成稀疏数组来进行保存
// 首先获取有效值的个数
int sum=0;
for (int i = 0; i < 11; i++) {
for (int i1 = 0; i1 < 11; i1++) {
if (array1[i][i1]!=0) {
sum++;
}
}
}
System.out.println("有效值个数为:"+sum);
//===========================================
//2.创建一个稀疏数组
int[][] array2=new int[sum+1][3];
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非零的值存放在稀疏数组中
int count=0;
for (int i = 0; i < array1.length; i++) {
for (int i1 = 0; i1 < array1[i].length; i1++) {
if (array1[i][i1]!=0){
count++;
array2[count][0]=i;
array2[count][1]=i+1;
array2[count][2]=