Java学习笔记(四)------数组、排序、类与对象、递归

本文详细介绍了Java中的数组概念、不同类型数组的创建和操作,对象和类的使用,内存分配机制,以及递归的基本原理和应用,涵盖了排序、查找和递归解决的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

数组是一种引用类型,数组型数据是对象(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,就会返回。遵守:谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值