文章目录

  • 数组快速入门
  • 数组的使用
    • 使用方式1 动态初始化
    • 使用方式2 动态初始化
    • 使用方式3 静态初始化
    • 数组使用注意事项和细节
  • 数组赋值机制
    • 数组翻转
    • 数组扩容
  • 排序的介绍
    • 冒泡排序法
    • 数组的查找
  • 二维数组的使用
    • 使用方式1:动态初始化
    • 使用方式2:动态初始化
    • 使用方式3:静态初始化
    • 案例1 计算二维数组的和
    • 案例2 打印10行杨辉三角
    • 二维数组使用细节和注意事项
    • 二维数组课堂练习
  • 本章作业

数组快速入门

为什么需要数组?

一个养鸡场有6只鸡,它们的体重分别是3kg, 5kg, 1kg, 3.4kg, 2kg, 50kg。请问这六只鸡的总体重是多少?平均体重是多少?请你编一个程序。

数组可以存放多个同一类型的数据。数组也是一种数据类型, 是引用类型。即:数组就是一组数据

public class Test {public static void main(String[] args) {double[] hens = {3, 5, 1, 3.4, 2, 50};// 可以通过hens[下标]来访问数组的数据double totalWeight = 0;int len = hens.length;for (int i = 0; i < len; i++) {totalWeight += hens[i];}System.out.println("平均体重=" + (totalWeight / len));}
}

数组的使用

使用方式1 动态初始化

数据类型数组名=new数据类型[大小]

int a[]=new int[5]; //创建了一个数组,名字a,存放5个int

数组的引用(使用/访问/获取数组元素)

数组名下标/索引]比如:你要使用a数组的第3个数a[2]

使用方式2 动态初始化

先声明数组
语法:数据类型数组名[];也可以数据类型[]数组名;
int a[];或者int[] a;

再创建数组
语法:数组名=new数据类型[大小];
a= new int[10];

使用方式3 静态初始化

初始化数组
语法:数据类型数组名[]= {元素值,元素值…}
int a[]= {2,5,6,7,8,89,90,34, 56},如果知道数组有多少元素,具体值
上面的用法相当于:

int a[]=new int[9];
a[0]= 2;a[1]=5;a[2]=6; a[3]=7;a[4]=8;a[5]= 89;a[6]=90;a[7]= 34;a[8]=56;

数组使用注意事项和细节

ArrayDetail.java
1.数组是多个相同类型数据的组合,实现对这些数据的统一管理
2.数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
3.数组创建后如果没有赋值有默认值int 0, short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000, boolean false, String null
4.使用数组的步骤1.声明数组并开辟空间2给数组各个元素赋值3使用数组
5.数组的下标是从0开始的。
6.数组下标必须在指定范围内使用,否则报下标越界异常,比如int[] arr= new int[5]; 则有效下标为0-4
7.数组属引用类型,数组型数据是对象(object)

请求出一个数组int[]的最大值{4,-1,9, 10,23}, 并得到对应的下标。

public class Test {public static void main(String[] args) {int[] arr = {4, -1, 9, 10, 23};int max = arr[0];// 假定第一个元素就是最大值int maxIndex = 0;for (int i = 1; i < arr.length; i++) {// 从下标1开始遍历arrif (max < arr[i]) {// 如果max < 当前元素max = arr[i]; // 把max设置成当前元素maxIndex = i;}}// 当我们遍历这个数组arr后, max就是真正的最大值,maxIndex最大值下标System.out.println("max=" + max + "\tmaxIndex=" + maxIndex);}
}

数组赋值机制

1 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。

int n1=2;
int n2=1;

2 数组在默认情况下是引用传递,赋的值是地址。 看一个案例,并分析数组赋值的内存图(重点)。

int[] arr1 = {1,2,3};
int[] arr2 = arr1;
public class Test {public static void main(String[] args) {// 基本数据类型赋值 赋值方式为值拷贝// n2的变化, 不会影响到n1的值int n1 = 10;int n2 = n1;n2 = 80;System.out.println("n1=" + n1);System.out.println("n2=" + n2);// 数组默认情况下是引用传递, 赋的值是地址, 赋值方式为引用传递// 是一个地址, arr2的变化会影响到arr1int[] arr1 = {1, 2, 3};int[] arr2 = arr1;arr2[0] = 7;System.out.println("arr1[0] = " + arr1[0]);}
}

那怎么完成数组的值拷贝呢?

public class Test {public static void main(String[] args) {int[] arr1 = {10, 20, 30};// 创建一个新的数组arr2// 大小为arr1int[] arr2 = new int[arr1.length];// 遍历arr1,把每个元素拷贝到arr2对应的位置for (int i = 0; i < arr1.length; i++) {arr2[i] = arr1[i];}//现在就是值拷贝了}
}

数组翻转

public class Test {public static void main(String[] args) {int[] arr = {11, 22, 33, 44, 55, 66};int[] arr2 = new int[arr.length];for (int i = arr.length - 1, j = 0; i >= 0; i--, j++) {arr2[j] = arr[i];}// 当for循环结束后,arr2就是一个逆序后的数组// 让arr指向arr2数据空间arr = arr2;}
}

数组扩容

public class Test {public static void main(String[] args) {int[] arr = {1, 2, 3};int[] arrNew = new int[arr.length + 1];// 遍历arr数组,依次将arr的元素拷贝到arrNew数组for (int i = 0; i < arr.length; i++) {arrNew[i] = arr[i];// 把4赋给arrNew最后一个元素arrNew[arrNew.length - 1] = 4;// 让arr指向arrNew, 原先arr被销毁arr = arrNew;}}
}

排序的介绍

排序是将多个数据,依指定的顺序进行排列的过程。
排序的分类:
1.内部排序: 指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
2.外部排序法: 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

冒泡排序法

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序席列从后向前(从下标较大的元素开始) ,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

下面我们举一个具体的案例来说明冒泡法。我们将五个无序: {24,69,80,57,13}\{24,69,80,57,13\}{24,69,80,57,13}使用冒泡排序法将其排成一个从小到大的有序数列。

public class Test {public static void main(String[] args) {int[] arr = {24, 69, 80, 57, 13};for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换顺序arr[j] = arr[j] ^ arr[j + 1];arr[j + 1] = arr[j] ^ arr[j + 1];arr[j] = arr[j] ^ arr[j + 1];}}}// 循环结束,咱们来瞅瞅for (int k = 0; k < arr.length; k++) {System.out.print(arr[k] + "\t");}}
}

数组的查找

介绍:

在java中,我们常用的查找有两种:
1.顺序查找SeqSearch.java
2.二分查找[二分法,我们放在算法讲解]

案例演示:

1.有一个数列:[白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王] 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称[顺序查找]要求: 如果找到了,就提示找到,并给出下标值。

import java.util.Scanner;public class Test {public static void main(String[] args) {// 有一个数列:[白眉鹰王,金毛狮王,紫衫龙王,青翼蝠王] // 猜数游戏:从键盘中任意输入一个名称,判断数列中是否包含此名称[顺序查找]要求: 如果找到了,就提示找到,并给出下标值。String[] kings = {"白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"};Scanner sc = new Scanner(System.in);int index = -1;String inputK = sc.next();for (int i = 0; i < kings.length; i++) {if (inputK.equals(kings[i])) {index = i;break;}}if (index >= 0) {System.out.println("找到了, index = " + index);} else {System.out.println("妹油找到! ");}}
}

2.请对一个有序数组进行二分查找{1,8, 10, 89, 1000, 1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

二维数组的使用

请用二维数组输出如下图形

0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0
public class Test {public static void main(String[] args) {int[][] arr = {{0, 0, 0, 0, 0, 0},{0, 0, 1, 0, 0, 0},{0, 2, 0, 3, 0, 0},{0, 0, 0, 0, 0, 0}};// 输出二维图形for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + "\t");}System.out.println();}}
}

使用方式1:动态初始化

1)语法:

类型[][]数组名=new 类型[大小][大小]

2)比如:

int a[][]=new int[2][3]

3)使用演示

public class Test {public static void main(String[] args) {int arr[][] = new int[2][3];// 遍历arr数组for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println();// 换行}}
}

4)二维数组在内存的存在形式

使用方式2:动态初始化

1)先声明:

类型 数组名[][];

2)再定义(开辟空间)

数组名 = new 类型[大小][大小];

3)赋值(有默认值,比如int 类型的就是0)

4)使用演示
使用方式3:动态初始化列数不确定

1)看一个需求: 动态创建下面二维数组, 并输出。

2)完成该案例

 public class Test {public static void main(String[] args) {int[][] arr = new int[3][]; // 创建二维数组,但是只是确定维数组的个数for (int i = 0; i < arr.length; i++) {  // 遍历arr每个一维数组// 给每个一维数组开空间new// 如果没有给一维数组new, 那么arr[i]就是nullarr[i] = new int[i + 1];// 遍历一维数组,并给一维数组的每个元素赋值for (int j = 0; j < arr[i].length; j++) {arr[i][j] = i + 1;// 赋值}}// 遍历arr输出for (int i = 0; i < arr.length; i++) {// 输出arr的每个一维数组for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println();// 换行}}
}

3)画出执行分析示意图

使用方式3:静态初始化

1 定义

类型 数组名[][] = {{值1,值2..}.{值1,值2..}.{值1,值2..}};

2 使用即可[固定方式访问]

比如:

int[][] arr = {{1,1,1}, {8,8,9}, {100};

解读

1 定义了一个二维数组arr

2 arr有三个元素(每个元素都是一维数组)

3 第一个一维数组有3个元素, 第二个一维数组有3个元素, 第三个一维数组有1个元素

案例1 计算二维数组的和

public class Test {public static void main(String[] args) {// 遍历二维数组,并将各个值累计到sumint 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);}
}

案例2 打印10行杨辉三角

[提示]
1.第一行有1个元素,第n行有n个元素
2.每一行的第一个元素和最后一个元素都是1
3.从第三行开始,对于非第一个元素和最后一个元素的元素的值.

arr[i][j] = arr[i-1][j] + arr[i-1][j-1]; //必须找到这个规律
public class Test {public static void main(String[] args) {// 首先,杨辉三角有多少行int rows = 10;int[][] arr = new int[rows][];// 用于赋值的二重循环for (int i = 0; i < rows; i++) {// 给每个一维数组开空间arr[i] = new int[i + 1];for (int j = 0; j <= i; j++) {if ((j == 0) || (j == i)) {arr[i][j] = 1;} else {arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];}}}// 用于输出的二重循环for (int[] ints : arr) {for (int anInt : ints) {System.out.print(anInt + "\t");}System.out.println();}}
}

二维数组使用细节和注意事项

1.一维数组的声明方式有:

int[] x;
int x[];

2.二维数组的声明方式有:

int[][] y;
int[] y[];
int y[][];

3.二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同, 也可以不相同。比如: map[][] 是一个二维数组

map [][]= {{1,2},{3,4,5}}

由map[0]是一个含有两个元素的一维数组,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等的二维数组。

二维数组课堂练习

声明:int[] x,y[]; 以下选项允许通过编译的是() :
说明:
x是int类型一维数组,y是int类型的二维数组

a) x[0] = y;//错误int[][] -> int
b) y[0] = x; //正确int[] -> int[]
c) y[0][0] = x; //错误int[]->int
d) x[0][0] = y; //错误
e) y[0][0] = x[0]; //正确int->int
f) x= y; //错误int[][]->int[]

本章作业

1.下面数组定义正确的有 ()

A. String strs[] = {'a', 'b', 'c'};
B. String[] strs = {"a","b","c"};
C. String[] strs = new String{"a" "b" "c"};
D. String strs[] = new String[]{"a","b","c"};
E. String[] strs = new String[3]{"a", "b","c"};

BD

2.写出结果

public class Test {public static void main(String[] args) {String foo = "blue";boolean[] bar = new boolean[2];if (bar[0]) {foo = "green";}System.out.println(foo);}
}

blue

3.以下Java代码的输出结果为( )

public class Test {public static void main(String[] args) {int num = 1;while (num < 10) {System.out.println(num);if (num > 5) {break;}num += 2;}}
}

1
3
5
7

4.已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如:
[10,12,45,90],添加23后,数组为[10,12,23,45,90]

public class Test {public static void main(String[] args) {// 本质是数组扩容+定位int[] arr = {10, 12, 45, 90};int insertVal = 23;int[] newArr = new int[arr.length + 1];for (int i = 0; i < arr.length; i++) {newArr[i] = arr[i];}newArr[arr.length] = insertVal;for (int i = newArr.length - 1; i > 0; i--) {if (newArr[i - 1] > newArr[i]) {newArr[i] = newArr[i] + newArr[i - 1];newArr[i - 1] = newArr[i] - newArr[i - 1];newArr[i] = newArr[i] - newArr[i - 1];}}// 输出一下newArrfor (int item : newArr) {System.out.println(item + "\t");}}
}

5.随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值的下标、并查找里面是否有8

6.试写出以下代码的打印结果

char[] arr1={'a','z','b','c'};
char[] arr2=arr1;
arr1[2]= '韩';
for(int i=0;i<arr2.length; i++){System.out.println(arr1[i]+ ","+ arr2[i]);
}

因为数组是引用复制, arr2[2]='韩'

7.写出冒泡排序的代码

前面有

Java数组初始化, 冒泡排序, 查找相关推荐

  1. java数组 初始化_用Java初始化数组

    java数组 初始化 具有使用C或FORTRAN等语言进行编程的经验的人熟悉数组的概念. 它们基本上是一个连续的内存块,每个位置都是某种类型:整数,浮点数或您所拥有的. Java中的情况与此类似,但有 ...

  2. java数组初始化的方式_java数组初始化方式

    在使用一个新的数组之前,要先对其中的数值进行设置,也就是我们常说的初始化工作.因为数组有长度和内容的区分,所以常见的两种初始化方法是动态和静态,另外一种就是默认初始化.下面我们对数组的初始化概念进行理 ...

  3. Java数组和冒泡排序

    Java数组 数组分一维数组.二维数组和多维数组. 以下详细讲解的是一维数组和简单的冒泡法. 需知Java中数组长度一经定义,固定不变. 一般数组初始化(声明并指定数组长度) 数组的内存模型详解 基础 ...

  4. java数组初始化0_Java自学-数组 初始化数组

    Java 如何初始化数组 步骤 1 : 分配空间与赋值分步进行 public class HelloWorld { public static void main(String[] args) { i ...

  5. java数组初始化赋值_Java数组的三种初始化方式

    Java语言中数组必须先初始化,然后才可以使用.所谓初始化就是为数组的数组元素分配内存空间,并为每个数组元素附初始值. 注意:数组完成初始化后,内存空间中针对该数组的各个元素就有个一个默认值: 基本数 ...

  6. Java数组初始化长度

    巴拉巴拉小魔仙:肯定是要先声明数组长度,不然系统不会为他分配内存空间. Java中的数组是定长的,比如int[] a ={}; 定义出来的数组a 长度为0,已经是定长了,之后再给它赋值是不可以的,因为 ...

  7. java数组初始化 new_java 数组初始化

    一维数组 1)   int[] a;   //声明,没有初始化 2)   int[] a=new int[5];   //初始化为默认值,int型为0 3)   int[] a={1,2,3,4,5} ...

  8. java数组初始化的方式,java中初始化数组的方式有几种

    java中初始化数组的方式有几种 发布时间:2020-06-01 16:12:45 来源:亿速云 阅读:153 作者:鸽子 三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 ...

  9. Java数组初始化的内存分配

    1.Java数组是静态的 Java是静态语言,所以Java的数组也是静态的,即:数组被初始化后,长度不可变 静态初始化:显式指定每个数组元素的初始值,系统决定数组长度 String[] books = ...

最新文章

  1. GDCM:gdcm::ServiceClassUser的测试程序
  2. 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善...
  3. Oracle中RAISE异常详解
  4. Weekly Challenges - Week 11
  5. 实现用户操作指引功能
  6. spring(三)-事务管理
  7. tensorflow内存溢出问题
  8. 好看好用的字体软件-字体下载大全提供下载
  9. 当了几年面试官看了无数简历,你们可以认真写简历吗?
  10. 内点法解不等式约束的优化问题
  11. ps里面的css,今天来为大家介绍PS中的图层样式
  12. 判断43是不是质数用c语言,1是素数吗(c语言判断一个数为素数)
  13. 根据ip查经纬度软件_根据地址查询经纬度IP(百度地图)
  14. Install VirtualBox Guest Additions for elementary os
  15. ASCP300-63B——三相电气防火限流式保护器
  16. HP deskjet 2132 如何顺利在mac上使用
  17. ion-slides 图片只能滑动一半、图片索引错误导致图片显示错误(缓存问题导致的)
  18. 千里马 android framework之MotionEvent.ACTION_CANCEL怎么产生-讨厌的android触摸面试题
  19. 编码规则-驼峰式拼写法
  20. 毕业论文之git实现版本控制防内容丢失

热门文章

  1. 15、react 的 非受控组件 和 受控组件
  2. 跟9位爱奇艺年轻的技术、产品、设计同学聊了聊,他们这样定义“青年”
  3. 开心一刻:邪恶的小明
  4. 2022-01-06至10交易记录
  5. 位 bit、字节 B Byte、M兆、MB
  6. c/c++ 洛谷 P1003 【NOIP2011 提高组】 铺地毯
  7. 关于按键精灵url的post方法返回值为空
  8. ctab法提取dna流程图_CTAB法提取DNA
  9. mysql一次查询无关联多个表_面试官:为什么mysql不建议执行超过3表以上的多表关联查询?...
  10. 弘辽科技:手淘客是什么意思?如何去查看?