软件设计之Java入门视频(6)
视频教程来自B站尚硅谷:
尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号
学习内容:
该视频共分为1-717部分
本次内容涉及150-179
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:
- 二维数组
- 冒泡排序与快速排序
- 数组工具Arrays
- 两种常见的数组报错内容
- 面向对象与面向过程
1、二维数组
二维数组的遍历
int[][] arr = new int [][]{ {1,2,3},{4,5,7,8},{6,7,8}};
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();
}
二维数组的内存解析
数组的判断与训练题
声明int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过的是:
//x是一维数组; y是二维数组
x[0] = y; //no
y[0] = x; //yes
y[0][0] = x; //no
x[0][0] = y; //no
y[0][0] = x[0]; //yes
x = y; //no
使用二维数组打印一个 10 行杨辉三角。
【提示】
- 第一行有 1 个元素, 第 n 行有 n 个元素、
- 每一行的第一个元素和最后一个元素都是 1
- 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
public class FamilyAccount {
public static void main(String[] args) {
int [][] yanghui = new int[10][];
for (int i = 0; i<yanghui.length; i++){
yanghui[i] = new int[i+1]; //这一步非常关键 它创建了二维数组地址所指向的一维数组
for(int j = 0; j<=i; j++){
if (i<=1){
yanghui[i][j] = 1;
} else {
if (j==0 || j ==i ){
yanghui[i][j] = 1;
}else{
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
}
}
System.out.print(yanghui[i][j] + " ");
}
System.out.println();
}
}
}
数组复制、反转、查找(线性查找、二分法查找)
public class FamilyAccount {
public static void main(String[] args) {
String [] arr = new String[]{"JJ","DD","MM","BB","GG","AA"};
//数组复制 (不可以arr1 = arr,那是地址赋值)
String[] arr1 = new String [arr.length];
for (int i = 0;i< arr.length;i++){
arr1[i] = arr[i];
}
//数组反转
for (int i = 0;i< arr.length/2;i++){
String temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
//线性查找
String dest = "BB";
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("没找到");
}
}
}
二分法查找:
前提:所要查找的数组必须有序
该图引自详解二分法
public class FamilyAccount {
public static void main(String[] args) {
int[] arr = new int[]{-98,-34,2,34,54,66,78,103,242,553};
int dest = -34;
int head = 0;
int end = arr.length - 1;
boolean isFlag = true;
while (head <=end){
int middle = (head + end) / 2 ;
if (arr[middle] == dest){
System.out.println("找到了指定元素,位置为:" + middle);
isFlag = false;
break;
} else if(arr[middle] > dest) {
end = middle - 1;
}else {
head = middle + 1;
}
}
if (isFlag){
System.out.println("没找到");
}
}
}
2、 冒泡排序与快速排序
冒泡排序
介绍:
冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。排序思想:
- 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。
public class FamilyAccount {
public static void main(String[] args) {
int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};
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] + " ");
}
}
}
快速排序
排序思想:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区操作。
- 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
- 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代中,它至少会把一个元素摆到它最后的位置去。
3、数组工具Arrays
import java.util.Arrays;
import java.util.Scanner;
public class FamilyAccount {
public static void main(String[] args) {
//1、 boolean equals(int[] a, int[] b): 判断两个数组是否相等
int [] arr1 = new int[]{1,2,3};
int [] arr2 = new int[]{2,1,3};
boolean isEquals = Arrays.equals(arr1,arr2);
System.out.println(isEquals); //false
//2、String toString(int[] a):输出数组信息
System.out.println(Arrays.toString(arr1));
//3、void fill(int[] a,int val): 将指定值填充到数组之中
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1)); // 10 10 10
//4、void sort(int[] a):对数组进行排序
Arrays.sort(arr2); // 1 2 3
System.out.println(Arrays.toString(arr2));
//5、int binarySearch(int[] a,int key) // 二分法查找
int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
int index = Arrays.binarySearch(arr3,211);
if(index >=0){
System.out.println(index);
}else{
System.out.println("没找到");
}
}
}
4、两种常见的数组报错内容
数组角标越界异常
ArrayIndex Out Of BoundsException 是一种常见的运行时异常,表示程序试图访问数组的非法索引。以下是 ArrayIndexOutOfBoundsException 发生的几种常见情况
//尝试访问数组的负索引会导致此异常:
int[] arr = {1, 2, 3};
System.out.println(arr[-1]); // 报 ArrayIndexOutOfBoundsException
//访问超过数组长度的索引:
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // 报 ArrayIndexOutOfBoundsException
//循环中索引越界:
int[] arr = {1, 2, 3};
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]); // 当 i 为 3 时,报 ArrayIndexOutOfBoundsException
}
//多维数组的索引越界
int[][] arr = {{1, 2}, {3, 4}};
System.out.println(arr[2][0]); // 报 ArrayIndexOutOfBoundsException
System.out.println(arr[0][2]); // 报 ArrayIndexOutOfBoundsException
空指针异常
Null Pointer Exception
数组报空指针异常的主要原因可以归结为以下两种情况:
1 数组引用为 null: 当你声明了一个数组但没有初始化它时,该数组引用会是 null。此时,任何对该数组引用的操作都会导致空指针异常。
2 数组中存储的元素为 null: 当数组是对象类型的数组(例如 String 数组或自定义类的数组),即使数组本身已初始化,但其中的元素没有初始化(元素为 null),对这些 null 元素的操作 也会导致空指针异常(直接访问这个变量不会引发 NullPointerException,因为你只是读取它的值,而不是调用它的方法或访问它的属性。)。
//数组引用为 null
int[] arr = null;
System.out.println(arr.length); // 报空指针异常
//数组中存储的元素为 null
String[] strArray = new String[5];
System.out.println(strArray[0].length()); // 报空指针异常
5、面向对象与面向过程
面向过程(POP) 与 面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
面向对象
类是对一类事物的描述,是抽象的、概念上的定义
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)
类
类主要有两个内容:属性和行为
其中属性对应着成员变量;行为对应着成员方法
public class FamilyAccount {
public static void main(String[] args) {
//创建Person类的对象
Persion p1 = new Persion();
//调用对象的结构:属性、方法
//调用属性: “对象.属性”
p1.name = "Mary";
p1.age = 18;
p1.isMale = true;
System.out.println(p1.name);
//调用方法:“对象.方法”
p1.eat();
p1.sleep();
p1.talk("Chinese");
}
}
class Persion{
//属性
String name;
int age = 1; //默认值
boolean isMale;
//方法
public void eat(){
System.out.println("人可以吃饭");
}
public void sleep(){
System.out.println("人可以睡觉");
}
public void talk(String language){
System.out.println("人可以说话,使用的是" + language);
}
}