赞
踩
数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
public class Day06_ArrayTest { public static void main(String[] args) { //1. 一维数组的声明和初始化 //注意:数组一旦初始化完成,其长度就确定了 int[] ids; //声明 //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行 ids = new int[]{1001, 1002, 1003, 1004}; //也是正确的 // ids = {1001, 1002, 1003, 1004}; //2.2 动态初始化:数组的初始化和数组元素的赋值操作分开进行 //这里仅对数组进行了初始化(对数组内元素的数据类型和数组的长度初始化),但数组内的元素还没有赋值 String[] names = new String[3]; //注意:下述两种写法中1是正确的(静态初始化),2是错误的 int[] array = new int[]{1001, 1002, 1003, 1004}; //int[] array = new int[5]{1001, 1002, 1003, 1004}; } }
public class Day06_ArrayTest {
public static void main(String[] args) {
String[] names = new String[3];
//2. 如何调用数组的指定位置(索引)的元素
//数组的索引从0开始,到数组的长度-1结束
//对数组内各元素赋值
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
String[] names = new String[3];
//3. 如何获取数组的长度
//属性:length
System.out.println(names.length);
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
String[] names = new String[3];
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
//4. 如何遍历数组
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
//数组元素是int类型
int[] arr1 = new int[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
//数组元素是short类型
short[] arr2 = new short[4];
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
//数组元素是double类型
double[] arr3 = new double[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr3[i]);
}
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
//数组元素是char类型
char[] arr4 = new char[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr4[i]);
}
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
//数组元素是boolean类型
boolean[] arr5 = new boolean[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr5[i]);
}
}
}
public class Day06_ArrayTest {
public static void main(String[] args) {
//数组元素是String(引用数据类型)
String[] arr6 = new String[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr6[i]);
}
}
}
Java把内存划分成两种:一种是栈内存,一种是堆内存。栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
注意:String(字符串)实际上存放在方法区的字符串常量池中。引用类型变量的值要么是null,要么是地址
例1:从键盘读入学生的成绩,找出最高分,并输出学生成绩的等级
import java.util.Scanner; public class Day06_ArrayExer { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入学生人数:"); //1.获取学生人数 int StudentNum = scan.nextInt(); //2.根据人数创建int数组,用来存放学生成绩 int[] scoreArr = new int[StudentNum]; System.out.println("请输入" + StudentNum + "个成绩:"); //3.依次从键盘获取学生成绩并存入数组,并顺便找出最大值 int maxsocre = scoreArr[0]; for (int i = 0; i < scoreArr.length; i++) { scoreArr[i] = scan.nextInt(); if (scoreArr[i] > maxsocre) { maxsocre = scoreArr[i]; } } //4.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级 for (int i = 0; i < scoreArr.length; i++) { char level; if (scoreArr[i] >= maxsocre - 10) { level = 'A'; } else if (scoreArr[i] >= maxsocre - 20) { level = 'B'; } else if (scoreArr[i] >= maxsocre - 30) { level = 'C'; } else { level = 'D'; } System.out.println("第" + (i + 1) + "个学生的等级为:" + level); } } }
public class Day06_twoDArrayTest {
public static void main(String[] args) {
//1. 二维数组的声明和初始化
//1.1 静态初始化
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}}; //内层数组的长度可以不一样
//也是正确的
// int[][] arr1 = {{1, 2, 3}, {4, 5}, {6, 7, 8}};
//1.2 动态初始化的方式一
//从内存占用来解析,外层一维数组的长度为3,每个内层一维数组的长度为2
int[][] arr2 = new int[3][2];
//动态初始化的方式二
int[][] arr3 = new int[3][];
}
}
public class Day06_twoDArrayTest {
public static void main(String[] args) {
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[][] arr2 = new int[3][2];
int[][] arr3 = new int[3][];
//2. 如何调用数组指定位置(索引)的元素
System.out.println(arr1[0][1]);
System.out.println(arr2[0][1]);
//在arr3外层数组的第0个位置初始化一个长度为3的一维数组
arr3[1] = new int[3];
System.out.println(arr3[1][0]); //0
}
}
public class Day06_twoDArrayTest {
public static void main(String[] args) {
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
//3. 如何获取数组的长度
System.out.println(arr1.length); //3 返回的是外层数组的长度
System.out.println(arr1[1].length); //2 返回外层数组第1个位置上的内层数组的长度
}
}
public class Day06_twoDArrayTest {
public static void main(String[] args) {
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
//4. 如何遍历数组
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + " ");
}
System.out.println();
}
}
}
规定:二维数组分为外层数组的元素和内存数组的元素。如
int[][] arr = new int[4][3];
//外层元素:arr[0],arr[1]等
//内层元素:arr[0][0],arr[0][1]等
public class Day06_ArrayTest {
public static void main(String[] args) {
//5. 数组元素的默认初始化值
//动态初始化方式1
int[][] arr = new int[4][3];
System.out.println(arr[0]); //外层数组第0个位置上的内层数组的地址值
System.out.println(arr[0][0]); //0
//动态初始化方式2
int[][] arr1 = new int[4][];
System.out.println(arr1[0]); //null
//System.out.println(arr1[0][0]); //报错
}
}
例1:获取arr数组中所有元素的和
public class twoDArrayExer {
public static void main(String[] args) {
int[][] arr = new int[][]{{3, 5, 8}, {12, 9}, {7, 0, 6, 4}};
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);
}
}
例2:声明
int[] x,y[] //x是一维数组,y是二维数组
以下选项允许通过编译的是:
a) x[0] = y;
b) y[0] = x; √
c) y[0][0] = x;
d) x[0][0] = y;
e) y[0][0] = x[0]; √
f) x = y;
//提示:
1. 一维数组的正确声明方式:int[] x 或 int x[]
2. 二维数组的正确声明方式:int[][] y 或 int[] y[] 或 int y[][]
练习1:使用二维数组打印一个10行的杨辉三角
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
public class twoDArrayExer { public static void main(String[] args) { int[][] yanghui = new int[10][]; for (int i = 0; i < yanghui.length; i++) { //第一行有一个元素,第n行有n个元素 yanghui[i] = new int[i + 1]; //对每一行的第一个元素和最后一个元素赋值(连续赋值) yanghui[i][0] = yanghui[i][i] = 1; } //从第三行开始,对非第一个和最后一个的元素赋值 for (int i = 2; i < yanghui.length; i++) { for (int j = 1; j < yanghui[i].length - 1; j++) { yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]; } } //循环遍历输出 for (int i = 0; i < yanghui.length; i++) { for (int j =0; j < yanghui[i].length; j++) { System.out.print(yanghui[i][j] + " "); } System.out.println(); } } }
优化后:去掉了一个for循环嵌套
public class twoDArrayExer { public static void main(String[] args) { int[][] yanghui = new int[10][]; for (int i = 0; i < yanghui.length; i++) { //第一行有一个元素,第n行有n个元素 yanghui[i] = new int[i + 1]; //每一行的第一个元素和最后一个元素都是1(连续赋值) yanghui[i][0] = yanghui[i][i] = 1; //对第三行开始的第一个和最后一个元素赋值(不需要加if,因为i=0或1时for循环的循环条件为false) for (int j = 1; j < yanghui[i].length - 1; j++) { yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]; } } //循环遍历输出 for (int i = 0; i < yanghui.length; i++) { for (int j =0; j < yanghui[i].length; j++) { System.out.print(yanghui[i][j] + " "); } System.out.println(); } } }
练习1: 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值、最小值、和值。要求:所有随机数都是两位数。
(int)(Math.random() * (b - a + 1) + a)
public class Day07_ArrarCommonExer { public static void main(String[] args) { int[] arr = new int[10]; //元素默认初始化为0 int max = 0; int min = 100; int sum = 0; for (int i = 0; i < arr.length; i++) { //赋10~99的随机数 arr[i] = (int)(Math.random() * (99 - 10 + 1) + 10); //最大值 if (arr[i] > max) { max = arr[i]; } //最小值 if (arr[i] < min) { min = arr[i]; } //和值 sum += arr[i]; } System.out.print("10个元素依次为:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); System.out.println("最大值为:" + max); System.out.println("最小值为:" + min); System.out.println("和值为:" + sum); } }
public class Day07_ArrarSetValueExer { public static void main(String[] args) { int[] array1, array2, array3; array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19}; System.out.print("原始array1:"); for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + " "); } System.out.println(); //array2对array1的复制 array2 = new int[array1.length]; //通过new的方式给array2在堆空间中新开辟一片独立的数组空间 for (int i = 0; i < array2.length; i++) { array2[i] = array1[i]; } //数组变量的赋值,而非数组的复制 array3 = array1; for (int i = 0; i < array3.length; i++) { if (i % 2 == 0) { array3[i] = i; } } System.out.print("array1:"); for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + " "); } System.out.println(); System.out.print("array2:"); for (int i = 0; i < array2.length; i++) { System.out.print(array2[i] + " "); } System.out.println(); System.out.print("array3:"); for (int i = 0; i < array3.length; i++) { System.out.print(array3[i] + " "); } } }
总结:
7. 可以看到,在对array3中的元素进行操作后,array1中的元素也发生了变化,而array2中的元素仍然和原始array1中的元素保持一致
8. array3 = array1;代表数组变量的赋值(即引用数据类型变量的赋值),而非数组的复制。具体来说将栈中array1指向的数组的首地址值赋给了array3,此时array3也指向了堆中array1指向的数组。也就是说引用类型变量array1和array3保存的地址值是一样的,它们共同指向堆空间中同一个数组实体。
9. 而array2是对array1的复制,二者在栈中保存的地址值是不同的,指向的也是堆中相互独立的两个数组实体,故对array3中元素的操作并不影响array2中的元素
对数组 String[] arr = new String[]{“A”, “B”, “C”, “D”, “E”, “F”}; 进行反转
public class Day07_ArrarSetValueExer { public static void main(String[] args) { String[] arr = new String[]{"AA", "BB", "CC", "DD", "EE", "FF"}; //方法一:对应位置元素交换变量值 for (int i = 0; i < arr.length / 2; i++) { String temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; } for (int i = 0; i< arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); //方法二:用i和j分别表示首尾元素 for (int i = 0, j = arr.length - 1; i < j; i++, j--) { String temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } for (int i = 0; i< arr.length; i++) { System.out.print(arr[i] + " "); } } }
public class Day07_ArrarSetValueExer { public static void main(String[] args) { //线性查找 boolean flag = true; for (int i = 0; i < arr.length; i++) { //if (arr[i] == dest) { if (dest.equals(arr[i])) { System.out.println("BB在arr中的索引为:" + i); flag = false; break; } } if (flag) { System.out.println("arr中不存在元素BB"); } } }
public class Day07_ArrarSetValueExer { public static void main(String[] args) { int[] arr2 = new int[]{2, 5, 7, 8, 10, 15, 18, 20, 22, 25, 28}; int dest1 = 18; //用来标识是否查找到目标 boolean isFlag = true; //查找范围的首索引,初始为0 int start = 0; //查找范围的末索引,初始为数组最后一个元素的索引 int end = arr2.length - 1; //二分法查找 while (start <= end) { //注意这里要加等号,因为最后的查找范围可能只剩一个数,仍需要再查找一次 //查找范围的中间元素的索引,如果查找范围内有偶数个元素,则取靠左边的中间元素 int mid = (start + end) / 2; //比较所有查找的数和中间元素值的大小,从而调整查找范围 //若所要查找的数 < 中间元素值,则说明所要查找的数在中间元素左侧,设置end为mid前一个索引 if (dest1 < arr2[mid]) { end = mid - 1; //若所要查找的数 > 中间元素值,则说明所要查找的数在中间元素右侧,设置start为mid后一个索引 } else if (dest1 > arr2[mid]) { start = mid + 1; //若所有查找的数 == 中间元素值,则查找结束 } else { System.out.println("该元素在数组中的索引为" + mid); isFlag = false; break; } } if (isFlag) { System.out.println("数组中不存在该元素"); } } }
一、十大内部排序算法:
归并排序(能说出实现思想)
桶式排序
基数排序
**二、衡量排序算法的指标:**时间复杂度、空间复杂度、稳定性
**三、不同排序算法的时间复杂度:**重点掌握冒泡排序、快速排序
public class Day07_BubbleSortTest { public static void main(String[] args) { int[] arr = new int[]{43, 32, 76, -98, 0, 64, 33, -21, 32, 99}; //共 arr.length - 1 轮排序 for (int i = 0; i < arr.length - 1; i++) { //从前往后依次比较数组中相邻元素的大小,若发现逆序则交换 for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //打印排序后的数组 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } }
也可以写成
public class Day07_BubbleSortTest { public static void main(String[] args) { int[] arr = new int[]{43, 32, 76, -98, 0, 64, 33, -21, 32, 99}; //共 arr.length - 1 轮排序 for (int i = arr.length - 1; i > 0; i--) { //从前往后依次比较数组中相邻元素的大小,若发现逆序则交换 for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //打印排序后的数组 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } }
==java.util.Arrays==类即为操作数组的工具类,包含了用来操作数组的各种方法(如排序和搜索)
import java.util.Arrays;
public class Day07_ArraysClassTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
//判断两个数组是否相等(两个数组的对应元素是否都相等)
boolean isEquals = Arrays.equals(arr1, arr2);
System.out.println(isEquals); //false
}
}
import java.util.Arrays;
public class Day07_ArraysClassTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
//输出数组信息(各元素)
System.out.println(Arrays.toString(arr1)); //[1, 2, 3, 4]
}
}
import java.util.Arrays;
public class Day07_ArraysClassTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
//将指定值填充到数组中(将数组中所有元素都替换成指定值)
Arrays.fill(arr1, 10);
System.out.println(Arrays.toString(arr1)); //[10, 10, 10, 10]
}
}
import java.util.Arrays;
public class Day07_ArraysClassTest {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
//对数组进行排序(从小到大)
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4]
}
}
import java.util.Arrays; public class Day07_ArraysClassTest { public static void main(String[] args) { int[] arr1 = new int[]{1, 2, 3, 4}; int[] arr2 = new int[]{1, 3, 2, 4}; //对数组进行排序(从小到大) Arrays.sort(arr2); System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4] //对排序后的数组进行二分法检索指定的值 int index = Arrays.binarySearch(arr2, 2); //返回索引值 System.out.println(index); //若key在数组中不存在,则返回一个负数 int index1 = Arrays.binarySearch(arr2, 8); System.out.println(index1); //通常可以写成这样的形式: if (index >= 0) { System.out.println(index); } else { System.out.println("未找到"); } } }
public class Day07_ArrayException {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]); //ArrayIndexOutOfBoundsException
}
}
}
public class Day07_ArrayException { public static void main(String[] args) { //情况1: int[] arr1 = new int[]{1, 2, 3}; arr1 = null;//数组arr1是引用数据类型变量,其值要么是null,要么是地址 System.out.println(arr1[0]); //NullPointerException //情况2: int[][] arr2 = new int[3][]; System.out.println(arr2[0]); //null System.out.println(arr2[0][0]); //NullPointerException //情况3: String[] arr3 = new String[]{"AA", "BB", "CC"}; arr3[0] = null; System.out.println(arr3[0].toString()); //NullPointerException } } for(int i = 0; i <= arr.length; i++) { System.out.println(arr[i]); //ArrayIndexOutOfBoundsException } } }
public class Day07_ArrayException { public static void main(String[] args) { //情况1: int[] arr1 = new int[]{1, 2, 3}; arr1 = null;//数组arr1是引用数据类型变量,其值要么是null,要么是地址 System.out.println(arr1[0]); //NullPointerException //情况2: int[][] arr2 = new int[3][]; System.out.println(arr2[0]); //null System.out.println(arr2[0][0]); //NullPointerException //情况3: String[] arr3 = new String[]{"AA", "BB", "CC"}; arr3[0] = null; System.out.println(arr3[0].toString()); //NullPointerException } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。