本节记录和学习Java的一种引用数据类型-数组,静态方法的声明,字符串的基本概念和使用:
1.数组(array):是具有相同数据元素的有序集合;
Java中的数组是引用数据类型,一个数组变量采用应用方式保存多个数组元素;
Java的数组都是动态数组,在生命数组变量之后,使用new运算符申请数组的存储空间;
2.基本数据类型和引用数据类型的区别:
1)从概念上说:
基本数据类型:变量名指向具体的数值;
引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值;
2)从内存构建方面来说:
基本数据类型:变量在声明之后,Java就会立刻分配给它内存空间;
引用数据类型:他以特殊的方式(类似C指针)指向对象实体(具体的值),这种变量声明时,不会分配内存,只是存储了一个内存地址;
3)从使用方面来说:
基本数据类型:使用时需要赋具体值,判断用“==”号;
引用数据类型:使用时可以赋null,判断时使用equals方法;
3.一维数组:
1)声明:int a[];//声明数组变量a,[]中没有长度,a没有获得内存空间;
2)使用new为数组分配空间:数组变量 = new 数组类型[长度];//长度必须大于零的正整数
a = new int[5];//为数组a分配空间,[]中指定数组长度
或结合起来写:int a[] = new int[5];
3)数组长度length:数组变量提供length属性表示数组占用的存储单元个数,使用‘.’运算符调用;
4)数组声明时赋初值:int a[] = {1,2,3,4,5};
5)数组的引用模型:
Java语言不支持指针类型,所以对数组的操作只能用下标;
Java的数组都是动态数组,并且是引用数据类型;
引用数据类型与基本数据类型的共同点在于都需要声明,都可赋值;
不同在于:存储单元的反配方式不同,两个变量之间的赋值也不同;
(1)基本数据类型变量的传值赋值:
基本数据类型的变量获得存储单元的方式是静态的,声明了变量就意味着,该变量占据了存储单元,变量保存数据值,两个变量之间赋值,传递的是值;
(2)数组变量的引用赋值:
引用数据类型的变量获得存储单元的方式都是动态的,必须使用new运算符申请并动态获取存储单元,引用变量保存地址,长度,引用计数等特性;
两个数组变量之间的赋值是引用赋值,传递地址等引用特性,没有申请新的存储空间;
6)使用关系运算符(==,!=)能判断两个数字变量是否引用了同一个数组;
7)通常程序不需要释放数组,Java将自动收回不再使用的数组占用的存储空间;
特殊需求时,可将数组变量赋值为null(引用数据类型空值),释放数组空间;
8)复制数组(System类提供的方法)
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
arraycopy将src数组从srcPos下标开始的length个元素复制到dest数组从destpos开始的若干个存储单元;
利:int a[] = {1,2,3,4,5},b[] = new int[5];
arraycopy(a,0,b,1,4);//结果:0,1,2,3,4
4.二维数组:
声明:
int mat[][];
mat = new int[2][3];或
int mat[][] = new int[2][3];或
int mat[][] = {{1,2,3},{4,5,6}};
5.不规则的二维数组:
由于Java的二维数组采用动态引用模型,二维数组mat中每个一维数组mat[0],mat[1]等是分散存储的,因此各一维数组mat[0],mat[1]等占用的存储空间,可以分多次申请,且长度可不相同;
例:int mat = [][];
mat = new int[2][];
mat[0] = new int[2];
mat[1] = new int[3];
6.静态方法:(下面只介绍静态方法,实例方法将在之后介绍)
Java语言没有全局函数,函数都声明在类中,称为成员方法(method):静态成员方法 和 实例成员方法;
1)方法声明:[修饰符] 返回值数据 方法([参数列表]){语句序列;[return [返回值]];}
其中<修饰符>指定方法的访问权限等特性,如关键字public声明公有方法,static声明静态方法;
static boolean isPrime(int k);//声明静态方法
Java不支持类之外的全程变量;
2)方法调用:必须指定方法名和实际参数,方法([参数列表]);
3)声明main方法:Java Application应用程序从main()方法开始执行,如果一个类包含main()方法,则该类可被Java虚拟机执行;
main方法必须声明如下:public static void main(String args[]);
其中,参数args是一个字符串数组,他接受命令行参数;
main方法能够调用该类方法中的其他静态方法,也可以通过对象调用实例成员方法;
main方法自己只能被Java虚拟机调用,不能被其他方法调用;
7.解决数据溢出的方法是:动态申请创建一个容量更大的数组并进行数组元素复制,int temp[] = new int[n];//n为变量
8.杨辉三角类实现举例:(说明了不规则二维数组的使用,也实践了静态方法的调用)
public class Yanghui{
public static int[][] yanghui(int n){
int mat[][] = new int[n][];
for(int i = 0 ;i<n ;i++){
mat[i] = new int[i+1];
mat[i][0] = 1;
mat[i][i] = 1;
for(int j = 0;j<i;j++){
mat[i][j] = mat[i-1][j-1] + mat[i-1][j];
}
}
return mat;
}
public static void main(String args[]){
yanghui(10);
}
}
9.方法重载:
一个类中如果有多个同名方法,但带有不同的参数列表,称为方法的重载(overload)
参数列表的不同指参数的数据类型 个数 次序 不同,不能以返回值区别;
Math中abs()方法返回一个数的绝对值;
虽然Math.abs()方法有多种声明形式,但都表示相同含义,这就是重载的价值所在,为一个功能提供多种实现形式;
10.递归方法:
1)递归定义:必须满足两个条件:
(1)边界条件:至少有一条初始定义是非递归的;
(2)递推通式:由已知的函数值逐步地推计算出未知函数值;
2)递归算法:存在间接或直接调用自身的算法;
11.字符串:(只介绍基本概念和使用方法)
字符串是字符的有限序列,Java的字符串String是一个类,属于引用数据类型;
String类的特殊之处在于它具有某些基本数据类型的特性:对字符串变量的操作和运算既可以像基本数据类型一样进行赋值、链接和关系运算,又可以像类的对象一样,通过调用类的方法执行Java定义的操作;
1)链接运算:
Java使用字符串链接运算“+”将两个字符串首位相连:str = "abc"+"xyz";
"+="定义为字符串变量在原串基础之上链接另一个字符串:str +="xyz";
注:只有“+=”能够用于字符串变量,其他复合赋值运算符均不能用于字符串变量,当字符串与其他类型值进行连接运算时,Java自动将其他类型值转换为字符串;
如 String str = "i = " + i;//不需要进行格式转换
2)字符串不是字符数组,这点与C/C++不同;
3)字符串的类特性:
int length();//返回字符串长度
boolean equals(Object obj);
char charAt(int index);
String subString(int begin);//返回序号从begin开始字符串至末尾的子串,begin从0开始
String subString(int begin,int end);//返回序号从begin开始至end - 1的子串
(1)调用String类中的方法:字符串变量.方法([参数列表])
(2)String的静态方法format()返回指定格式的字符串;
例:String.format("%4d",10);// %[参数索引$][宽度][.精度] 变换类型
注意:这个方法只是格式化,同C种的格式化输出是有区别的-不同加其他的字符串;
(3)if(str != null && str.length() > 0) //空判断