1 一维数组
1.1 数组的基础知识
package com.seuer.java;
/**
*
* @author LF
*
*/
public class ArrayTest {
public static void main(String[] args) {
int[] ids;//声明
//1.1 静态初始化:数组初始化+元素赋值同时操作
ids = new int[]{101,102,103,104};
//1.2 动态初始化:分开进行
int[] ids1 = new int[5];
String[] names = new String[1]{"LF"};
//总结:初始化后长度确定
//2.如何调用指定位置的元素:通过角标的方式调用
//数组的角标从0开始,到数组的长度-1结束。
names[0] = "王明";
names[1] = "王鹤";
names[2] = "张琪";
names[3] = "王宏志";
names[4] = "周勇";//charAt(0)
//3.如何获取数组的长度
//属性:length
System.out.println(names.length);
//4.如何遍历数组
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
//5.数组元素的默认初始化值
//数组元素是整型,默认初始化值都为0
//浮点型 0.0
//char 0 或 '\u0000'而非'0'
//数组元素是boolean型:false
//引用数据类型 null
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);//默认初始化值=0
}
System.out.println("***********");
char[] arr1 = new char[3];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("***********");
boolean[] arr2 = new boolean[3];
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[0]);
}
System.out.println("***********");
String[] arr3 = new String[4];
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i]);
}
}
}
1.2 数组的内存机制
1.2.1 内存的主要结构
放在main方法里的都是局部变量;new 堆空间里面重新开辟;利用指针练习堆和栈
0x12ab之后被回收
1.2.2 练习1
package com.seuer.exer;
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[] { 8, 2, 1, 0, 3};
int[] index = new int[] { 2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
String tel = "";
for (int i = 0; i < index.length; i++) {
tel += arr[index[i]];
}
System.out.println("联系方式:" + tel);
}
}
1.2.3 练习2
package com.seuer.exer;
import java.util.Scanner;
public class ArrayDemo1 {
public static void main(String[] args) {
//1.使用scanner,读取学生个数
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生人数:");
int num = scanner.nextInt();
//2.创建数组,存储学生成绩,动态初始化
int[] scores = new int[num];
//3.给数组元素赋值
//4.求出最大值
int maxScore = 0;
System.out.println("请输入" + num + "个学生成绩");
for (int i = 0; i < scores.length; i++) {
scores[i] = scanner.nextInt();
if (maxScore < scores[i]) {
maxScore = scores[i];
}
}
//5.将分数和最高分比较,输出分数和等级
char level;
for (int i = 0; i < scores.length; i++) {
if (maxScore - scores[i] <= 10) {
level = 'A';
}else if (maxScore - scores[i] <= 20) {
level = 'B';
}else if (maxScore - scores[i] <= 30) {
level = 'C';
}else {
level = 'D';
}
System.out.println("student " + i + " score is "
+ scores[i] + " ,grades is " + level);
}
}
}
2 二维数组
数组本身是引用数据类型,数组的元素也可以是引用数据类型,数组的元素是数组
2.1 基础知识
package com.seuer.java;
/**
*
* @author LF
*
*/
public class TwoArrayTest {
public static void main(String[] args) {
//1.1 静态初始化:数组初始化+元素赋值同时操作
int[] arr = new int[]{1,2,3};//一维数组
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//1.2 动态初始化:分开进行
String[] names = new String[5];
String[][] arr2 = new String[3][2];
String[][] arr3 = new String[3][];
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};
//总结:初始化后长度确定
//2.如何调用指定位置的元素:通过角标的方式调用
//数组的角标从0开始,到数组的长度-1结束。
int[] arr4[] = new int[][]{{1,2,3},{4,5},{6,7,8}};
System.out.println(arr1[0][1]);
System.out.println(arr2[1][1]);//null
//3.如何获取数组的长度
//属性:length
System.out.println(arr4.length);//3
System.out.println(arr4[1].length);//4
//4.如何遍历数组
for (int i = 0; i < arr4.length; i++) {
for (int j = 0; j < arr4[i].length; j++) {
System.out.println(arr4[i][j] + " ");
}
}
//5.内外层元素
//初始化值
/*
整型 0
浮点型 0.0
char 0
boolean false
引用类型 null
*/
int[][] arr6 = new int[4][3];
System.out.println(arr6[0]);//[I@15db9742 地址值
System.out.println(arr6[0][0]);
System.out.println("*****************");
float[][] arr7 = new float[4][3];
System.out.println(arr7[0]);//地址值
System.out.println(arr7[0][0]);//0.0
System.out.println("*****************");
String[][] arr8 = new String[4][2];
System.out.println(arr8[1]);//地址值
System.out.println(arr8[1][1]);//null
System.out.println("*****************");
double[][] arr9 = new double[4][];
System.out.println(arr9[1]);//null 指针没东西指
System.out.println(arr9[1][0]);//报错:空指针异常
}
}
2.2 内存解析
引用型的变量,存储的要么是null要么是地址值,不是直接存储元素本身。字符串存放在常量池里面
2.2 课后练习 **
package com.seuer.array2;
public class YangHuiTest {
public static void main(String[] args) {
//1.声明并初始化二位数组--动态
int[][] yangHui = new int[10][];
//2.赋值
for (int i = 0; i < yangHui.length; i++) {
yangHui[i] = new int[i+1];//第0行有1个元素
//2.1 先给首末元素赋值
yangHui[i][0] = yangHui[i][i]= 1;
//2.2 给每行的非首末元素赋值
if(i > 1){
for (int j = 1;j < yangHui[i].length - 1;j++){
yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];
}
}
}
//3.遍历
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();
}
}
}
2.3 算法题 ****
2.3.1 元素赋值 ***
杨辉三角
回型数
- 设置变量指示方向
- 每次改方向时四个变量如何修改
package com.seuer.array2;
import java.util.Scanner;
public class RectangleTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字: ");
int len = scanner.nextInt();
int[][] arr = new int[len][len];
int s = len * len;
/*
* k = 1 向右 k = 2 向下
* k = 3 向左 k = 4 向上
*/
int k = 1;
int i = 0, j = 0;
for(int m = 1;m <= s; m++){
if (k == 1) {
if (j < len && arr[i][j] == 0) {
arr[i][j++] = m;
} else {//碰壁了
k = 2;
m--;
i++;
j--;
}
} else if (k == 2){
if (i < len && arr[i][j] == 0) {
arr[i++][j] = m;
} else {
k = 3;
j--;
i--;
m--;
}
} else if (k == 3){
if (j >= 0 && arr[i][j] == 0 ) {
arr[i][j--] = m;
} else {
k = 4;
i--;
j++;
m--;
}
} else if (k == 4) {
if (i >= 0 && arr[i][j] == 0) {
arr[i--][j] = m;
}else{
k = 1;
i++;
j++;
m--;
}
}
}
for (int l = 0; l < arr.length; l++) {
for (int m = 0; m < arr[l].length; m++) {
System.out.print(arr[l][m] + "\t");
}
System.out.println();
}
}
}
2.3.2 元素查找 **
package com.seuer.array2;
public class ArrayTest1 {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random() * 90) + 10;
}
//求max
int maxValue = arr[0];
for (int i = 1; i < arr.length; i++) {
if (maxValue < arr[i]) {
maxValue = arr[i];
}
}
System.out.println("最大值是: " + maxValue);
int minValue = arr[0];
for (int i = 1; i < arr.length; i++) {
if (minValue > arr[i]) {
minValue = arr[i];
}
}
System.out.println("最小值是: " + minValue);
//求总和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("总和为: " + sum);
int avgValue = sum / arr.length;
System.out.println("平均数为: " + avgValue);
}
}
2.3.3 数组复制 **
在堆空间里只有一个数组,只是把array1的地址给了array2
package com.seuer.array2;
public class ArrayTest2 {
public static void main(String[] args) {
int[] array1, array2;
array1 = new int[]{2,3,5,7,11,13,17,19};
//显示array1的内容
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + "\t");
}
System.out.println();
//赋值array2变量等于array1
//地址值一样
// array2 = array1;
//
// //修改array2中的偶索引元素,使其等于索引值
// for (int i = 0; i < array2.length; i++) {
// if (i % 2 == 0) {
// array2[i] = i;
// }
// }
//数组复制
array2 = new int[array1.length];
for (int i = 0; i < array2.length; i++) {
array2[i] = array1[i];
}
//显示array1的内容
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i] + "\t");
}
}
}
2.3.4 数组反转 ***
package com.seuer.array2;
public class ArrayAlgorithm {
public static void main(String[] args) {
//复制操作
String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
//数组的复制
String[] arr1 = new String[arr.length];
for (int i = 0; i < arr1.length; i++) {
arr1[i] = arr[i];
}
//数组反转
//方法一
// String temp;
// for (int i = 0; i < arr1.length / 2; i++) {
// temp = arr1[i];
// arr1[i] = arr1[arr1.length-i-1];
// arr1[arr1.length-i-1] = temp;
// }
//
//方法二
for (int i = 0, j = arr1.length - 1; i < j; i++, j--) {
String temp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = temp;
}
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + '\t');
}
}
}
2.3.5 数组查找 ***
package com.seuer.array2;
public class Search {
public static void main(String[] args) {
//方法一:线性查找
String[] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
String dest = "pp";
boolean isFlag = true;
for (int i = 0; i < arr.length; i++) {
if (dest.equals(arr[i])) {
System.out.println("找到了指定的元素,位置为: " + i);
isFlag = false;
break;
}
}
if (isFlag) {
System.out.println("很遗憾没有找到指定元素。");
}
//方法二:二分法查找
//所查找的数组必须有序
int[] arr2 = new int[]{-455,-32,-11,-5,0,12,34,55,67,567,678,9999};
int dest1 = -32;
int head = 0;//初始首索引
int end = arr2.length - 1;
isFlag = true;
while(head <= end){
int middle = (head + end)/2;
if (dest1 == arr2[middle]) {
System.out.println("找到了指定的元素,位置为:" + middle);
isFlag = false;
break;
} else if(arr2[middle] > dest1){
end = middle - 1;
}else{
head = middle + 1;
}
}
if (isFlag) {
System.out.println("没找到~");
}
}
}
2.3.6 排序 ***
快速排序
2.4 Arrays工具类
//day07
package com.seuer.array2;
import java.util.Arrays;
public class ArraysTest {
public static void main(String[] args) {
//1.判断两个数组是否相等
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,3,2,4,0,-1};
boolean isEquals = Arrays.equals(arr1, arr2);
System.out.println(isEquals);
//2.输出数组信息
System.out.println(Arrays.toString(arr1));
//3.将指定值填充到数组
Arrays.fill(arr1, 12);
System.out.println(Arrays.toString(arr1));
//4.对数组进行排序
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
//5.二分查找
int[] arr3 = new int[]{-99,-32,-11,-2,0,1,20,29,76,100};
int index = Arrays.binarySearch(arr3, 20);
if (index >= 0) {
System.out.println(index);
}
}
}
2.5 出错的情况
package com.seuer.array2;
/*
* 1.数组角标越界异常
* 2.空指针异常
*/
public class ArrayExceptionTest {
public static void main(String[] args) {
//1.角标越界
int[] arr = new int[]{1,2,3,4,5};
// for (int i = 0; i <= arr.length; i++) {
// System.out.println(arr[i]);
// }
// System.out.println(arr[-2]);
//2.空指针异常
//情况一
// int[] arr1 = new int[]{1,2,3};
// arr1 = null;
// System.out.println(arr1[0]);
//情况二
// int[][] arr2 = new int[3][];
// System.out.println(arr2[0][0]);
//情况三
String[] arr3 = new String[]{"AA","BB","CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());
}
}
3 数据结构初步
3.1 存储结构
线性表:顺序表(数组)、链表、栈、队列
树形结构:二叉树
图形结构、算法
数据结构的存储方式只有两种:数组(顺序存储) 链表(链式存储)
队列、栈:可以用数组或者链表来实现
图:邻接表、邻接矩阵
4 每天一考
package com.seuer.array2;
import java.util.Arrays;
public class Exam {
public static void main(String[] args) {
//1.从小到大排序
int[] arr = new int[]{34,5,22,-98,6,-76,0,-3};
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;
}
}
}
System.out.println(Arrays.toString(arr));
//2.反转上面的数组
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
System.out.println(Arrays.toString(arr));
//3.复制上面的数组
int[] arr1 = new int[arr.length];
for (int i = 0; i < arr1.length; i++) {
arr1[i] = arr[i];
}
System.out.println(Arrays.toString(arr1));
//4.查找22
int key = 22;
for (int i = 0; i < arr1.length; i++) {
if (arr[i] == key) {
System.out.println("数组的第 " + (i + 1) + "个元素是 " + key);
break;
}
}
}
}