数组简直是太霸道了......
数组
学过C的我们都知道,数组是从0开始的,需要注意,但是不需要过多解释。
数组的长度,大小可以用:数组名.length
数组的使用
1.动态初始化
2.动态分配
第一种分配方法
第二种分配方法
先声明数组,再分配空间。
3.静态初始化
注意:
基本数据类型赋值是值传递,但是数组在默认情况下是引用传递,赋值赋的是地址。
数组拷贝
值传递和引用传递
这个话题就涉及到java运行更深层次的原理,大体原理与C语言相同,但是运行机制却不同。
这个是比较详细的介绍。
问:创建数组arr1,输入一些数字,再创建数组arr2,将arr1每个元素遍历拷贝到arr2对应位置中,arr1与arr2的地址一样吗?
答:不一样。
数组翻转
1.利用for循环和空变量进行翻转。(找规律)
2.逆序赋值
此时arr的地址就是arr2的地址。
数组扩容
当我们已经创建赋值了一个数组,但是因为需要,我们需要再次扩大数组的空间。
这个只是添加了一个,但是在实际应用中,我们需要的不只是一个。下面这个代码解决了单一的问题。
Scanner myScanner = new Scanner(System.in);
//初始化数组
int[] arr = {1,2,3};
do {
int[] arrNew = new int[arr.length + 1];
//遍历 arr 数组,依次将 arr 的元素拷贝到 arrNew 数组
for(int i = 0; i < arr.length; i++) {
arrNew[i] = arr[i];
}
System.out.println("请输入你要添加的元素");
int addNum = myScanner.nextInt();
//把 addNum 赋给 arrNew 最后一个元素
arrNew[arrNew.length - 1] = addNum;
//让 arr 指向 arrNew, arr = arrNew;
//输出 arr 看看效果
System.out.println("====arr 扩容后元素情况====");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
//问用户是否继续
System.out.println("是否继续添加 y/n");
char key = myScanner.next().charAt(0);
if( key == 'n') { //如果输入 n ,就结束
break;
}
}while(true);
System.out.println("你退出了添加...");
}
}
数组排序
排序是指将多个数据。依靠指定顺序进行排序。
1.内部排序
2.外部排序
408数据结构学习笔记——外部排序_考研外部排序笔记-CSDN博客
冒泡排序
冒泡排序是利用嵌套循环,进行内外层循环进行冒泡。
思路:
- 比较相邻的两个元素,如果第一个比第二个大(小),则交换他们位置。
- 对每一对相邻元素做上述的工作,从开始第一对到结尾的最后一对,则最后的元素应该会是最大(最小)的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每趟对越来越少的元素重复上面的步骤,直到没有任何一对元素需要交换。
我们需要进行好多次比较,然后就会占用很多空间。所以有很多优化方法可以减少我们占用的空间。
【排序算法】:冒泡排序及其三种优化(Java)_冒泡排序如何减少比较次数-CSDN博客
(这个很算法的冒泡排序很拓宽思路,但是得看好几次)
(这个适合新手看理解,上面的编程思想有些上高度)
排序的算法浓度很高,所以在这里我们先不过多涉及,在之后会有详细讲解。
查找
我觉得顺序就是利用for循环遍历之后利用if 判断。
这样会占用许多空间。
所以二分查找,我们从中间对半分,找有符合项的那部分,再对半分,进行循环,直到找到符合项。
字符串的比较
//定义一个字符串数组
String[] names = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
String findName = myScanner.next();
//遍历数组,逐一比较,如果有,则提示信息,并退出
//这里老师给大家一个编程思想/技巧, 一个经典的方法
int index = -1;
for(int i = 0; i < names.length; i++) {
//比较 字符串比较 equals, 如果要找到名字就是当前元素
if(findName.equals(names[i])) {
System.out.println("恭喜你找到 " + findName);
System.out.println("下标为= " + i);
//把 i 保存到 index
index = i;
break;//退出
}
}
if(index == -1) { //没有找到
System.out.println("sorry ,没有找到 " + findName);
}
}
}
equals函数。
多维数组(二维数组)

使用方法
1.动态初始化
2.动态初始化——列数不确定性
3.静态初始化
public class TwoDimensionalArray05 {
//编写一个 main 方法
public static void main(String[] args) {
/*
int arr[][]={{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和
思路
1. 遍历二维数组,并将各个值累计到 int sum
*/
int arr[][]= {{4,6},{1,4,5,7},{-2}};
int sum = 0;
for(int i = 0; i < arr.length; i++) {
//遍历每个一维数组
for(int j = 0; j < arr[i].length; j++) {
sum += arr[i][j];
}
}
System.out.println("sum=" + sum);
}
}
每个一维数组的个数都不相同。
例题:杨辉三角形
import java.util Scanner
public class Switch{
public static void main (String[] args){
Scanner myScanner = new Scannner(System.in);
int number = Scanner.nextInt();//读取三角形行数
int a[][] = new int [number][number];//给二维数组开辟新的空间
for(int x = 0;x < number;x++){
for (int y = 0;y < = x ;y++ ) {
if(y == 0||y == x){
a[x][y] = 1;
}else{
a[x][y] = a[x-1][y-1] + a[x-1][y];//我们发现规律用代码如上表示
}
//赋值完就输出
System.out.print(a[x][y] + " ");
}
//保证换行
System.out.println();
}
}
}
到目前为止我们都是对概念的学习,顺便学习一下最简单的编程思想。
我建议大家不要光看,看懂并不代表会打,你自己去思考思路,思考需要创建什么变量,需要用什么方法,然后再去实行,你就会发现你有很多看过却模糊遗忘的细节。都是看过的,但是却不会用,就是竹篮打水一场空。