数组
数组是一种引用类型,数组型数据是对象(object)。可以存放多个同一类型的数据。
例如:
1.一个double类型的数组。
double[] a = {2.1,4.2} ;
或者 double a[] = {};
2.要想使用则:a[i]:i代表索引,从0开始。
3.double a[] = new int[5] // 代表定义一个数组a里面有5个int类型的数。默认数值为0。
4.也可以先声明,在定义。
double a[];
a = new double[8];
5.数组中的元素可以是任何数据类型,包括基本类型和引用类型。但是不能混用。
6.数组创建后如果没有赋值,则有默认值。char为:\u0000。布尔值为false。String为null。其他为0或者0.0。
7.基本数据类型(int等)是值传递。数组在默认情况下是引用传递,赋的值是地址。
数组arr1拷贝到arr2。要求数据空间独立。
例:
int arr1[] = {1,2,3};
int arr2[] = new int[arr1.length];
for(int i=1; i < arr1.length; i++){
arr2[i] = arr1[i];
}
简单排序
详细的排序算法到数据结构与算法中学。
内部排序:将需要处理的所有数据都加载到内部存储器中进行排序(包括:交换式排序,选择式排序,插入式排序)。
外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序(包括合并排序法和直接合并排序法)。
冒泡排序法
通过对待排序序列从后向前(或者从前向后),一次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前象后部移。
查找
顺序查找。
二分查找(具体在数算中学)。
二维数组
定义二维数组: int arr[][] = {{0,1,1},{2,3,4}};(二维数组中一维数组的元素数可以不同)
输出二维数组:
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();
}
关键概念:
1.二维数组的每一个元素是一个一维数组。二维数组的元素个数是行数也就是一维数组的个数。
2.访问二维数组的第i个一维数组的第j个值。:arr[i-1][j-1]
使用方式
1.二维数组的动态初始化:
int a[][] = new int[2][3]; // 定义两行三列的二维数组。
2.二维数组的列数不确定。
int arr[][] = new int[2][]; // 开辟一个空间存放二维数组。
// 二维数组有两个一维数组,每个一维数组还没有开辟空间
for(int k = 0; k < arr.length; k++){
arr[i] = new int[i + 1]; // 如果一维数组没有值,则默认为null(扩容数组)
for(int j = 0; j < arr[i].length; j++){
arr[k][j] = 某个值; // 遍历一维数组并为一维数组赋值
}
}
3.静态初始化。
int arr[][] = {{1,2,3},{4,5},{6}}; // 定义一个二维数组,其中第一个一维数组有3个元素。第二个一维数组有两个元素。第三个一维数组有一个元素。
类与对象(面向对象OOP)
main方法中{
Person person = new Person(); // 实例化对象(创建一个对象)person是对象名。
cat = person; // cat复制的是person的地址。
person.name = "小明";
person.speak; //调用speak方法。
}
class Person { // 创建类
String name; // 创建属性
int age;
double sal;
public void speak(){ // 创建一个方法 public表示方法是公开方法。void表示方法没有返 // 回值。 speak()是方法名。()是形参列表。
System.out.println("这是方法的输出语句!");
}
public int getSum(int num1, int num2){ // int表示方法执行后返回一个int型的值。
//()中的两个形参,可以接受用户的输入。
int res = num1 +num2;
return res;
}
}
类就是自己定义的一个数据类型。其中有属性(成员变量)和行为。
类可以有很多对象。对象就是一个具体的实例。
从类到对象有很多说法:1.创建一个对象。2.实例化一个对象。3.把类实例化。
属性:
属性的定义类型可以为任意类型,包含基本类型和引用类型。
属性如果不赋值有默认值,规则和数组一致。
类和对象的内存分配机制
1.栈:一般存放基本数据类型(局部变量)。
2.堆:存放对象(Person,person,数组等)。
3.方法区:常量池(常量,比如字符串等),类加载信息。
4.示意图[(Cat(name,age,price))]
方法:需要自己定义。
方法的定义:
public 返回数据类型 方法名 (形参列表...){
// 如果返回数据类型为void,表示没有返回值。
方法体;
return 返回值;
}
内存分配:1.当程序执行到方法时,内存会开辟一个独立的空间(栈空间)。2.当方法执行完毕时,会返回到调用方法的地方。3.返回后继续执行方法后面的代码。
方法的注意事项:
1.一个方法最多有一个返回值。 (如果想返回多个返回值,可以返回数组。)
2.返回类型可以是基本数据类型和引用类型(数组,对象)等。
3.如果方法要求有返回数据类型,则 方法体中的最后执行语句必须为return 值。而且要求返回值类型必须和return值的类型一致或兼容。
4.命名遵循驼峰命名法。
5.形参和实参的类型要一致或兼容。顺序、个数必须一致。
6.方法不能嵌套。
7.同一个类中的方法,直接调用即可。
8.不同类中的方法调用,需要通过对象名调用。
递归
递归简单来说就是调用自己,每次调用时传入不同的变量。
递归能解决的问题:
1.各种数学问题:8皇后,汉诺塔,阶乘问题,迷宫问题,球和篮子编程问题。
2.各种算法也能用到递归: 比如快排,归并,二分查找,分治算法等。
3.将用栈解决的问题。
递归的重要规则:
1.新建一个方法时就,创建一个新的受保护的独立空间(栈空间)。
2.方法的局部变量是独立的,不会相互影响,比如n变量。
3.如果方法中使用的是引用类型变量(数组,对象)等。就会共享该引用类型的数据。
4.递归必须向退出递归的条件逼近,否则就会无限递归。
5.当一个方法执行完毕,或者遇到return,就会返回。遵守:谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。