数组

笔记Notes

数组介绍

数组的声明

数组初始化

数组元素默认值

数组复制

数组反转

数组查找:线性查找、二分查找

数组排序:冒泡排序


数组介绍

数组名: 创建数组内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。

下标(或索引):从0开始

数组是引用数据类型, 元素相当于类的成员变量,

数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化

数组中的元素可以是基本数据类型也可以是引用数据类型

数组的声明

声明:String[] names;

int scores[];

数组初始化:静态初始化、动态初始化

静态初始化:数组的初始化和赋值是同时进行的

names = new String{"12","34","56","78"};

动态初始化:数组的初始化和赋值分开进行

String[] names2 = new String[5];

names2[0] = "123";

下面的方式数组的声明和初始化不能分开。

                      int[] age = { 1, 2, 3, 4, 5, 6 };

数组元素的默认值

byte、short、int、long  -->0

float、double --->0.0

bolean --> \u0000

引用数据类型(类、数组、接口)--->null

一维数组内存解析

String[] persons = new String[3];

String[] persons2 = persons;

//persons 和 persons2 实际上指向的是同一块内存

堆、栈、方法区

堆(heap):用来存放对象的实例,只要是new出来的都在堆里

栈(stack): 存储局部变量, 如基本数据类型、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)

方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

/* * 数组中常见的算法 * 1. 求数组中元素的最大值、最小值、平均值、总和等 * 2. 数组的复制、反转、查找(线性查找、二分查找(了解)) * 3. 数组元素的排序算法:冒泡排序 */public class ArrayAlgorithm {public static void main(String[] args) {// 数组最大值、最小值、平均值、总和System.out.println("---------------------------------数组最大值、最小值、平均值、总和--------------------------");int scores[] = new int[5];for (int i = 0; i < scores.length; i++) {scores[i] = (int) (Math.random() * 10);}for (int i = 0; i < scores.length; i++) {System.out.print(scores[i] + " ");}System.out.println();int max = scores[0];int min = scores[0];int add = scores[0];double ever = 0;for (int i = 0; i < scores.length; i++) {if (max < scores[i]) {max = scores[i];}if (min > scores[i]) {min = scores[i];}add += scores[i];}ever = add / scores.length;System.out.println("max = " + max + " min = " + min + " add = " + add + " ever = " + ever);System.out.println("-------------------------------------------------------------");System.out.println("----------------------------数组复制---------------------------------------------");int copyScores[] = new int[scores.length];for (int i = 0; i < copyScores.length; i++) {copyScores[i] = scores[i];}for (int i = 0; i < copyScores.length; i++) {System.out.print(copyScores[i] + " ");}System.out.println();System.out.println("---------------------------数组反转方法一---------------------------------------");// 方法一System.out.println("方法一");int reverse[] = new int[scores.length];for (int i = 0, j = scores.length - 1; i < scores.length && j >= 0; i++, j--) {reverse[i] = scores[j];}for (int i = 0; i < reverse.length; i++) {System.out.print(reverse[i] + " ");}System.out.println();System.out.println("--------------------------");for (int i = 0; i < scores.length; i++) {System.out.print(scores[i] + " ");}System.out.println();System.out.println("----------------------------数组反转方法二-----------------------------------");for (int i = 0; i < scores.length / 2; i++) {int temp = scores[i];scores[i] = scores[scores.length - i - 1];scores[scores.length - i - 1] = temp;}for (int i = 0; i < scores.length; i++) {System.out.print(scores[i] + " ");}System.out.println();System.out.println("-------------------------数组查找-线性查找-------------------------");int[] numbers = { 1, 10, 9, 8, 20 };// 线性查找int findNumber = 18; // 要查找数值int index = -1;//查找到的数值所对应的下标for (int i = 0; i < numbers.length; i++) {if (findNumber ==numbers[i]) {index = i;break;//只查找一个}}if (index != -1) {System.out.println("查找到数值!所对应的数组下标为:" + index);} else {System.out.println("查找不到值!");}System.out.println("------------------------数组查找- 二分查找--------------------------------");int[] number2 = { 12, 30, -5, 6, 9, 10, 5 };//排序Arrays.sort(number2); // 必须排序好for (int i = 0; i < number2.length; i++) {System.out.print(number2[i] + " ");}System.out.println();int findNumber2 = 12;//要查找的内容int start =  0;int end = number2.length-1;int index2 = -1; //所在元素位置while (start <= end) {int mid = (start + end) / 2;if (number2[mid] == findNumber2) {index2 = mid;break;}if(number2[mid] > findNumber2){end = mid - 1;}else {start = mid + 1;}}if (index2 != -1) {System.out.println("你要的商品存在,在位置:" + index2);}else {System.out.println("客官您的包裹丟了");}System.out.println("------------------------------冒泡排序(必须会手写)-------------------------------------");int[] numbers3 = {10,2,89,39,16};for (int i = 0; i < numbers3.length; i++) {System.out.print(numbers3[i] + " ");}System.out.println();System.out.println("------------------------------排序前--------------------------------------------------------");for (int i = 0; i < numbers3.length -1; i++) { //外排序次数为长度-1  为5-1 = 4for (int j = 0; j < numbers3.length -1 - i; j++) { //内排序次数每次递减  4  3 2 1if (numbers3[j] > numbers3[j+1]) {int temp = numbers3[j];numbers3[j] = numbers3[j+1];numbers3[j+1] = temp;}}}System.out.println("--------------------------排序后-------------------------------------------");for (int i = 0; i < numbers3.length; i++) {System.out.print(numbers3[i] + " ");}System.out.println();System.out.println("------------------------排序完成------------------------------------");}}



总结Summary

静态初始化与动态初始化

数组反转

数组查找:二分查找

数组排序:冒泡排序