0224学习笔记
递归
边界条件:停止的条件,没有的话将陷入死循环
数组
int[] nums = new int[10]; //声明并用new关键字来创建,动态初始化,使用默认值
int[][] arrays = new int[2][5];double[] numbers = {0.5, 0.6, 0.7}; //或用{}来初始化,静态初始化,创建时赋值
int[] arrays = {{1,2},3,6,7};nums.length //获取数组长度
注意
-
一个数组中的元素必须是相同类型。可以是任何数据类型,包括基本类型和引用类型。
-
Java数组的大小一旦确定,就不能更改。如果下标越界,则报:
ArrayIndexOutifBounds
-
数组中的元素会自动初始化:
int
类型 → 默认值0
(行内代码用``)double
类型 → 默认值0.0
boolean
类型 → 默认值false
String
和对象类型 → 默认值null
- 在 Java 中,数组是 引用类型,本质上是一个对象,对象存储在 堆内存 中。数组的每个元素相当于该对象的 成员变量。
数组使用
Arrays类
Arrays
工具类下有许多方法可供调用,如:
Arrays.toString(a); //打印出数组a,形如[1, 4, 2, 6, 3, 5, 9, 0]
Arrays.sort(a); //对数组进行升序排序
Arrays.fill(a,0); //将指定值分配给每个元素
冒泡排序
//冒泡排序,时间复杂度O(n^2)//1 在数组中,比较两个相邻的元素,如果第一个比第二个大,就交换位置//2 每一次比较,都会产生一个最大或者最小的数字//3 下一轮则可以少一次排序//4 依次循环,直到结束public static int[] sort(int[] array) {int temp = 0;//外层循环,判断要走多少次for (int i = 0; i < array.length - 1; i++) {boolean flag=false;//内层循环,如果第一个比第二个大,交换位置for (int j = 0; j < array.length - 1 - i; j++) {if (array[j + 1] > array[j]) {temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag=true;}}if(!flag){ //如果某一轮一次交换都没发生,说明已经有序,直接结束排序break;}}return array;}
稀疏数组
public static void main(String[] args) {//1 创建一个二维数组 11*11 0:没有棋子, 1:黑棋, 2:白棋int[][] array1 = new int[11][11];array1[1][2]=1;array1[2][3]=2;//输出原始数组System.out.println("输出原始数组:");for (int[] ints : array1) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println();}System.out.println("=============================");//转换为稀疏数组保存//获取有效值的个数int sum =0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if(array1[i][j]!=0){sum++;}}}System.out.println("有效值的个数:"+sum);//2 创建一个稀疏数组的数组int[][] sparse=new int[sum+1][3];sparse[0][0]=11;sparse[0][1]=11;sparse[0][2]=sum;//遍历二维数组,将非零的值,存放在稀疏数组中int count=0;for (int i = 0; i < array1.length; i++) {for (int j = 0; j < array1[i].length; j++) {if(array1[i][j]!=0){count++;sparse[count][0]=i; //第count行的第一个元素存放纵坐标sparse[count][1]=j; //第count行的第二个元素存放横坐标sparse[count][2]=array1[i][j];}}}//输出稀疏数组System.out.println("稀疏数组:");for (int i = 0; i < sparse.length; i++) {System.out.println(sparse[i][0]+"\t"+sparse[i][1]+"\t"+sparse[i][2]+"\t");}System.out.println("=================================");System.out.println("还原:");//1 读取稀疏数组int[][] array2=new int[sparse[0][0]][sparse[0][1]];//2 给其中的元素还原它的值for (int i = 1; i < sparse.length; i++) {array2[sparse[i][0]][sparse[i][1]]=sparse[i][2];}//3 打印System.out.println("输出还原的数组:");for (int[] ints : array2) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println();}}
面向对象 Object-Oriented Programming, OOP
本质:以类的方式组织代码,以对象的形式封装数据。
抽象
三大特性:
- 封装
- 继承
- 多态
从认识论角度,是先有对象后有类,对象是具体的事物(比如一个个具体的人),类是抽象的概念(比如Person类)。
从代码运行角度是,先有类后有对象,类是对象的模板。
方法
void的返回行可以这么写return;
break
和return
的区别:break结束循环,return表示方法结束。
构造器(Constructor)
使用new关键字创建对象的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中的构造器的调用。
类中的构造器也称为构造方法,是在创建对象的时候必须调用的。
并且构造器有以下两个特点:
-
与类名相同(方法名必须与类名一致)。
-
没有返回值(不能写
void
或其他返回类型)。
构造器的作用:
-
new
关键字的本质是调用构造方法 来创建对象。 -
初始化对象的属性值(可以是默认值,也可以是通过参数传递的值)。
构造器是特殊的方法,但 不能手动调用,它只能在 new
对象时自动执行。
如果一个类没有显式定义构造方法,Java 会提供一个默认的无参构造方法。
构造方法可以重载(多个构造方法),允许不同的参数传递方式。