Java基础-学习笔记(三)

时间:2022-09-14 00:19:05

本节记录和学习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) //空判断