目录
一、基础任务
1.讨论“数据只要不是基本数据类型,那就是引用类型”是否正确。
这说法是正确的。在Java中,基本数据类型(如int、float、boolean等)是按值传递的,而其他非基本数据类型(对象、数组等)则是按引用传递。基本数据类型直接存储值,而引用类型存储的是对象的引用,即内存地址。
2.数组的创建有几种方式?
使用数组初始化器:int[] arr = {1, 2, 3}; 使用new关键字创建数组:int[] arr = new int[3]; 直接赋值给数组元素:int[] arr; arr = new int[]{1, 2, 3};
3.请代码举例数组的修改与查询操作,并讨论数组是否具备增删查操作的能力
int[] arr = {1, 2, 3, 4, 5}; // 查询操作 int value = arr[2]; // 获取索引为2的元素,value为3 // 修改操作 arr[1] = 10; // 将索引为1的元素修改为10 // 数组具备增删查操作的能力,但增删操作相对麻烦,需要手动移动元素,并且数组的大小是固定的,需要重新创建数组来实现动态增删。
3.请阐述数组有什么优点和弊端?
优点: 快速访问:可以通过索引直接访问数组元素,访问速度很快。 连续存储:数组中的元素在内存中是连续存储的,这有助于缓存性能。 弊端: 大小固定:数组的大小在创建时确定,无法动态改变,需要重新创建数组来实现大小的调整。 插入和删除困难:在数组中间插入或删除元素会涉及到移动其他元素,效率较低。
4.在同一个数组内是否可以放不同类型的数据?
在Java中,数组是同一类型元素的集合,所以在同一个数组内不能直接存放不同类型的数据。数组元素的类型是在创建数组时指定的,并且数组中所有元素必须属于该类型。
5.从内存的角度来讲,数组是随机存取结构吗?
是的,数组是随机存取结构。由于数组中的元素在内存中是连续存储的,可以通过索引直接计算元素的内存地址,实现快速随机访问。
6.参照数组,Arraylist在操作上有什么变化?
ArrayList是动态数组的实现,相比数组,ArrayList具有动态增长和缩减的能力,无需手动管理大小。它提供了一系列方法来方便地进行元素的增删改查操作。
7.数组和arraylist两者,哪个拥有size()方法?
ArrayList拥有size()方法,用于返回集合中元素的个数。而数组没有size()方法,需要通过数组的length属性获取数组的大小。
8.局部变量和成员变量(属性)区别是什么?
局部变量是在方法、构造方法或者语句块中声明的变量,其作用范围仅在声明的块内有效。 成员变量(属性)则是类中声明的变量,可以在整个类内使用,其生命周期与对象的生命周期相同。
9.方法的参数、返回值的作用是什么?
执行功能所需要的信息数据, 输出功能的结果 方法的参数用于接收调用者传递的数据,而返回值用于向调用者返回方法的执行结果。参数允许方法在执行时使用外部传入的数据,而返回值则允许方法将执行的结果传递给调用者。
10.形参与实参的区别是什么?
形参是方法定义时的参数,是变量的声明,用于接收调用者传递的实际参数。实参是调用方法时传递给方法的具体数值,是实际传递给方法的值。
11.如果方法无返回值,该如何声明?
void 修饰符后,方法名前
12.重载机制与参数有何关系?与返回值类型有关系吗?
与参数的数据类型,个数有关,与参数名无关。 没有关系 重载与参数列表有关,通过参数的个数、类型或者顺序来区分。 重载与返回值类型无关,只要参数列表不同即可。
二、进阶任务
13.给定数字序列:38,27,65,12,43,12,6,34,48,请用该数字序列演示冒泡排序以及快速排序算法(思路即可,无需代码)。
冒泡排序(Bubble Sort): 比较相邻元素: 从序列的第一个元素开始,比较相邻的两个元素。 交换位置: 如果顺序不对(即前面的元素大于后面的元素),则交换它们的位置。 一轮完成: 继续进行这样的比较和交换,直到整个序列都是有序的。 多轮迭代: 每一轮迭代都会把未排序部分的最大元素移动到最后。 快速排序(Quick Sort): 选择基准: 从数组中选择一个基准元素,通常是数组的中间元素。 分割数组: 将数组分为两个子数组,小于基准的放在左边,大于基准的放在右边。基准元素在最终排序中的位置就是它的最终位置。 递归排序: 递归地对左右子数组进行排序,重复上述步骤。 合并结果: 子数组排序完成后,整个数组就有序了。 对于给定的数字序列38,27,65,12,43,12,6,34,48: 冒泡排序过程: 第一轮:6,27,12,34,38,12,43,48,65 第二轮:6,12,12,27,34,38,43,48,65(43和48交换位置) 第三轮:6,12,12,27,34,38,43,48,65(没有交换,序列已经有序) 快速排序过程: 选择基准38,标记第一个位置为i,最后一个位置为j比较i,j标记的数,不是顺序就交换位置。先移动j , 遇到不符合就移动i。反之亦然。
直到i,j标记重合。此时第一轮循环结束,确定基准,分出俩个数组。前面的数组内容比基准小,后一个数组内容比基准大。再次递归这俩个数组。
14.辨析public与private修饰符,阐述在类、变量、方法中起到的作用?
- public:公共的,所有地方都可以访问。 - private:私有的,当前类可以访问。 1. public 修饰符: 在类中的作用: 当一个类被声明为 public,它可以被任何其他类访问,无论这个类是在同一包中还是在不同的包中。 类名必须与文件名相同,一个源文件中只能有一个 public 类。 在变量中的作用: 如果一个变量被声明为 public,它可以被任何类访问。在其他类中可以通过对象引用来访问该变量。 在方法中的作用: public 方法可以被任何类访问。 public 方法是一个类的接口,表示其他类可以通过该方法与该类进行交互。 2. private 修饰符: 在类中的作用: 当一个类被声明为 private,它只能被同一个类中的其他方法访问,不能被其他类直接访问。 通常用于隐藏实现细节,提供封装性。 在变量中的作用: 如果一个变量被声明为 private,它只能被同一个类中的其他方法访问,不能被其他类直接访问。 通常用于数据封装,通过提供公共方法来控制对变量的访问。 在方法中的作用: private 方法只能被同一个类中的其他方法调用,不能被其他类调用。 通常用于封装一些内部细节的实现,只在类内部使用。
15.数组会存在上溢和下溢的问题吗?
[上溢:空间已满,继续增数据。]
[下溢:空间已空,继续删数据。]
上溢:
- 描述:空间已满,继续增加数据。
- 对数组的判定:当数组已经被填满,但尝试继续向数组中添加更多数据时,将发生上溢。
下溢:
- 描述:空间已空,继续删除数据。
- 对数组的判定:当尝试从一个空数组中删除数据时,将发生下溢。
16.Arraylist会存在上溢和下溢的问题吗?
在Java中,ArrayList是基于数组实现的动态数组,因此它可以遇到上溢(Overflow)和下溢(Underflow)的问题,尽管ArrayList自身会尽量减小这些问题的发生。
17.main主函数和函数的区别是什么呢?
主函数是程序的入口 调用方式: main 函数: 由操作系统自动调用,程序启动时执行。 普通函数: 由程序中的其他代码显式调用。 返回值类型: main 函数: main 函数通常被定义为返回整数类型,用于向操作系统报告程序的执行状态。一般来说,返回0表示程序正常终止,而非零值表示程序异常终止。 普通函数: 普通函数可以有各种返回类型,包括整数、浮点数、对象等,具体取决于函数的定义。
18.描述一下栈区的方法调用过程。
在类加载后,主函数自动运行时进入栈区,在主函数运行中有调用其他方法,将其他方法根据调用顺序依次压栈。根据栈先进后出的原理,后调用的方法执行后,最后才执行完成主函数。保证程序一定不会中途结束,主函数执行完毕,程序运行结束。
19.Arrays与数组[]是一个概念吗?
Arrays是数组的工具类数组是一种数据结构
三、挑战任务
21.查阅资料了解什么是链表,了解链表和数组在增删改查上的区别?
链表(Linked List)和数组(Array)都是数据结构,用于存储和组织数据。它们在增删改查等操作上有一些重要的区别:
链表:
结构: 链表是由节点组成的数据结构,每个节点包含数据元素和指向下一个节点的指针。节点之间通过指针链接在一起。存储: 内存中的链表可以是分散的,每个节点可以存储在内存中的不同位置,通过指针连接起来。
大小: 链表的大小可以动态变化,不需要预先指定大小。每次插入新节点时,动态分配内存。
随机访问: 链表的访问是顺序的,不支持随机访问。要找到链表中的某个元素,需要从头节点开始逐个遍历。
增删操作: 链表在插入和删除操作上相对高效。插入和删除节点只需要调整相邻节点的指针,不需要移动大量元素。
数组:
结构: 数组是一种线性结构,元素在内存中是连续存储的,通过索引可以直接访问。存储: 数组的元素是在内存中连续存储的,这使得数组在一些操作上更为高效。
大小: 数组在创建时需要指定大小,且大小固定,不支持动态扩展。如果需要更大的数组,通常需要重新创建一个更大的数组,然后将数据复制过去。
随机访问: 数组支持随机访问,可以通过索引直接访问数组中的任何元素。
增删操作: 数组在插入和删除操作上相对低效。插入和删除元素可能需要移动大量元素,特别是在数组中间位置。
链表适用于需要频繁插入和删除操作的场景,而数组适用于需要频繁随机访问元素的场景。在实际应用中,根据具体的需求和操作模式选择合适的数据结构。
22.为什么通常情况是在方法体中使用异常?
错误隔离: 将可能引发异常的代码放在方法体中,可以有效地将错误隔离在特定的代码块中。这有助于提高代码的可维护性和可读性,因为异常处理代码与正常业务逻辑分离。
集中处理: 将异常处理代码放在方法体内使得异常处理可以集中在一个地方。这样,开发者可以更容易地管理和维护异常处理逻辑,而不必在整个程序中散落各处。
在方法体中使用异常,程序员可以更好地组织和管理代码,提高代码的可读性和可维护性,同时也使得程序对错误和异常的处理更为灵活和精确。
23.String是容器类
String是容器类,底层是字符数组
24.简述Arraylist的扩容机制。
ArrayList 的扩容机制简化为以下几个步骤: 初始容量: 初始时,ArrayList 创建一个长度为10的数组。 添加元素: 当添加元素时,如果当前元素个数达到数组容量,就触发扩容。 新容量计算: 计算新容量,通常为当前容量的1.5倍。 创建新数组: 创建一个新的更大的数组。 元素复制: 将原数组中的元素复制到新数组。 更新引用: ArrayList 更新内部引用,指向新数组。
25.简述Arraylist删除元素是否是容量大小会减少
在Java中,
ArrayList
是一个动态数组,它可以根据需要自动增长或缩小容量。当你从ArrayList
中删除元素时,并不会立即减少其容量。相反,ArrayList
会保留一定的额外容量,以便未来添加元素时不必每次都重新分配内存。